OOP와 스프링 프레임워크 | Layered Architecture와 DI Container

Faithful Dev·2025년 2월 17일

스프링 프레임워크

목록 보기
3/20

스프링(Spring) 프레임워크는 엔터프라이즈 애플리케이션 개발을 위한 강력한 프레임워크로, Layered Architecture(계층적 아키텍처)와 DI(Dependency Injection) Container를 핵심 개념으로 활용한다. 이 개념들은 SOLID 원칙과도 밀접한 관련이 있으며, 유지보수성과 확장성을 높이는 데 기여한다.


Layered Architecture(계층적 아키텍처)

스프링에서는 일반적으로 4계층 구조의 Layered Architecture를 따른다. 이는 관심사 분리를 통해 코드의 응집도를 높이고 결합도를 낮추는 구조이다.

계층별 역할

  1. Presentation Layer (UI 계층)
    • 사용자의 요청을 받아 처리하고 응답을 반환한다.
    • 보통 Controller가 이 계층에 해당한다.
    • 예: @Controller, @RestController
  2. Service Layer (서비스 계층)
    • 비즈니스 로직을 담당하는 계층이다.
    • 여러 Repository를 조합하여 필요한 데이터를 가공하거나 트랜잭션을 관리한다.
    • 예: @Service
  3. Repository Layer (데이터 접근 계층, DAO)
    • 데이터베이스와 직접적으로 상호작용하며 데이터를 저장하고 조회하는 역할을 한다.
    • 예: @Repository, JPA CrudRepository, JpaRepository
  4. Domain Layer (도메인 모델 계층)
    • 엔터티(Entity)와 도메인 객체를 정의한다.
    • 도메인 로직(비즈니스 규칙)을 포함할 수도 있다.
    • 예: @Entity, @ValueObject

Layered Architecture와 SOLID 원칙

  • SRP (단일 책임 원칙): 각 계층이 특정한 역할을 가지므로 하나의 계층이 여러 책임을 가지지 않도록 함.
  • OCP (개방-폐쇄 원칙): 새로운 기능을 추가할 때 기존 코드를 수정하지 않고 계층을 확장할 수 있음.
  • DIP (의존 역전 원칙): 상위 계층이 하위 계층의 구체적인 구현이 아닌 추상화에 의존하도록 설계됨.

DI (Dependency Injection) Container

스프링에서는 객체의 생명주기와 의존성을 관리하기 위해 DI 컨테이너(Dependency Injection Container)를 사용한다.

DI의 개념과 역할

DI(의존성 주입)이란, 객체가 직접 다른 객체를 생성하는 것이 아니라 외부에서 객체를 주입받아 사용하는 패턴을 의미한다. 이를 통해 결합도를 낮추고 유연성을 높인다.

DI 컨테이너의 역할

  • 객체를 생성하고 관리하며, 필요한 객체를 주입한다.
  • ApplicationContextBeanFactory가 대표적인 DI 컨테이너이다.

예제

@Service
public class UserService {
	private final UserRepository userRepository;
    
    @Autowired
    public UserService(UserRepository userRepository) {
    	this.userRepository = userRepository;
	}
}
  • UserServiceUserRepository를 직접 생성하지 않고 외부에서 주입받는다.
  • 이를 통해 UserServiceUserRepository의 구체적인 구현체에 의존하지 않으므로 DIP 원칙을 지킬 수 있다.

DI Container와 SOLID 원칙

  • SRP (단일 책임 원칙): 객체의 생성과 사용을 분리하여 관리함.
  • OCP (개방-폐쇄 원칙): 새로운 의존성을 추가할 때 기존 코드를 수정할 필요 없이 주입만 변경하면 됨.
  • DIP (의존 역전 원칙): 구현체가 아니라 인터페이스에 의존하도록 유도함.

Layered Architecture와 DI Container의 관계

  • Layered Architecture는 객체 간 역할을 분리하고, 각 계층 간 의존성을 최소화하는 데 도움을 준다.
  • DI Container는 각 계층 간의 의존성을 관리하고 객체 생성을 책임진다.
  • 두 개념이 결합되면, 애플리케이션의 유지보수성, 확장성, 테스트 용이성이 향상된다.

예를 들어, UserServiceUserRepository에 의존한다고 가정하다.

  • Layered Architecture를 사용하면, Service LayerRepository Layer에 의존하지만, 직접 구현체를 참조하지 않음.
  • DI Container가 User Repository의 구체적인 구현체를 주입해줌으로써 DIP 원칙을 지킬 수 있음.

정리

스프링에서 Layered Architecture는 관심사 분리를 통해 코드의 유지보수성을 높이고, DI Container는 객체의 생명주기를 관리하여 결합도를 낮춘다.
이 두 개념은 SOLID 원칙과도 밀접한 관련이 있으며, 특히 SRP, OCP, DIP 원칙을 강화하는 데 기여한다.

이러한 원칙들을 잘 지키면 확장성과 테스트 용이성이 높은 구조를 설계할 수 있다.

profile
Turning Vision into Reality.

0개의 댓글