Spring MVC와 3-Layered 아키텍처

Park sang woo·2024년 3월 26일

📓 Spring MVC

🏷️ Front Controller

URL에 알맞은 Controller를 찾아(HandlerMapping) 호출(HandlerAdapter) 역할을 한다.
Controller는 View name 및 Model을 반환한다.
View name에 알맞은 View Template을 찾아서 Model과 결합하여 View를 생성한다.

핸들러는 DispatcherServlet으로 받은 요청을 Controller로 보내지는데 이 요청이 어떤 룰으로 컨트롤러에 보내는지(매핑하는지), 그 방법을 정해주는 클래스이다.

핸들러 매핑
Dispatcher Servlet이 요청 URI가 어떤 핸들러와 매핑되는지 찾는 과정이다.
핸들러 매핑은 결국 요청과 알맞는 핸들러 객체를 Dispatcher Servlet에 리턴한다.

핸들러 어댑터
핸들러 매핑에서 리턴받은 핸들러 객체를 가지고 이에 맞는 어댑터를 찾는 과정이다. 어댑터란 2개 이상의 인터페이스에 스펙이 맞지 않을 때 중간에 이 스펙을 맞도록 변환해주는 역할을 하는 객체이다.

뷰 리졸버
View를 어떤 것을 사용할 지 설정을 할 수 있도록 해주는 역할로 실행할 뷰를 찾는다.



Front Controller 적용된 Servlet : Spring 시절
DispatcherServlet이 MVC의 핵심이다. DispatcherServlet도 부모 클래스에서 HttpServlet을 상속 받아서 사용하고 서블릿으로 동작한다.

상속관계 : DispatcherServlet -> FrameworkSevlet -> HttpServletBean -> HttpServlet

스프링은 이미 필요한 핸들러 매핑과 핸들러 어댑터를 대부분 구현해두었다. 개발자가 직접
핸들러 매핑과 핸들러 어댑터를 만드는 일은 거의 없다.


Spring MVC 구조의 동작 순서, 각각의 역할 등은 여기 사이트를 통해 확인.
🔗 https://velog.io/@lusate/Spring-MVC






📓 3-Layered 아키텍처

애플리케이션의 컴포넌트를 유사 관심사를 기주능로 에이어로 묶어 수평적으로 구성한 구조다.

🏷️ 프레젠테이션 계층

애플리케이션의 최상단 계층으로 클라이언트의 요청을 해석하고 응답하는 역할을 한다.
비즈니스 계층으로 요청을 위임하고 받은 결과를 응답하는 역할만 수행.
MVC 아키텍처 패턴이 이 계층에 해당됨.


🏷️ 비즈니스 계층

서비스 부분에 해당됨. 핵심 비즈니스 구현에만 신경쓰도록 함. 트랜잭션 처리나 유효성 검사 등의 작업도 수행.
애플리케이션이 제공하는 기능을 정의하고 세부 작업을 수행하는 도메인 객체를 통해 업무를 위임하는 역할을 수행.


🏷️ 데이터 접근 계층

DB에 접근하는 일련의 작업을 수행.
DAO의 역할을 Spring Data JPA에서는 Repository가 수행하기 때문에 이것으로 대체.

DAO와 Repository 다른 점.
이 둘은 거의 같다고 해도 무방하다. 깊이 있게 차이를 보자면 Repository는 엔티티 객체를 보관하고 관리하는 저장소고, DAO는 데이터에 접근하도록 DB 접근 관련 로직을 모아둔 객체이다.

DB 에 직결된 CRUD 함수 (구현체는 EntityManager 통해 수행)

public interface UserDao {
    void create(User user);
    User read(Long id);
    void update(User user);
    void delete(String userName);
}

필요한 함수만 쓰기 CRUD 중 R 만 쓸수있도록 Encapsulating

public interface UserRepository {
    User get(Long id); // 원하는거만 구현해도된다. 내부에선 Dao 를 조합
    // void add(User user);
    // void update(User user);
    // void remove(User user);
}






Reference

🔗 스프링 부트 핵심 가이드
🔗 https://www.ibm.com/kr-ko/topics/three-tier-architecture
🔗 https://hudi.blog/layered-architecture/
🔗 https://ksh-coding.tistory.com/92
🔗 프로젝트 폴더 구조

profile
일상의 인연에 감사하라. 기적은 의외로 가까운 곳에 있을지도 모른다.

0개의 댓글