계층화 패턴(Layered Pattern)은 아키텍처 패턴 중 하나로, 시스템을 여러 계층으로 나누어 각 계층이 특정 역할을 수행하도록 구조화하는 방식이다.
이 패턴은 유지보수와 확장성을 높이는 동시에, 시스템의 복잡도를 낮추는 데에 유리하다.
소프트웨어 시스템이 복잡해질수록 여러 기능이 한 곳에 집중되는 “스파게티 코드” 문제가 발생할 수 있다. 이를 방지하기 위해 계층화 패턴을 사용하여 시스템을 분리하고, 각 계층이 다음과 같은 역할을 수행하도록 설계할 수 있다:
이러한 구조적 분리는 소프트웨어 품질을 향상시키며, 계층화 패턴은 특히 대규모 애플리케이션에서 효과적이다.
일반적인 웹 애플리케이션의 경우, 클라이언트 요청이 데이터베이스에 직접 접근하는 것이 아니라, 여러 계층을 통해 흐르도록 설계된다.
Client → Presentation Layer → Business Layer → Persistence Layer → Database Layer
Presentation Layer
를 통해 요청을 보낸다.Presentation Layer
는 요청을 Business Layer
에 전달하여 로직을 처리한다.Business Layer
는 필요한 경우 Persistence Layer
에 데이터를 요청하거나 저장을 요청한다.Persistence Layer
는 Database Layer
와 상호작용하여 데이터를 처리한다.이번 예시에서는 “사용자 인증 시스템”을 계층화 패턴을 통해 구현해보자.
// Presentation Layer
class UserController {
private UserService userService;
public UserController(UserService userService) {
this.userService = userService;
}
public void login(String username, String password) {
boolean success = userService.authenticate(username, password);
if (success) {
System.out.println("로그인 성공");
} else {
System.out.println("로그인 실패");
}
}
}
// Business Layer
class UserService {
private UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public boolean authenticate(String username, String password) {
User user = userRepository.findByUsername(username);
return user != null && user.getPassword().equals(password);
}
}
// Persistence Layer
class UserRepository {
public User findByUsername(String username) {
// 여기서는 단순히 예시를 위해 고정된 사용자 데이터를 반환한다.
if ("user123".equals(username)) {
return new User(username, "password123");
}
return null;
}
}
// Database Layer
class User {
private String username;
private String password;
public User(String username, String password) {
this.username = username;
this.password = password;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
}
// 클라이언트 코드
public class Main {
public static void main(String[] args) {
UserRepository userRepository = new UserRepository();
UserService userService = new UserService(userRepository);
UserController userController = new UserController(userService);
userController.login("user123", "password123"); // 로그인 성공
userController.login("user123", "wrongPassword"); // 로그인 실패
}
}
UserController
는 사용자로부터 요청을 받아 UserService
로 전달한다.UserService
는 비즈니스 로직을 처리하며, 사용자 인증 기능을 수행한다.UserRepository
는 데이터베이스와 상호작용하는 역할을 수행하며, 사용자 데이터를 검색한다.User
클래스는 사용자 데이터를 저장하고 관리하는 역할을 한다.Main
클래스는 전체 계층을 조합하여 로그인 기능을 실행한다.로그인 성공
로그인 실패
계층화 패턴(Layered Pattern)은 시스템을 구조화하여 유지보수성을 높이고 역할을 분리하는 데 유용하다.
대규모 애플리케이션에서 각 계층의 역할을 명확히 하고, 독립적으로 관리할 수 있어 유리하다.
아래 글에서 다른 아키텍쳐 패턴들을 확인할 수 있다.
아키텍처 패턴 모음