스프링(Spring) 프레임워크는 엔터프라이즈 애플리케이션 개발을 위한 강력한 프레임워크로, Layered Architecture(계층적 아키텍처)와 DI(Dependency Injection) Container를 핵심 개념으로 활용한다. 이 개념들은 SOLID 원칙과도 밀접한 관련이 있으며, 유지보수성과 확장성을 높이는 데 기여한다.
스프링에서는 일반적으로 4계층 구조의 Layered Architecture를 따른다. 이는 관심사 분리를 통해 코드의 응집도를 높이고 결합도를 낮추는 구조이다.
Controller가 이 계층에 해당한다.@Controller, @RestController@Service@Repository, JPA CrudRepository, JpaRepository@Entity, @ValueObject스프링에서는 객체의 생명주기와 의존성을 관리하기 위해 DI 컨테이너(Dependency Injection Container)를 사용한다.
DI(의존성 주입)이란, 객체가 직접 다른 객체를 생성하는 것이 아니라 외부에서 객체를 주입받아 사용하는 패턴을 의미한다. 이를 통해 결합도를 낮추고 유연성을 높인다.
ApplicationContext나 BeanFactory가 대표적인 DI 컨테이너이다.@Service
public class UserService {
private final UserRepository userRepository;
@Autowired
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
UserService는 UserRepository를 직접 생성하지 않고 외부에서 주입받는다.UserService는 UserRepository의 구체적인 구현체에 의존하지 않으므로 DIP 원칙을 지킬 수 있다.예를 들어, UserService가 UserRepository에 의존한다고 가정하다.
Service Layer가 Repository Layer에 의존하지만, 직접 구현체를 참조하지 않음.User Repository의 구체적인 구현체를 주입해줌으로써 DIP 원칙을 지킬 수 있음.스프링에서 Layered Architecture는 관심사 분리를 통해 코드의 유지보수성을 높이고, DI Container는 객체의 생명주기를 관리하여 결합도를 낮춘다.
이 두 개념은 SOLID 원칙과도 밀접한 관련이 있으며, 특히 SRP, OCP, DIP 원칙을 강화하는 데 기여한다.
이러한 원칙들을 잘 지키면 확장성과 테스트 용이성이 높은 구조를 설계할 수 있다.