레이어드 아키텍쳐란?
소프트웨어의 구성 요소들을 서로 다른 레이어로 분리하여 각각의 역할과 책임을 부여하여 시스템을 구축하는 소프트웨어 아키텍처 패턴
사용자에게 뷰, 혹은 모델을 리턴하는 레이어. (화면 or 데이터)
Spring 에서는 controller 로 구현된다. @RestController 사용하면 (JPA) 뷰와 모델 전부 리턴 가능하다.
특정 URI를 호출하면 뷰나 데이터를 넘겨준다.
비즈니스 로직을 처리하는 레이어
Spring 에서는 service, 혹은 domain으로 구현된다.
데이터를 저장하고 관리하는 레이어로, 주로 데이터베이스와의 상호작용을 담당
Spring에서는 Repository(JPA) 혹은 DAO (redis DB 등의 접근) 로 구현된다. 혹은 JDBC Template, MyBatis등도 데이터 접근을 가능하게 한다.
@Service
@RequiredArgsConstructor
public class MyMovieServiceImpl implements MyMovieService {
private final MovieRepository movieRepository;
...
@Service
@RequiredArgsConstructor
public class MovieServiceImpl implements MovieService {
private final MovieRepository movieRepository;
...
복잡성: 레이어드 아키텍처는 레이어 간의 상호작용을 관리해야 하므로 약간의 복잡성을 동반할 수 있다.
성능 저하: 레이어드 아키텍처는 레이어 간의 추가적인 인터페이스와 통신을 필요로 하므로, 성능 저하의 가능성이 있다.
단방향 의존성: 레이어드 아키텍처는 각 레이어가 상위 레이어에게 의존하도록 설계되어 있기 때문에, 하위 레이어에서 상위 레이어로의 의존성이 존재
// Presentation Layer (UI)
public class UserController {
private UserService userService;
public UserController(UserService userService) {
// Presentation Layer가 UserService에 의존
this.userService = userService;
}
// ...
}
// Business Layer
public class UserService {
private UserRepository userRepository;
public UserService(UserRepository userRepository) {
// Business Layer가 UserRepository에 의존
this.userRepository = userRepository;
}
// ...
}
// Data Layer
public class UserRepository {
// Data Layer가 Database에 의존
public User getUserById(int userId) {
// 데이터베이스 조회 로직
}
// ...
}
레이어드 아키텍쳐가 위와 같이 설계되어 있으므로, 유연성 부족이나 단방향 의존성 등 단점이 존재하게 된다.
와.. 꿀 안빠네