Spring: 오브젝트와 의존관계
Spring: 오브젝트와 의존관계
“오브젝트는 혼자 살 수 없다.”
소프트웨어 설계의 핵심은 클래스를 잘 짜는 것이 아니라 오브젝트 사이의 ‘관계’ 를 어떻게 유연하게 맺어주느냐에 달려 있습니다.
1. 기본 용어 정리: 데이터 레이어의 구성 요소
| 용어 | 풀네임 | 핵심 역할 | 비유 |
|---|---|---|---|
| Entity | Entity | DB 테이블과 직접 매핑되는 도메인 모델 | 원본 서류 (비즈니스의 본질적인 데이터) |
| DTO | Data Transfer Object | 계층(Layer) 간 데이터 전송을 위한 객체 | 배송용 박스 (전달만을 위해 최적화됨) |
| DAO | Data Access Object | DB 작업(CRUD)을 전담하는 객체 | 창고 관리인 (DB 접근 로직의 분리) |
2. 제어의 역전 (IoC: Inversion of Control)
왜 필요한가? (관심사의 분리)
초기 UserDao는 다음 두 가지 관심사가 뒤섞여 있었습니다:
- 어떤 DB를 사용할 것인가
- 데이터를 어떻게 처리할 것인가
이 결합을 끊기 위해 제어권을 외부로 넘기는 것이 IoC의 핵심입니다.
PC 조립 비유
전통적 방식
→ “내가 필요한 부품은 내가 직접 설계하고 조립해서 만든다.”
→UserDao가 직접 DB 연결 객체 생성IoC 방식 (할리우드 원칙)
→ “Don’t call us, we’ll call you.”
→ 컨테이너가 모든 것을 관리
메인보드(Container)가 준비되어 있고 DAO는 그 슬롯에 끼워지기만 하면 됩니다.
3. 의존관계 주입 (DI: Dependency Injection)
DI 성립 조건 (토비의 스프링 기준)
- 코드 수준에서 클래스 간 관계가 드러나지 않음 (인터페이스 의존)
- 런타임 시점의 의존관계는 제3자가 결정
- 외부에서 객체를 주입 (Injection)
DAO 예제 (전략 패턴 적용)
1
2
3
4
5
6
7
8
9
10
11
12
13
public class UserDao {
private ConnectionMaker connectionMaker;
// 생성자 주입 (Constructor Injection)
public UserDao(ConnectionMaker connectionMaker) {
this.connectionMaker = connectionMaker;
}
public void add(User user) {
Connection c = connectionMaker.makeConnection();
// 비즈니스 로직 수행
}
}
핵심 포인트
UserDao는 더 이상 DB 종류를 모름- 인터페이스(
ConnectionMaker)에만 의존 - 구현체는 외부에서 주입됨
4. 의존관계 검색 (DL: Dependency Lookup)
개념
- DI: 수동적 (주입 받음)
- DL: 능동적 (직접 찾음)
코드 예시
1
UserDao userDao = context.getBean("userDao", UserDao.class);
비유
- DI → 배달 서비스
- DL → 직접 창고 가서 물건 찾기
사용 시점
- 스프링 관리 밖 객체
- 테스트 코드 엔트리 포인트
5. IoC/DI 설계의 장단점
| 구분 | 장점 (Pros) | 단점 (Cons) |
|---|---|---|
| 결합도 | 낮은 결합도 | 구조 복잡 증가 |
| 확장성 | OCP 준수 | 직관성 저하 |
| 테스트 | Mock 주입 가능 | 런타임 에러 가능 |
오늘의 회고
Insight: OCP (개방-폐쇄 원칙)
“확장에는 열려 있고 변경에는 닫혀 있어야 한다.”
DI 구조를 사용하면:
UserDao코드 변경 없이- DB 연결 방식만 교체 가능
유연성은 코드가 아니라 관계 설계에서 나온다
다짐
- 항상 다음을 고민한다:
- 이 클래스는 책임이 과도한가?
- 이 의존성을 외부로 분리할 수 있는가?
프레임워크 뒤에 숨겨진 제어권의 이동을 이해하는 개발자가 되자!
References
- 토비의 스프링 3.1 Vol. 1
- GoF 디자인 패턴
- 전략 패턴 (Strategy Pattern)
- 팩토리 메서드 패턴
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.