객체지향설계 5

Value Object vs Entity

1. 객체지향에서의 본질적인 구분1-1. 왜 두 개념이 필요한가? 소프트웨어 설계에서 모든 객체를 동일하게 취급하면, 코드가 복잡해지고 유지보수성이 떨어진다. 그래서 객체의 ‘역할’에 따라 개념적으로 구분하는 것이 중요하다. Value Object와 Entity의 구분은 바로 이 설계 명확성을 높이기 위한 핵심적인 전략이다. Value Object는 그 값 자체가 중요한 객체이고, Entity는 고유한 정체성을 가진 객체다. 동일한 데이터를 가진 두 객체라도, Value Object라면 하나로 취급되지만, Entity라면 각각 별개의 존재다. 이 구분이 없다면 동일성, 식별, 변경 추적 등의 이슈가 설계 전반에 영향을 미치게 된다. 이러한 구분은 단지 철학적 개념이 아니라, 모델링의 의도와 코딩 구현 ..

컴퓨터공학 2025.05.24

전략, 옵저버, 커맨드 패턴

1. 행동 패턴이 필요한 이유1-1. 생성과 구조만으로는 부족하다 객체지향 설계에는 생성(Creational), 구조(Structural), 행동(Behavioral)이라는 세 가지 패턴 분류가 있다. 대부분의 초보 설계자들은 생성과 구조 패턴에 집중하는 경향이 있다. 하지만 객체가 생성되고 관계가 설정된 후, 실제 동작 방식의 유연성을 확보하는 것이 진짜 설계의 완성이다. 행동 패턴은 객체 간의 협력과 메시지 흐름을 설계하는 데 초점을 맞춘다. 이는 단순한 로직 분리 수준을 넘어, 시간에 따라 변화하거나 전략적으로 대체 가능한 행동을 추상화하는 방식으로 시스템의 복잡성을 줄인다. 특히 사용자 인터페이스, 이벤트 처리, 명령 실행 등에서 매우 유용하게 활용된다. 행동 패턴이 없다면 모든 행동은 if-..

컴퓨터공학 2025.05.23

싱글턴과 DI 컨테이너 구조

1. 싱글턴 패턴의 본질과 한계1-1. 싱글턴은 왜 등장했을까? 객체지향 설계에서 싱글턴(Singleton)은 "클래스의 인스턴스를 단 하나만 생성하고, 어디서든 접근할 수 있도록 하는 패턴"이다. 이 패턴은 주로 다음 두 가지 상황에서 유용하다.애플리케이션 전체에서 공유 자원이 필요할 때하나의 인스턴스만 있어야 일관성을 유지할 수 있는 경우 예를 들어, 로그 기록기(Logger), 설정 객체(Config), DB 커넥션 풀(Connection Pool)처럼 애플리케이션 전체에서 동일한 인스턴스를 사용하는 것이 바람직한 경우 싱글턴이 사용되었다.public class Logger { private static final Logger instance = new Logger(); private L..

컴퓨터공학 2025.05.23

디자인 패턴 총정리

1. 디자인 패턴이란 무엇인가?1-1. 소프트웨어 설계의 재사용 가능한 해법 디자인 패턴은 단순한 코드 템플릿이 아니다. 그것은 반복되는 문제에 대해 검증된 해결책을 구조화한 설계 전략이다. 건축에서 ‘문을 여닫기 위한 구조’, ‘복층 구조를 위한 계단’ 등의 해법이 있는 것처럼, 소프트웨어에도 문제가 생겼을 때 ‘이럴 땐 이렇게 푼다’는 공통된 해결 틀이 필요하다. 이러한 해결 틀을 공식화한 것이 바로 디자인 패턴이다. 실무에서는 특정한 상황에서 “이걸 어떻게 풀지?”보다, “이 문제는 전략 패턴으로 풀 수 있어”라고 생각하는 것이 설계자 수준의 사고다. 이처럼 디자인 패턴은 단순 구현이 아니라 설계 관점의 레벨을 높이는 도구다.1-2. 패턴은 왜 중요한가? 디자인 패턴의 핵심 가치는 공통 언어와 설..

컴퓨터공학 2025.05.22

SRP vs OCP, 실제 적용 사례

1. 이론과 현실 사이의 간극1-1. SRP와 OCP는 언제 충돌하는가 SOLID 원칙은 객체지향 설계에서 이상적인 구조를 안내해주는 나침반 같은 존재다. 그러나 이상은 이상일 뿐, 실무에서는 그 원칙들이 충돌하거나 현실과 괴리되는 순간들이 적지 않다. 특히 SRP(단일 책임 원칙)과 OCP(개방-폐쇄 원칙)은 애초에 지향하는 방향 자체가 다르기 때문에 실제 개발 현장에서는 둘 사이의 갈등이 빈번히 발생한다. SRP는 책임을 명확하게 나누라고 하고, OCP는 기존 코드를 수정하지 말고 확장하라고 요구한다. 그런데 책임을 나누다 보면 단일 클래스가 너무 작아지고, 그 조합을 위한 코드가 중첩되며, 새로운 기능이 들어올 때마다 확장을 고려해야 하는 OCP와 상충하게 된다. 반대로, 확장을 위해 공통된 인터..

컴퓨터공학 2025.05.22