CS

Layered 패턴

셰욘 2025. 1. 8. 19:03
728x90

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