4계층 아키텍처 (4-Tier Architecture)
4계층 아키텍처는 애플리케이션을 논리적으로 분리된 네 개의 계층으로 구성하는 소프트웨어 설계 패턴입니다. 이 아키텍처는 관심사의 분리를 통해 유지보수성과 확장성을 향상시킵니다. 각 계층과 그 주요 요소들은 다음과 같습니다:
1. Presentation Layer (표현 계층)
- 주요 요소: View, Controller
- 역할: 사용자 인터페이스와 데이터 표현을 담당
2. Business Layer (비즈니스 계층)
- 주요 요소: Service, Domain Model
- 역할: 비즈니스 로직 처리 및 규칙 적용
3. Persistence Layer (영속성 계층)
- 주요 요소: Repository, DAO (Data Access Object)
- 역할: 데이터의 영속성 관리 및 데이터베이스 작업 처리
4. Database Layer (데이터베이스 계층)
- 주요 요소: 실제 데이터베이스 시스템 (예: MySQL, PostgreSQL)
- 역할: 데이터의 물리적 저장 및 관리
Service와 Repository 의존성 문제 해결
Service(고수준 모듈)가 Repository(저수준 모듈)에 직접 의존하는 문제는 의존성 역전 원칙(Dependency Inversion Principle, DIP)을 적용하여 해결할 수 있습니다. 주요 해결 방법은 다음과 같습니다:
1. 인터페이스 도입: Repository에 대한 인터페이스를 정의하고, Service는 이 인터페이스에 의존하도록 합니다
public interface UserRepository {
User findById(Long id);
void save(User user);
}
@Service
public class UserService {
private final UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
2. 의존성 주입: 구체적인 Repository 구현체는 외부에서 주입받도록 설계합니다
3. 추상화 계층 도입: Repository 패턴을 사용하여 데이터 접근 로직을 추상화합니다
4. Facade 패턴 적용: 복잡한 하위 시스템에 대한 단순화된 인터페이스를 제공하는 Facade 객체를 도입하여 의존성을 관리합니다
public class UserFacade {
private final UserRepository userRepository;
private final ProfileRepository profileRepository;
public UserFacade(UserRepository userRepository, ProfileRepository profileRepository) {
this.userRepository = userRepository;
this.profileRepository = profileRepository;
}
public UserProfileDto getUserProfile(Long userId) {
User user = userRepository.findById(userId);
Profile profile = profileRepository.findByUserId(userId);
return new UserProfileDto(user, profile);
}
}
이러한 접근 방식을 통해 고수준 모듈(Service)은 저수준 모듈(Repository)의 구체적인 구현에 의존하지 않고, 추상화된 인터페이스에 의존하게 됩니다. 이로써 시스템의 유연성과 테스트 용이성이 향상되며, 각 계층의 독립성이 보장됩니다
'System Architecture Patterns' 카테고리의 다른 글
[System Architecture Patterns] CQRS 패턴 (0) | 2025.02.14 |
---|