1. 객체를 조립하는 방법: 스프링의 DI 컨테이너
우리는 객체를 사용하면서 서로 연결해야 할 필요가 있습니다. 예를 들어, 서비스가 리포지토리를 사용하려면 직접 생성하거나 연결해야 합니다.
하지만 이런 의존 관계를 코드 안에서 직접 처리하면 OCP, DIP 원칙을 위반하게 됩니다.
그래서 등장한 개념이 바로 DI(Dependency Injection) 이며, 이걸 관리해주는 것이 스프링 컨테이너입니다.
2. DI 컨테이너의 역할
- 객체를 대신 생성하고
- 의존 관계를 외부에서 주입해줌
@Configuration
public class AppConfig {
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
@Bean
public MemberService memberService() {
return new MemberService(memberRepository());
}
}
- 클라이언트는 구현체를 몰라도 되고
- 역할만 의존하기 때문에 변경에 유연해짐
3. 인터페이스 우선 개발의 장점
- 구현체를 나중에 정할 수 있음 (DB, 외부 API 등)
- 테스트 코드 작성이 쉬움 (Mock 객체 주입)
- 코드 변경 시 파급 범위가 작아짐
스프링의 구조는 인터페이스 설계 → 구현체 개발 → DI 주입의 흐름을 따릅니다.
4. 스프링이 실현하는 객체 지향 설계
객체 지향 원칙스프링의 구현 방식
OCP | 새로운 구현체로 변경 시 클라이언트 수정 없음 |
DIP | 고수준 모듈(서비스)이 저수준 모듈(리포지토리)에 직접 의존하지 않음 |
SRP | 각 컴포넌트는 명확한 책임을 가짐 (Controller, Service, Repository) |
5. 결론
스프링은 단순히 기술적인 프레임워크가 아니라, 객체 지향 설계 철학을 실현해주는 도구입니다.
스프링을 잘 쓰기 위해선 프레임워크 자체보다도 객체 지향 원칙을 이해하는 것이 먼저입니다. 그리고 DI 컨테이너를 통해 그 원칙을 실현하면서 유연하고 확장 가능한 시스템을 만들 수 있습니다.
'Spring' 카테고리의 다른 글
[Spring 완전 정복 시리즈] 7편 - DIP/OCP 위반 구조의 문제점 (1) | 2025.07.26 |
---|---|
[Spring 완전 정복 시리즈] 6편 - 예제 만들기: 역할과 구현 분리의 시작 (1) | 2025.07.26 |
[Spring 완전 정복 시리즈] 4편 - 좋은 객체 지향 설계의 5가지 원칙 (SOLID) (0) | 2025.07.23 |
[Spring 완전 정복 시리즈] 3편 - 객체 지향 특징: 유연하고 변경에 강한 코드의 시작 (6) | 2025.07.23 |
[Spring 완전 정복 시리즈] 2편 - 스프링이란? (0) | 2025.07.23 |