Layered 패턴
애플리케이션을 기능별 계층(Layer)으로 나누어 설계하는 소프트웨어 설계 패턴
애플리케이션의 복잡성을 줄이고, 유지보수성과 재사용성을 높이는 데 유용하다.
주로 MVC 패턴과 함께 사용되며, 대규모 애플리케이션 개발에서 자주 사용된다.
장점
역할 분리
- 각 계층이 특정한 책임을 가지므로 유지보수성이 향상된다.
재사용성
- 동일한 비즈니스 로직이나 데이터 접근 코드
유연성
- 계층별로 독립적으로 변경 가능
Presentation Layer
- 사용자와 상호작용하는 계층
- 데이터를 화면에 표시하거나 사용자의 입력을 처리한다.
- JSP, HTML, JavaScript, React와 같은 UI 기술
Application Layer (Service Layer)
- 비즈니스 로직을 처리하는 계층
- Presentation Layer와 Domain Layer 간의 연결 역할
- Service 클래스
Domain Layer (Business Layer)
- 애플리케이션의 핵심 비즈니스 규칙과 로직을 포함
- 엔티티(Entity) 및 비즈니스 규칙 처리
- 데이터베이스와는 독립적이며, 순수한 비즈니스 로직에만 집중한다.
- User 클래스, Board 클래스
Persistence Layer (Data Access Layer)
- 데이터베이스와의 상호작용을 담당
- 데이터의 CRUD 작업을 처리한다.
- DAO 클래스
Infrastructure Layer
- 데이터베이스, 파일 시스템, 메시지 큐, 외부 API 등 시스템의 기술적 인프라를 처리
계층 간 흐름
로그인 기능으로 예시를 들어보았다.
1. Presentation Layer
- 사용자의 로그인 요청을 처리하고, 결과를 사용자에게 보여준다.
- 사용자가 아이디와 비밀번호를 입력 후 /login 으로 요청 -> Controller가 요청을 받음
더보기
UserController
@WebServlet("/login")
public class UserController extends HttpServlet {
private UserService userService = new UserService();
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
User user = userService.login(username, password); // Service 호출
if (user != null) {
// 로그인 성공
request.getSession().setAttribute("user", user);
response.sendRedirect("/home");
} else {
// 로그인 실패
request.setAttribute("error", "Invalid username or password");
request.getRequestDispatcher("/login.jsp").forward(request, response);
}
}
}
2. Application Layer (Service Layer)
- 비즈니스 로직을 수행하고, Persistence Layer와 연결
- Service가 Controller에서 받은 아이디와 비밀번호를 DAO에 전달한다.
더보기
UserService
public class UserService {
private UserDAO userDAO = new UserDAO();
public User login(String username, String password) {
User user = userDAO.findByUsername(username); // DAO 호출
if (user != null && user.getPassword().equals(password)) {
return user; // 로그인 성공
}
return null; // 로그인 실패
}
}
3. Domain Layer (Business Layer)
- 로그인에 필요한 데이터를 정의 (User 객체)
- DAO에서 가져온 데이터를 User 객체로 생성
더보기
User
public class User {
private String username;
private String password;
private String name;
// Getters and Setters
public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
public String getPassword() { return password; }
public void setPassword(String password) { this.password = password; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
}
4. Persistence Layer (Data Access Layer)
- 데이터베이스와 상호작용하여 사용자 정보를 조회
- Service로부터 전달 받은 아이디를 기반으로 데이터베이스에서 사용자 조회
더보기
UserDAO
public class UserDAO {
private Connection getConnection() throws SQLException {
return DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "password");
}
public User findByUsername(String username) {
User user = null;
String sql = "SELECT * FROM users WHERE username = ?";
try (Connection conn = getConnection();
PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setString(1, username);
try (ResultSet rs = stmt.executeQuery()) {
if (rs.next()) {
user = new User();
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
user.setName(rs.getString("name"));
}
}
} catch (SQLException e) {
e.printStackTrace();
}
return user;
}
}
5. Infrastructure Layer
- 데이터베이스 연결과 같은 기술적 인프라를 처리
- DAO에서 데이터베이스 연결을 요청
더보기
DBConnectionManager
public class DBConnectionManager {
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "password");
}
}
728x90
'CS' 카테고리의 다른 글
싱글톤 패턴을 구현하는 6가지 방법 (0) | 2025.01.08 |
---|---|
MVC 패턴 (0) | 2025.01.08 |
모니터링 환경 구성 (Prometheus, Grafana) / Grafana Dashboard 설정 (0) | 2024.12.06 |
[네트워크] TCP, UDP 프로토콜 / 3 Way Handshake (0) | 2024.12.02 |
[CS] 컴파일 언어 vs 인터프리터 언어 / 자바 / 자바 환경변수 설정 (0) | 2024.12.02 |