포스트

Spring: 오브젝트와 의존관계

Spring: 오브젝트와 의존관계

“오브젝트는 혼자 살 수 없다.”
소프트웨어 설계의 핵심은 클래스를 잘 짜는 것이 아니라 오브젝트 사이의 ‘관계’ 를 어떻게 유연하게 맺어주느냐에 달려 있습니다.


1. 기본 용어 정리: 데이터 레이어의 구성 요소

용어풀네임핵심 역할비유
EntityEntityDB 테이블과 직접 매핑되는 도메인 모델원본 서류 (비즈니스의 본질적인 데이터)
DTOData Transfer Object계층(Layer) 간 데이터 전송을 위한 객체배송용 박스 (전달만을 위해 최적화됨)
DAOData Access ObjectDB 작업(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 성립 조건 (토비의 스프링 기준)

  1. 코드 수준에서 클래스 간 관계가 드러나지 않음 (인터페이스 의존)
  2. 런타임 시점의 의존관계는 제3자가 결정
  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 라이센스를 따릅니다.