[web] MVC 아키텍처

·2024년 12월 18일

just공부

목록 보기
10/41

웹 프로젝트를 진행하며 알아야 하는 개념 일부를 정리하는 블로그를 써보겠습니다.

1. MVC 아키텍처


Model-View-Controller 의 구성으로 이뤄진 소프트웨어 디자인 패턴 중 하나입니다.
애플리케이션을 Model, View, Controller의 세가지 구성 요소로 분리하여 관리하게 됩니다.

유지보수성을 높이고, 구성 요소를 분리하기 때문에 책임을 명확히 하여 효율적인 개발 과정이 진행되도록 합니다.

Model (모델)

애플리케이션의 데이터 구조와 비즈니스 로직을 관리합니다.
데이터베이스와 상호작용, 데이터 검증, 비즈니스 규칙 등을 담당합니다.

구성 요소

  • Domain : 비즈니스 엔티티를 표현하는 객체 (ex. User, Product)
  • DAO (Data Access Object) : 데이터베이스와의 CRUD(Create, Read, Update, Delete) 작업을 추상화하여 처리
  • Manager : 비즈니스 로직을 구현하고, 여러 DAO를 조합하여 작업을 수행

View (뷰)

사용자에게 데이터를 표시하고, 사용자로부터 입력을 받을 수 있는 UI를 제공합니다.

구성 요소

  • JSP, HTML, CSS, JavaScript : 사용자 인터페이스를 구성하는 기술
  • 템플릿 엔진 : 동적 콘텐츠를 렌더링 하기 위해 사용

Controller (컨트롤러)

사용자로부터의 요청을 받아 처리할 비즈니스 로직으로 전달하고, 적절한 뷰를 선택하여 응답을 생성합니다.

구성 요소

  • Servlet : HTTP 요청을 처리
  • DispatcherServlet : 모든 요청을 중앙에서 받아 적절한 컨트롤러로 분배하는 프론트 컨트롤러 역할을 주로 수행

2. 구성 요소의 관계성


Servlet

Java 기반 웹 애플리케이션에서 HTTP 요청을 처리하고, 응답을 생성하는 컴포넌트입니다.
주로 Controller의 일부로 간주됩니다.

상호 작용

  1. 클라이언트로부터 HTTP 요청을 수신
  2. 요청을 분석하여 적절한 비즈니스 로직을 호출
  3. 결과를 뷰로 전달하거나 다른 서블릿으로 포워딩

Controller

사용자 요청을 처리하고, 모델과 상호 작용하여 데이터를 준비하여 적절한 뷰로 전달합니다.

구성 요소

  • ForwardController : 특정 뷰로 요청을 포워딩하는 간단한 컨트롤러
  • RequestMapping : 특정 URL 패턴이나 HTTP 메서드에 따라 컨트롤러 메서드를 매핑하는 어노테이션 또는 설정

상호 작용

  1. DispatcherServlet 으로부터 요청을 받음
  2. RequestMapping을 통해 적절한 컨트롤러 메서드를 호출
  3. 비즈니스 로직을 처리하기 위해 Manager 또는 DAO와 상호 작용함

DispatcherServlet

모든 HTTP 요청을 중앙에서 받아 적절한 컨트롤러로 분배하는 프론트 컨트롤러 역할입니다.
Spring MVC와 같은 프레임워크에서 핵심적인 역할을 함
요청 흐름을 관리하고, 요청을 처리할 컨트롤러를 결정

상호 작용

  1. 클라이언트로부터 모든 HTTP 요청 수신
  2. RequestMapping 을 사용하여 요청을 처리할 적절한 컨트롤러를 찾음
  3. 컨트롤러의 결과를 받아 적절한 뷰로 포워딩

ForwardController

특정 요청을 단순히 다른 리소스로 포워딩하는 간단한 컨트롤러입니다.

상호 작용

  1. 요청을 받음
  2. 지정된 뷰로 포워딩

RequestMapping

특정 URL 패턴이나 HTTP 메서드에 따라 컨트롤러 메서드를 매핑하는 데 사용되는 어노테이션 또는 설정입니다.

  • 예시
  @Controller
public class UserController {  
    @RequestMapping(value = "/signup", method = RequestMethod.POST)
    public String handleSignup(User user) {
        // 비즈니스 로직 처리
        return "signupSuccess";
    }
} 

상호 작용

  1. DispatcherServlet이 요청을 받으면 RequestMapping을 통해 어떤 메서드가 요청을 처리할지 결정
  2. 매핑된 컨트롤러 메서드를 호출하여 요청을 처리

DAO (Data Access Object)

데이터베이스와의 상호 작용을 추상화하여 데이터 접근 로직을 관리합니다.
CRUD 작업을 수행하며, 데이터베이스 관련 변경이 있을 경우 DAO만 수정하면 됩니다.

상호작용

  1. Manager 또는 Controller 로부터 데이터 접근 요청을 받음
  2. 데이터베이스와의 연결을 통해 데이터를 조회, 삽입, 업데이트, 삭제
  3. 결과를 반환

예시

public class ProfessorDAO {
    public Professor findProfessorByEmail(String email) {
        // 데이터베이스에서 이메일로 교수 조회
    }
    
    public boolean createProfessor(Professor professor) {
        // 데이터베이스에 교수 생성
    }
}

Domain

애플리케이션의 비즈니스 엔티티를 표현하는 개체입니다. 주로 데이터베이스 테이블과 1:1로 매핑되며, 비즈니스 데이터를 캡슐화힙니다.

상호 작용

  1. DAO를 통해 데이터베이스로부터 데이터를 가져오거나 저장
  2. ControllerManager에서 비즈니스 로직을 처리할 때 사용

예시

  public class Professor {
    private int id;
    private String professorId;
    private String name;
    private String email;
    private String password;
    private String dept;
    private String professorOffice;
    private char deleted;
    private String createdAt;
    
    // Getters and Setters
 }

Manager

비즈니스 로직을 구현하는 계층입니다. 여러 DAO를 조합하여 복잡한 비즈니스 요구 사항을 처리합니다.

상호 작용

  1. Controller로부터 비즈니스 작업 요청을 받음
  2. 필요한 데이터를 DAO를 통해 조회하거나 조작
  3. 비즈니스 규칙에 따라 데이터를 처리하고 결과를 반환

예시

public class ProfessorSignupManager {
    private ProfessorDAO professorDAO;
    
    public ProfessorSignupManager() {
        this.professorDAO = new ProfessorDAO();
    }
    
    public boolean registerProfessor(Professor professor) {
        if(professorDAO.findProfessorByEmail(professor.getEmail()) != null) {
            return false; // 중복 이메일
        }
        // 비밀번호 해싱 및 기타 로직
        return professorDAO.createProfessor(professor);
    }
}

3. 아키텍처 다이어그램


[Client (Browser)]
       |
       v
[DispatcherServlet]
       |
       v
  [Controller] ----> [ForwardController]
       |                    |
       v                    v
   [Manager]           [View (JSP)]
       |
       v
     [DAO] <----> [Domain]
       |
       v
  [Database]
profile
Whatever I want | Interested in DFIR, Security, Infra, Cloud

0개의 댓글