Booil Jung

견고한 소프트웨어 구축을 위한 개발자 안내서

소프트웨어 개발의 여정은 예측 불가능한 도전으로 가득 차 있다. 복잡한 요구사항, 촉박한 일정, 그리고 끊임없이 변화하는 기술 환경은 소프트웨어의 안정성을 위협하는 주요 요인이다. 특히 스레드와 같은 동시성 문제는 코드의 복잡성을 기하급수적으로 증가시키고, 시스템의 안정성을 저해하는 주범으로 꼽힌다. 이러한 험난한 과정 속에서 단순히 기능하는 코드를 넘어, 어떠한 역경 속에서도 안정적으로 동작하는 견고한(robust) 소프트웨어를 구축하는 것은 모든 개발자의 핵심 과제다. 이 안내서는 견고한 소프트웨어의 정의부터 시작하여, 그 취약성의 근원을 분석하고, 이를 극복하기 위한 구체적인 설계 원칙과 실전 프로그래밍 전략, 그리고 지속적인 품질 보증 체계 구축에 이르기까지, 개발자가 반드시 숙지해야 할 핵심 전략들을 체계적으로 제시한다.

견고한 소프트웨어에 대한 논의는 그 정의를 명확히 하는 것에서 시작해야 한다. IEEE 표준 610.12-1990에 따르면, 견고성(robustness)은 “유효하지 않은 입력이나 스트레스가 많은 환경 조건에서도 시스템이나 구성 요소가 올바르게 작동할 수 있는 정도”로 정의된다.1 이 정의는 견고함이 단순히 버그가 없는 상태를 넘어, 예측하지 못한 상황에 대한 시스템의 대응 능력을 의미함을 시사한다.

견고한 소프트웨어는 다음과 같은 핵심적인 특징을 갖추어야 한다.

이러한 기술적 특성은 단순히 잘 만들어진 소프트웨어를 넘어, 비즈니스의 성공과 직결된다. 견고한 소프트웨어는 장기적인 유지보수 비용을 절감하고 5, 사용자의 신뢰와 만족도를 높이며, 시스템의 수명을 연장시킨다.3 이는 제품의 미래 가치에 대한 핵심적인 투자다.

여기서 중요한 점은 견고성이 ‘예/아니오’로 결정되는 이분법적 상태가 아니라는 것이다. 표준 정의에서 ‘정도(degree)’라는 표현을 사용하듯이, 견고함은 연속적인 스펙트럼 위에 존재한다.1 모든 가능한 실패 지점을 예측하고 대비하는 것은 방대한 입력 조합 때문에 현실적으로 불가능하다.1 따라서 개발팀의 과제는 ‘완벽한 견고함’을 추구하는 것이 아니라, 시스템의 중요도와 비즈니스 요구사항에 맞는 ‘적절한 수준의 견고함’을 정의하고 달성하는 것이다. 예를 들어, 생명 유지 장치에 필요한 견고함의 수준은 단순한 마케팅 웹사이트의 그것과는 근본적으로 다르다. 이 전략적 결정은 이후의 모든 아키텍처 설계와 개발 과정의 방향을 결정짓는 나침반이 된다.

견고한 소프트웨어를 구축하기 위해서는 먼저 그것을 위협하는 적을 알아야 한다. 소프트웨어의 취약성은 주로 두 가지 근원, 즉 ‘복잡성’과 ‘기술 부채’에서 비롯된다.

소프트웨어의 복잡성은 버그와 취약성의 가장 큰 원인이다.6 기능이 추가되고 시스템 규모가 커짐에 따라 구성 요소 간의 상호작용과 의존성은 기하급수적으로 증가하며, 이는 ‘소프트웨어의 무분별한 확장(software sprawl)’으로 이어진다.7 이러한 복잡성은 문제의 본질에서 비롯되는 ‘본질적 복잡성’과 잘못된 설계, 잦은 요구사항 변경, 불필요한 디자인 패턴의 남용과 같은 ‘우발적 복잡성’으로 나뉜다.9 특히 낮은 가독성과 유지보수성은 복잡성을 인지하는 주요 원인이 되며, 복잡한 코드는 이해하고 수정하기 어려워 버그 발생 가능성을 높인다.9

‘기술 부채(Technical Debt)’는 워드 커닝햄이 만든 은유로, 더 나은 접근 방식 대신 당장의 편의를 위해 쉽지만 제한적인 해결책을 선택함으로써 발생하는 미래의 재작업 비용을 의미한다.11 촉박한 마감 기한, 불분명한 요구사항, 비즈니스의 압박 등은 숙련된 개발자조차 기술 부채를 만들게 하는 외부 요인이다.11 관리되지 않은 기술 부채는 눈덩이처럼 불어나 결국 개발 속도 저하, 유지보수 비용 증가, 품질 저하, 팀 사기 저하 등 심각한 결과를 초래한다.13 이는 압박이 지름길을 낳고, 지름길이 부채를 늘리며, 늘어난 부채가 개발 속도를 늦춰 다시 압박을 가중시키는 악순환을 만든다.15

모든 기술 부채가 나쁜 것은 아니다. 마틴 파울러는 기술 부채를 ‘신중함/무모함’과 ‘의도적/비의도적’이라는 두 축으로 나누어 네 가지 사분면으로 분류했다.16 이 프레임워크는 기술 부채를 단순한 엔지니어링 실패가 아닌, 전략적으로 활용할 수 있는 금융 도구로 재해석할 기회를 제공한다. 예를 들어, 시장 출시 기회를 잡기 위해 의도적으로 ‘신중하고 의도적인 부채’를 떠안는 것은 합리적인 비즈니스 결정일 수 있다.15 핵심은 부채의 존재를 인지하고, 그 ‘원금(수정 비용)’과 ‘이자(지속적인 생산성 저하)’를 비즈니스 이해관계자에게 명확히 설명하며, 체계적인 상환 계획을 수립하고 실행하는 것이다.12 기술 부채 관리는 재무 관리와 마찬가지로 목록화, 우선순위 지정, 상환 시간 할당 등 사전 예방적이고 전략적인 활동이 되어야 한다.

유형 (Type) 설명 (Description) 발생 시나리오 (Scenario Example)
신중하고 의도적인 (Prudent & Deliberate) 팀이 부채 발생을 인지하고, 더 빠른 출시와 같은 단기적 이익이 미래의 상환 비용보다 크다고 판단하여 전략적으로 내린 결정. “지금 당장 출시하고, 그에 따른 결과는 나중에 처리해야 한다.” 시장 출시 기한을 맞추기 위해 완벽하지 않은 설계를 채택하고, 추후 리팩토링 계획을 세우는 경우. 16
무모하고 의도적인 (Reckless & Deliberate) 팀이 좋은 설계 관행을 알면서도, 시간 부족 등을 이유로 의도적으로 ‘빠르고 지저분한(quick and dirty)’ 방식을 선택하는 경우. “설계할 시간이 없다.” 촉박한 마감 기한에 쫓겨 테스트나 문서화 없이 임시방편적인 코드를 작성하는 경우. 16
신중하되 의도하지 않은 (Prudent & Inadvertent) 팀이 최선을 다해 좋은 설계를 적용했지만, 프로젝트를 진행하며 학습을 통해 더 나은 설계 방식을 뒤늦게 깨닫게 되는 경우. “이제야 우리가 어떻게 했어야 하는지 알겠다.” 프로젝트 초기에는 최적이었던 설계가 시스템이 성장함에 따라 한계에 부딪혀 재설계가 필요해진 경우. 16
무모하고 의도하지 않은 (Reckless & Inadvertent) 팀이 좋은 설계 원칙에 대한 지식 부족으로, 자신들이 얼마나 큰 부채를 지고 있는지조차 인지하지 못하고 엉망인 코드를 작성하는 경우. “좋은 설계가 무엇인지 몰랐다.” 경험이 부족한 팀이 코드 중복, 높은 결합도 등 유지보수가 어려운 코드를 무의식적으로 양산하는 경우. 17

복잡성을 제어하고 기술 부채의 축적을 막기 위해서는 견고한 설계 원칙을 개발 과정의 근간으로 삼아야 한다. 이 원칙들은 코드의 구조를 체계화하고, 변경에 유연하게 대응하며, 유지보수를 용이하게 만드는 청사진을 제공한다.

로버트 C. 마틴이 정립한 SOLID 원칙은 현대 객체 지향 설계의 초석으로, 이해하기 쉽고 유연하며 유지보수하기 좋은 시스템을 만드는 것을 목표로 한다.19 이 원칙들의 핵심은 의존성을 체계적으로 관리하여, 한 영역의 변경이 다른 영역에 미치는 영향을 최소화하는 것이다.19

이 다섯 가지 원칙은 개별적으로 존재하지 않고, 의존성 관리를 위한 하나의 통일된 시스템으로 작동한다. SRP와 ISP는 응집력 있고 집중된 추상화(인터페이스)를 만드는 데 기여한다. OCP와 LSP는 이렇게 만들어진 추상화가 올바르게 사용되고 확장되도록 보장한다. 마지막으로 DIP는 모든 모듈이 이러한 잘 설계된 추상화를 통해 서로 연결되어야 한다는 거시적인 규칙을 제시한다. 한 원칙의 위반은 종종 다른 원칙의 위반으로 이어진다. 예를 들어, LSP를 위반하여 SquareRectangle의 하위 타입으로 만들면, 이를 사용하는 코드에서 if (obj instanceof Square)와 같은 분기 처리가 필요하게 되어 OCP를 위반하게 된다. 따라서 견고한 설계는 이 원칙들을 개별적으로 적용하는 것이 아니라, 의존성의 흐름을 제어하고 변경으로부터 각 구성 요소를 격리하는 통합된 체계로 이해하고 적용하는 데서 비롯된다.

SOLID 원칙이 구조적 견고함을 위한 뼈대라면, 이어지는 원칙들은 코드의 단순성과 명료성을 유지하여 가독성과 유지보수성을 높이는 살과 같다.

견고한 설계 원칙을 바탕으로, 실제 코드를 작성하는 단계에서 적용할 수 있는 구체적인 프로그래밍 전략을 숙지해야 한다. 이 전략들은 잠재적인 오류를 사전에 방지하고, 문제가 발생했을 때 시스템이 안정적으로 대처할 수 있도록 만드는 방패와 같다.

방어적 프로그래밍의 핵심 철학은 “최악의 상황을 가정하고 대비하라”는 것이다. 즉, 코드 실행 중에 오류가 발생할 수 있음을 전제로, 예상치 못한 입력이나 상황에서도 시스템이 안정적인 상태를 유지하도록 코드를 작성하는 기법이다.51 이는 외부로부터의 잘못된 데이터, 내부 로직의 버그, 그리고 사용자의 예측 불가능한 행동으로부터 코드를 보호하는 것을 목표로 한다.51

예외 처리는 방어적 프로그래밍의 핵심 요소로, 예측 가능한 오류 상황에 체계적으로 대응하는 메커니즘이다. 예외를 효과적으로 사용하는 것은 시스템의 안정성과 코드의 가독성을 크게 향상시킨다.

구분 (Category) Checked Exception Unchecked Exception (Runtime Exception)
컴파일 시점 확인 컴파일러가 예외 처리 여부를 강제적으로 확인한다. (try-catch 또는 throws 필요) 컴파일러가 예외 처리 여부를 확인하지 않는다.
상속 계층 java.lang.Exception의 하위 클래스이면서 RuntimeException의 하위가 아닌 클래스들. java.lang.RuntimeException의 하위 클래스들.
처리 방식 반드시 명시적으로 처리해야 한다. (복구 가능한 상황) 명시적으로 처리할 의무가 없다. (주로 프로그래밍 오류)
주요 사용 사례 프로그램 외부 요인으로 발생하는 예측 가능하고 복구 가능한 오류. (예: 네트워크, 파일 시스템 문제) 코드의 논리적 오류, 사전 조건 위반 등 개발자가 수정해야 할 버그.
대표 예시 IOException, SQLException, ClassNotFoundException NullPointerException, IllegalArgumentException, ArrayIndexOutOfBoundsException

멀티스레딩 환경은 소프트웨어의 성능을 극대화할 수 있는 강력한 도구지만, 동시에 코드의 복잡성을 폭발시키고 예측 불가능한 버그를 양산하는 주범이기도 하다. 견고한 동시성 프로그래밍을 위해서는 공유 자원에 대한 접근을 체계적으로 관리하고, 스레드 간의 상호작용을 안전하게 만드는 전략이 필수적이다.

동시성 프로그래밍에서 가장 흔하게 마주치는 두 가지 괴물은 ‘경쟁 상태’와 ‘교착 상태’다.

이러한 동시성 문제들을 해결하기 위한 전략들은 문제의 근원인 ‘공유된 가변 상태(Shared Mutable State)’를 어떻게 다루느냐에 따라 여러 추상화 수준으로 나눌 수 있다.

이 세 가지 전략은 동시성 문제를 해결하는 추상화의 사다리를 형성한다. 1단계인 수동 동기화는 개발자가 공유된 가변 상태를 직접 보호해야 하는 가장 낮은 수준의 접근법이다. 2단계인 불변 객체는 가변 상태 자체를 제거함으로써 문제의 발생 가능성을 원천 차단한다. 마지막으로 3단계인 액터 모델은 상태와 행위를 하나의 독립적인 단위로 캡슐화하고 통신 방식을 메시지 기반으로 전환함으로써, 개발자의 사고방식을 ‘데이터를 어떻게 보호할까?’에서 ‘독립된 개체들이 어떻게 소통할까?’로 전환시킨다. 견고한 시스템을 향한 여정은 이처럼 더 높은 수준의 추상화를 통해 특정 종류의 오류를 설계 단계에서부터 제거해 나가는 과정이라 할 수 있다.

전통적인 스레드 기반 동시성 모델의 복잡성을 해결하기 위한 대안으로, 많은 현대 프로그래밍 언어(C#, JavaScript, Python, Rust 등)는 async/await 구문을 도입했다. 이 모델은 스레드를 직접 다루지 않으면서도 논블로킹(non-blocking) 방식으로 동시성을 달성하는 강력하고 직관적인 방법을 제공한다.

구분 전통적 멀티스레딩 Async/Await
주요 목적 병렬성(Parallelism): 여러 CPU 코어에서 작업을 동시에 실행 동시성(Concurrency): 단일 스레드에서 여러 작업을 번갈아 가며 논블로킹 방식으로 처리
적합한 작업 CPU 바운드 작업 (계산 집약적) I/O 바운드 작업 (네트워크, DB, 파일 시스템)
자원 사용 스레드 생성 및 컨텍스트 스위칭 오버헤드가 큼 적은 수의 스레드로 많은 작업을 처리하여 자원 효율성이 높음
코드 복잡성 락, 뮤텍스 등 동기화 메커니즘을 직접 관리해야 하므로 복잡하고 오류 발생 가능성이 높음 동기 코드와 유사한 구조로 가독성이 높고 관리가 용이함
잠재적 위험 교착 상태, 경쟁 상태, 스레드 기아(starvation) 동기/비동기 혼용 시 교착 상태, 경쟁 상태

결론적으로, async/await는 스레드를 직접 다루는 복잡함 없이도 높은 확장성과 응답성을 달성할 수 있는 현대적인 동시성 프로그래밍 모델이다. 하지만 이것이 모든 동시성 문제를 해결하는 만병통치약은 아니며, 그 동작 원리와 잠재적인 함정을 정확히 이해하고 적절한 상황에 사용하는 것이 중요하다.

견고한 소프트웨어는 단 한 번의 완벽한 설계나 코딩으로 만들어지지 않는다. 개발 생명주기 전반에 걸쳐 품질을 지속적으로 측정하고 개선하는 체계적인 프로세스가 뒷받침되어야 한다. 자동화된 테스트, 정적 분석, 코드 리뷰, 그리고 리팩토링은 이러한 품질 보증 체계의 핵심 기둥이다.

마이크 콘과 마틴 파울러에 의해 대중화된 ‘테스트 피라미드’는 자동화된 테스트 스위트를 구성하는 전략적인 프레임워크다.86 이는 테스트의 종류를 세분화하고 각 종류별 테스트의 이상적인 비율을 제시하여, 빠르고 안정적이며 유지보수하기 쉬운 테스트 포트폴리오를 구축하도록 돕는다.87

자동화된 테스트가 코드의 ‘동작’을 검증한다면, 정적 분석과 코드 리뷰는 코드의 ‘구조’와 ‘품질’을 검증하는 중요한 활동이다.

도구 (Tool) 주요 초점 (Primary Focus) 분석 대상 (Analysis Target) 주요 특징 (Key Features)
Checkstyle 코딩 표준 및 스타일 가이드 준수 여부 검사 소스 코드 코드 포맷, 명명 규칙 등 일관된 코드 스타일을 강제하여 가독성을 높인다. 92
PMD 잠재적 버그, 비효율적인 코드, 중복 코드 등 ‘나쁜 관행’ 탐지 소스 코드 사용되지 않는 변수, 비어 있는 catch 블록, 불필요하게 복잡한 표현식 등을 찾아낸다. 92
SpotBugs (FindBugs) 널리 알려진 버그 패턴 및 잠재적 오류 탐지 바이트 코드 NullPointerException 발생 가능성, 리소스 누수, 잘못된 동기화 등 심각한 버그로 이어질 수 있는 패턴을 탐지한다. 92

이러한 품질 보증 활동들은 서로 독립적이지 않다. 오히려 강력한 상호 강화 피드백 루프를 형성한다. 정적 분석과 코드 리뷰는 리팩토링이 필요한 ‘코드 스멜’을 찾아낸다. 잘 갖춰진 자동화 테스트 스위트는 개발자가 안심하고 리팩토링을 수행할 수 있는 안전망을 제공한다. 그리고 성공적인 리팩토링은 코드의 설계를 개선하여 새로운 테스트를 작성하기 쉽게 만들고, 정적 분석 도구의 경고를 줄여준다. 이처럼 견고한 소프트웨어를 향한 길은 어느 한 가지 활동에만 의존하는 것이 아니라, 테스트, 분석, 개선이 끊임없이 순환하는 전체적인 품질 문화 생태계를 구축하는 데 있다. 이 생태계야말로 시간이 지나도 복잡성과 기술 부채에 잠식되지 않는, 진정으로 견고한 시스템을 지탱하는 힘이다.

  1. Robustness (computer science) - Wikipedia, accessed August 13, 2025, https://en.wikipedia.org/wiki/Robustness_(computer_science)
  2. Robustness of software - SAS Open Journals, accessed August 13, 2025, https://journals.sas.ac.uk/deeslr/article/download/5171/5036/9138
  3. What Does it Mean for Software to be Robust? by Dmitry Sky - Medium, accessed August 13, 2025, https://medium.com/@Sky_Hustle/what-does-it-mean-for-software-to-be-robust-319f4f26677b
  4. ACM Code of Ethics and Professional Conduct, accessed August 13, 2025, https://www.acm.org/code-of-ethics
  5. ‘빠르고 견고한’ 소프트웨어 구축(웹 개발)의 13가지 비밀 - 데브준, accessed August 13, 2025, https://devjun.net/%EB%B9%A0%EB%A5%B4%EA%B3%A0-%EA%B2%AC%EA%B3%A0%ED%95%9C-%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%EA%B5%AC%EC%B6%95%EC%9B%B9-%EA%B0%9C%EB%B0%9C%EC%9D%98-13%EA%B0%80%EC%A7%80-%EB%B9%84/
  6. Top causes why there are Bugs in Software by TestDel - Medium, accessed August 13, 2025, https://testdel.medium.com/top-causes-why-there-are-bugs-in-software-efd8c84998d1?source=post_internal_links———5—————————-
  7. 무분별한 소프트웨어 확장을 관리하는 방법 - Atlassian, accessed August 13, 2025, https://www.atlassian.com/ko/microservices/microservices-architecture/software-sprawl
  8. 교환 소프트웨어 복잡도 연구, accessed August 13, 2025, https://ettrends.etri.re.kr/ettrends/74/0905000324/17-2_049_060.pdf
  9. [코딩] 현대 소프트웨어 개발에서의 진정한 코드 복잡성 분석 및 관리 전략 - jiniya.net, accessed August 13, 2025, https://jiniya.net/2025/04/code-complexity/
  10. 소프트웨어 위기 - GeekNews, accessed August 13, 2025, https://news.hada.io/topic?id=15723
  11. 기술적 부채 - 나무위키, accessed August 13, 2025, https://namu.wiki/w/%EA%B8%B0%EC%88%A0%EC%A0%81%20%EB%B6%80%EC%B1%84
  12. 기술 부채 개념, 유형, 해결 방법 - GeekNews, accessed August 13, 2025, https://news.hada.io/topic?id=15552
  13. 웹 개발에서 기술 부채란 무엇입니까? - AppMaster, accessed August 13, 2025, https://appmaster.io/ko/blog/web-gaebalyi-gisuljeog-bucaeran-mueosibnigga
  14. Technical Debt: Definition + Management monday.com Blog, accessed August 13, 2025, https://monday.com/blog/rnd/technical-debt/
  15. What technical debt is Skylight Managing Technical Debt Guide, accessed August 13, 2025, https://skylight.digital/work/toolkits/managing-technical-debt/what-is-technical-debt/
  16. 기술 부채 어떻게 상환할까? - 인포그랩, accessed August 13, 2025, https://insight.infograb.net/blog/2024/06/05/technical-debt-return
  17. Technical Debt Quadrant - Martin Fowler, accessed August 13, 2025, https://martinfowler.com/bliki/TechnicalDebtQuadrant.html
  18. 기술 부채 신호 및 효과적으로 관리하는 방법 - Atlassian, accessed August 13, 2025, https://www.atlassian.com/ko/agile/software-development/technical-debt
  19. SOLID Principles in Object Oriented Design – BMC Software Blogs, accessed August 13, 2025, https://www.bmc.com/blogs/solid-design-principles/
  20. SOLID - Wikipedia, accessed August 13, 2025, https://en.wikipedia.org/wiki/SOLID
  21. [OOP] SOLID 원칙1 - SRP (Single Responsibility Principle) by dEpayse - Medium, accessed August 13, 2025, https://cbs5295.medium.com/oop-solid-%EC%9B%90%EC%B9%991-srp-single-responsibility-principle-733f418ca5d
  22. [SOLID] 단일 책임 원칙 (SRP) - velog, accessed August 13, 2025, https://velog.io/@qjqdn1568/SOLID-%EB%8B%A8%EC%9D%BC-%EC%B1%85%EC%9E%84-%EC%9B%90%EC%B9%99-SRP
  23. 완벽하게 이해하는 SRP (단일 책임 원칙) - Inpa Dev ‍ - 티스토리, accessed August 13, 2025, https://inpa.tistory.com/entry/OOP-%F0%9F%92%A0-%EC%95%84%EC%A3%BC-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EB%8A%94-SRP-%EB%8B%A8%EC%9D%BC-%EC%B1%85%EC%9E%84-%EC%9B%90%EC%B9%99
  24. 단일 책임 원칙(SRP), accessed August 13, 2025, https://jaeseongdev.github.io/development/2021/02/14/%EB%8B%A8%EC%9D%BC_%EC%B1%85%EC%9E%84_%EC%9B%90%EC%B9%99_SRP/
  25. [OOP] 개방 폐쇄 원칙(OCP: Open Closed Principle) 개념 및 예제, accessed August 13, 2025, https://ittrue.tistory.com/544
  26. 개방 폐쇄 원칙(OCP) - velog, accessed August 13, 2025, https://velog.io/@destiny1616/%EA%B0%9C%EB%B0%A9-%ED%8F%90%EC%87%84-%EC%9B%90%EC%B9%99OCP
  27. [OOP] 객체지향 5원칙(SOLID) - 개방-폐쇄 원칙 OCP (Open-Closed Principle) 𝝅번째 알파카의 개발 낙서장, accessed August 13, 2025, https://blog.itcode.dev/posts/2021/08/14/open-closed-principle
  28. 예시로 이해하는 리스코프 치환 원칙(LSP) - 짜잔비빔 - 티스토리, accessed August 13, 2025, https://flowingmooon.tistory.com/32
  29. 리스코프 치환 원칙 - 위키백과, 우리 모두의 백과사전, accessed August 13, 2025, https://ko.wikipedia.org/wiki/%EB%A6%AC%EC%8A%A4%EC%BD%94%ED%94%84%EC%B9%98%ED%99%98%EC%9B%90%EC%B9%99
  30. [OOP] 인터페이스 분리 원칙(ISP: Interface Segregation Principle …, accessed August 13, 2025, https://ittrue.tistory.com/548
  31. [OOP] 객체지향 5대 원칙(SOLID) - 인터페이스 분리 원칙 (ISP) - velog, accessed August 13, 2025, https://velog.io/@harinnnnn/OOP-%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-5%EB%8C%80-%EC%9B%90%EC%B9%99SOLID-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4-%EB%B6%84%EB%A6%AC-%EC%9B%90%EC%B9%99-ISP
  32. [SOLID] 인터페이스 분리 원칙 (Interface Segregation Principle, ISP) - velog, accessed August 13, 2025, https://velog.io/@ensmart/202406071214
  33. 의존성 역전 원칙(Dependency Inversion Principle, DIP) - 개발 일기 - 티스토리, accessed August 13, 2025, https://dev-hui.tistory.com/49
  34. 스프링 부트 모듈 계층간 의존성 역전시키기 - velog, accessed August 13, 2025, https://velog.io/@jonghyun3668/%EB%AA%A8%EB%93%88-%EA%B3%84%EC%B8%B5%EA%B0%84-%EC%9D%98%EC%A1%B4%EC%84%B1-%EC%97%AD%EC%A0%84%EC%8B%9C%ED%82%A4%EA%B8%B0
  35. [OOP] 의존성 역전 원칙(DIP: Dependency Inversion Principle) 개념 …, accessed August 13, 2025, https://ittrue.tistory.com/549
  36. [Spring] 의존성 역전 원칙(Dependency Inversion Principle, DIP)을 적용하는 방법, accessed August 13, 2025, https://jjangadadcodingdiary.tistory.com/entry/Spring-%EC%9D%98%EC%A1%B4%EC%84%B1-%EC%97%AD%EC%A0%84-%EC%9B%90%EC%B9%99Dependency-Inversion-Principle-DIP%EC%9D%84-%EC%A0%81%EC%9A%A9%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95
    1. The IoC container - Spring, accessed August 13, 2025, https://docs.spring.io/spring-framework/docs/3.2.x/spring-framework-reference/html/beans.html
  37. Dependency Inversion Principle (DIP) with Spring Framework - DEV Community, accessed August 13, 2025, https://dev.to/gridou/dependency-inversion-principle-dip-with-spring-framework-26i8
  38. DRY 원칙 - 기계인간 John Grib, accessed August 13, 2025, https://johngrib.github.io/wiki/jargon/dry-principle/
  39. 소프트웨어 개발의 3개의 KEY 원칙 : KISS,YAGNI,DRY, accessed August 13, 2025, https://hongjinhyeon.tistory.com/136
  40. [Software] DRY원칙이란?(Don’t Repeat Yourself) - kim.dragon - 티스토리, accessed August 13, 2025, https://kim-dragon.tistory.com/256
  41. 소프트웨어 개발 원칙들 모음, accessed August 13, 2025, https://code-boki.tistory.com/89
  42. KISS 원칙 : r/dotnet - Reddit, accessed August 13, 2025, https://www.reddit.com/r/dotnet/comments/1384rhy/kiss_principle/?tl=ko
  43. [IT] 모든 소프트웨어 개발자가 알아야 할 10가지 프로그래밍 원칙 - 수니의 개발새발, accessed August 13, 2025, https://sunidev.tistory.com/90
  44. Software Design Principles (Basics) DRY, YAGNI, KISS, etc - workat.tech, accessed August 13, 2025, https://workat.tech/machine-coding/tutorial/software-design-principles-dry-yagni-eytrxfhz1fla
  45. [ 개인공부 ] 코드설계원칙, KISS 원칙에 관하여, accessed August 13, 2025, https://sykeem.tistory.com/entry/%EA%B0%9C%EC%9D%B8%EA%B3%B5%EB%B6%80-%EC%BD%94%EB%93%9C%EC%84%A4%EA%B3%84%EC%9B%90%EC%B9%99-KISS-%EC%9B%90%EC%B9%99%EC%97%90-%EA%B4%80%ED%95%98%EC%97%AC
  46. 게임 프로그래밍 패턴으로 코드 작성 스킬 업그레이드하기 - Unity, accessed August 13, 2025, https://unity.com/kr/blog/games/level-up-your-code-with-game-programming-patterns
  47. You aren’t gonna need it - Wikipedia, accessed August 13, 2025, https://en.wikipedia.org/wiki/You_aren%27t_gonna_need_it
  48. YAGNI: You Ain’t Gonna Need It - Better Programming, accessed August 13, 2025, https://betterprogramming.pub/yagni-you-aint-gonna-need-it-f9a178cd8e1
  49. “YAGNI” is a good principle, but many devs miss the point and conflate it with being anti-abstraction. - Reddit, accessed August 13, 2025, https://www.reddit.com/r/ExperiencedDevs/comments/11vonwg/yagni_is_a_good_principle_but_many_devs_miss_the/
  50. 방어적 프로그래밍 - 위키백과, 우리 모두의 백과사전, accessed August 13, 2025, https://ko.wikipedia.org/wiki/%EB%B0%A9%EC%96%B4%EC%A0%81_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D
  51. 방어적 프로그래밍(Defensive programming), 방어 코딩(defensive coding) - 걷고 나니 길, accessed August 13, 2025, https://a-road-after-walking.tistory.com/54
  52. (PDF) Robust Programming by Example - ResearchGate, accessed August 13, 2025, https://www.researchgate.net/publication/268422674_Robust_Programming_by_Example
  53. 방어적 프로그래밍 - 과학을 이해하는 개발자 - 티스토리, accessed August 13, 2025, https://taepcsiandwe.tistory.com/entry/%EB%B0%A9%EC%96%B4%EC%A0%81-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D
  54. Best Practices and Pitfalls in Java Exception Handling - DEV Community, accessed August 13, 2025, https://dev.to/saurabhkurve/best-practices-and-pitfalls-in-java-exception-handling-37dk
  55. Effective Java - 3rd Edition - Exceptions – Ahmed DAMMAK, accessed August 13, 2025, https://ahdak.github.io/blog/effective-java-part-9/
  56. How to Handle Checked & Unchecked Exceptions in Java - Rollbar, accessed August 13, 2025, https://rollbar.com/blog/how-to-handle-checked-unchecked-exceptions-in-java/
  57. Java Checked vs Unchecked Exceptions - GeeksforGeeks, accessed August 13, 2025, https://www.geeksforgeeks.org/java/java-checked-vs-unchecked-exceptions/
  58. The Difference between Checked and Unchecked Exceptions in Java for Beginners, accessed August 13, 2025, https://medium.com/@AlexanderObregon/the-difference-between-checked-and-unchecked-exceptions-in-java-for-beginners-c3943786c40a
  59. Java Exception handling best practices - The Server Side, accessed August 13, 2025, https://www.theserverside.com/blog/Coffee-Talk-Java-News-Stories-and-Opinions/Java-Exception-handling-best-practices
  60. 5 Great Resources for Exception Handling Best Practices in Java - Github-Gist, accessed August 13, 2025, https://gist.github.com/raineorshine/5521119
  61. The try-with-resources Statement, accessed August 13, 2025, https://docs.oracle.com/javase/8/docs/technotes/guides/language/try-with-resources.html
  62. Try-with-resources Feature in Java - GeeksforGeeks, accessed August 13, 2025, https://www.geeksforgeeks.org/java/try-with-resources-feature-in-java/
  63. ERR54-J. Use a try-with-resources statement to safely handle closeable - Confluence, accessed August 13, 2025, https://wiki.sei.cmu.edu/confluence/display/java/ERR54-J.+Use+a+try-with-resources+statement+to+safely+handle+closeable+resources
  64. multithreading - What is a race condition? - Stack Overflow, accessed August 13, 2025, https://stackoverflow.com/questions/34510/what-is-a-race-condition
  65. What Is a Race Condition? Baeldung on Computer Science, accessed August 13, 2025, https://www.baeldung.com/cs/race-conditions
  66. Race Conditions and Critical Sections - Jenkov.com, accessed August 13, 2025, https://jenkov.com/tutorials/java-concurrency/race-conditions-and-critical-sections.html
  67. Race Conditions - GeeksforGeeks, accessed August 13, 2025, https://www.geeksforgeeks.org/java/race-conditions/
  68. Deadlock (computer science) - Wikipedia, accessed August 13, 2025, https://en.wikipedia.org/wiki/Deadlock_(computer_science)
  69. Deadlock in OS: Necessary Conditions and Examples - The Knowledge Academy, accessed August 13, 2025, https://www.theknowledgeacademy.com/blog/deadlock-in-os/
  70. Introduction to Deadlock in Operating Systems - Tutorialspoint, accessed August 13, 2025, https://www.tutorialspoint.com/operating_system/introduction_to_deadlock_in_operating_system.htm
  71. Deadlock in OS- Scaler Topics, accessed August 13, 2025, https://www.scaler.com/topics/operating-system/deadlock-in-os/
  72. Synchronization in Java - GeeksforGeeks, accessed August 13, 2025, https://www.geeksforgeeks.org/java/synchronization-in-java/
  73. Java Concurrency: Synchronization and Multithreading - j-labs, accessed August 13, 2025, https://www.j-labs.pl/en/tech-blog/java-concurrency-synchronization-and-multithreading/
  74. Synchronized Methods - Essential Java Classes, accessed August 13, 2025, https://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html
  75. Guide to the Synchronized Keyword in Java Baeldung, accessed August 13, 2025, https://www.baeldung.com/java-synchronized
  76. Immutable object - Wikipedia, accessed August 13, 2025, https://en.wikipedia.org/wiki/Immutable_object
  77. Immutable Objects (The Java™ Tutorials > Essential Java Classes …, accessed August 13, 2025, https://docs.oracle.com/javase/tutorial/essential/concurrency/immutable.html
  78. Actor model - Wikipedia, accessed August 13, 2025, https://en.wikipedia.org/wiki/Actor_model
  79. Actor model for concurrent systems, an introduction in GO by JC - Medium, accessed August 13, 2025, https://medium.com/@joao_vaz/actor-model-for-concurrent-systems-an-introduction-in-go-75fd25f2f04e
  80. The Actor model - Stately.ai, accessed August 13, 2025, https://stately.ai/docs/actor-model
  81. 5.4 Actor-based Concurrency, accessed August 13, 2025, https://berb.github.io/diploma-thesis/original/054_actors.html
  82. Understanding the Actor Design Pattern: A Practical Guide to Build Actor Systems with Akka in Java by mohammed alaa Medium, accessed August 13, 2025, https://medium.com/@m.elqrwash/understanding-the-actor-design-pattern-a-practical-guide-to-building-actor-systems-with-akka-in-9ffda751deba
  83. Actor Model in Nutshell - Medium, accessed August 13, 2025, https://medium.com/@KtheAgent/actor-model-in-nutshell-d13c0f81c8c7
  84. Actor model vs sharing Arc
  85. End-to-end testing: A complete guide - Qase, accessed August 13, 2025, https://qase.io/blog/end-to-end-testing/
  86. The Practical Test Pyramid - Martin Fowler, accessed August 13, 2025, https://martinfowler.com/articles/practical-test-pyramid.html
  87. The Software Testing Pyramid: A Comprehensive Guide for Agile Teams - aqua cloud, accessed August 13, 2025, https://aqua-cloud.io/software-testing-pyramid/
  88. Contract Testing Vs Integration Testing - Pactflow, accessed August 13, 2025, https://pactflow.io/blog/contract-testing-vs-integration-testing/
  89. Integration Test - Martin Fowler, accessed August 13, 2025, https://martinfowler.com/bliki/IntegrationTest.html
  90. What Is the Test Automation Pyramid? - Cprime, accessed August 13, 2025, https://www.cprime.com/resources/blog/what-is-the-test-automation-pyramid/
  91. Comparison of Static Code … - Software Engineering Candies, accessed August 13, 2025, https://www.sw-engineering-candies.com/blog-1/comparison-of-findbugs-pmd-and-checkstyle
  92. Checkstyle 11.0.0 – checkstyle, accessed August 13, 2025, https://checkstyle.sourceforge.io/
  93. Java static code analysis tools - GitHub, accessed August 13, 2025, https://github.com/checkstyle/checkstyle/wiki/Java-static-code-analysis-tools
  94. The Standard of Code Review eng-practices - Google, accessed August 13, 2025, https://google.github.io/eng-practices/review/reviewer/standard.html
  95. Code Review Developer Guide by Google - Slab Library, accessed August 13, 2025, https://slab.com/library/templates/google-code-review/
  96. Code review process Blockly - Google for Developers, accessed August 13, 2025, https://developers.google.com/blockly/guides/contribute/get-started/pr_review_process
  97. Refactoring: Improving the Design of Existing Code - Martin Fowler, Kent Beck - Google Books, accessed August 13, 2025, https://books.google.com/books/about/Refactoring.html?id=1MsETFPD3I0C
  98. Refactoring - Martin Fowler, accessed August 13, 2025, https://martinfowler.com/books/refactoring.html
  99. Catalog of Refactorings, accessed August 13, 2025, https://refactoring.com/catalog/