Spring MVC 패턴: 디테일

코딩하는 포로리·2022년 2월 19일
0

Spring

목록 보기
3/10
post-thumbnail

📌 1. Spring MVC 구조


📎 Spring MVC 전체 구조

  • View
  • Controller
  • Service
  • DAO
  • DTO
  • DB

📎 Spring MVC 세부 구조 및 실행 순서


1. 클라이언트가 서버에 요청을 하면, front controller인 DispatcherServlet 클래스가 요청을 받는다.
2. DispatcherServlet는 프로젝트 파일 내의 servlet-context.xml 파일의 @Controller 인자를 통해 등록한 요청 위임 컨트롤러를 찾아 매핑(mapping)된 컨트롤러가 존재하면 @RequestMapping을 통해 요청을 처리할 메소드로 이동한다.
3. 컨트롤러는 해당 요청을 처리할 Service(서비스)를 받아 비즈니스로직을 서비스에게 위임한다.
4. Service(서비스)는 요청에 필요한 작업을 수행하고, 요청에 대해 DB에 접근해야한다면 DAO에 요청하여 처리를 위임한다.
5. DAO는 DB정보를 DTO를 통해 받아 서비스에게 전달한다.
6. 서비스는 전달받은 데이터를 컨트롤러에게 전달한다.
7. 컨트롤러는 Model(모델) 객체에게 요청에 맞는 View(뷰) 정보를 담아 DispatcherServlet에게 전송한다.
8. DispatcherServlet는 ViewResolver에게 전달받은 View정보를 전달한다.
9. ViewResolver는 응답할 View에 대한 JSP를 찾아 DispatcherServlet에게 전달한다.
10. DispatcherServlet는 응답할 뷰의 Render를 지시하고 뷰는 로직을 처리한다.
11. DispatcherServlet는 클라이언트에게 Rendering된 뷰를 응답하며 요청을 마친다.


📌 2. Controller


📎 Controller란?

사용자의 요청(request)을 어떻게 처리할지 결정하는 파트이다. 즉, Controller에 정의된 기준대로 요청을 처리한다.

👉 Controller의 특징

  • @Autowired 어노테이션을 이용해 service의 method를 이용한다.
  • 적절한 ResponseEntity(DTO)를 Body에 담아 Client에 반환

📎 @Controller

Controller의 역할을 수행한다고 명시해주는 어노테이션, Controller의 내용을 기준 삼아 요청을 처리한다.


📎 @Autowired

속성(field), Setter Method, 생성자(Contructor)에서 사용하며 타입에 따라 알아서 자동으로 Bean을 주입해준다. Controller 클래스에서 DAO나 Service에 관한 객체들을 주입시킬 때 많이 사용한다.


📎 @RequestMapping(value="", mehtod="")

Controller에 들어온 요청을 처리하는 기준점이다. 서버의 URL + value로 매핑되며 methodRequestMethod.GET 혹은 POST을 입력한다.주소창에 URL + value를 입력하면 method가 수행된다.



📌 3. Service


📎 Service란?

사용자의 요청(request)에 대해 어떤 처리를 할지 결정하는 파트이다. 즉, Controller가 받은 요청에 대해 알맞은 정보를 가공해서 다시 Controller에게 데어터를 넘기는 것을 의미한다.

👉 Service의 특징

  • 주의할 점은 실제 비즈니스 로직은 Service에서 수행하지 않는다. API에서 발행하는 트랜잭션과 Domain의 순서 보장의 역할을 갖고 있으며 실제 로직은 Domain패키지에서 수행된다.
  • DAO로 DB에 접근하고 DTO로 데이터를 전달받은 다음, 비지니스 로직을 처리해 적절한 데이터를 반환한다.
  • 여러 DAO를 호출하여 여러번의 데이터에 접근 및 갱신 → 읽은 데이터에 대한 비즈니스 로직을 수행 → 하나의 혹은 여러개의 트랜잭션으로 묶음

📎 @Service

Service의 역할을 수행한다고 명시해주는 어노테이션



📌 4. DAO(Data Access Object)


📎 DAO란?

Data Access Object의 약자로 DB의 data에 접근하기 위한 객체이다. 일반적으로 DB에 접근하는 코드는 SQL이기 때문에 Java에서 SQL을 사용하려면 Connection을 생성하고, 직접 쿼리문을 작성하여 Connection을 닫는 과정이 필요하다. 하지만 이는 번거롭고 코드의 가독성을 떨어뜨리기 때문에, 어플리케이션에서 사용할 DB로직으 객체 하나에 메서드로 구현하고, 이를 호출하여 사용하도록 만든 것을 DAO라고 한다.

👉 DAO의 특징

  • DAO는 여러개가 아닌 단일 데이터만 접근 혹은 갱신이 가능하다.
  • DAO는 오버헤드를 줄일 수 있다는 장점이 있다. 실제 WA(웹 어플리케이션)에 다수의 사용자가 접속하여 DB I/O이벤트가 많이 발생할 경우, Connection이 많이 생기며 반응속도가 느려진다. 하지만 DAO는 오직 1개의 Connection으로 다수의 요청을 모두 수행하기 때문에 WA의 안정된 운영을 보장한다.
  • 실제로 DB에 접근하는 객체로 Service와 DB를 연결하는 고리 역할을 한다.

📎 @Repository

DAO의 역할을 수행한다고 명시해주는 어노테이션



📌 5. DTO(Data Transfer Object)


📎 DTO란?

Data Transfer Object의 약자로 계층 간의 데처 교환을 위한 Java Bean을 말하며 VO(Value Object)와 유사한 특징이 있다. 한마디로 DTO란 클라이언트가 요청할 양식과 요청을 처리하는 과정에서 기준이 되는 틀을 정의해준 것을 의미한다.

결론적으로, DTO는 로직을 가지고 있지 않은 순수한 데이터 객체이며, getter/setter 메서드만 갖는다.



📌 6. DispatcherServlet


📎 DispatcherServlet란?

Dispatcher-servlet에서 dispatcher는 보내다라는 뜻을 가지고 있다. 그리고 이러한 단어를 포함하는 디스패처 서블릿은 가장 앞단에서 HTTP 프로토콜로 들어오는 모든 요청을 가장 먼저 받아 적합한 컨트롤러에 위임해주는프론트 컨트롤러(Front Controller)라고 정의할 수 있다.

더 자세히 설명하면, 클라이언트로부터 어떠한 요청이 들어오면 톰캣과 같은 서블릿 컨테이너가 요청을 받게된다. 그리고 이 모든 요청을 먼저 프론트 컨트롤러인 디스패처 서블릿이 받게된다. 그러면 디스패처 서블릿은 공통적인 작업을 먼저 처리한 후에 해당 요청을 처리해야 하는 세부 컨트롤러를 getBean()으로 가져오고, 정해진 메소드를 실행시켜 작업을 위임한다.

공통적으로 진행되야 할 작업들을 우선적으로 처리해준다. 대표적으로 한글 인코딩같은 것이 있다.


📎 왜 Dispatcher-Servlet을 사용해야 하는가?

👉 지저분해지는 프로젝트

Spring이 없는 JAVA런타임에서는 컨틀롤러가 존재하지 않는다. 따라서 우리는 서블릿 객체를 생성하고, 그것을 web.xml에다 일일이 다 등록해줘야한다. 하지만 보통의 웹사이트는 접속하는 페이지(경로)가 기본적으로 10개 이상은 된다. 하지만 컨트롤러와 달리 서블릿 객체 하나는 하나의 경로만 담당한다. 이렇게 되면 프로젝트 문서는 접속 페이지마다 서블릿 객체를 생성하고 web.xml에 등록해줘야 하는 과정때문에 프로젝트 문서는 온통 서블릿 객체로 넘쳐날 것이다.

👉 높은 의존성

Servlet 객체는 HttpServlet를 확장한 객체이다. 이렇게되면 HttpServlet 기능을 필수로 Override 해줘야 하고, 더 이상 일반 객체로 사용할 수 없다. 즉, 클래스끼리 값을 주고받기가 까다로워진다.

👉 중복되는 작업

모든 서블릿이 공통으로 처리하는 작업이나, 가장 우선시 되야하는 작업이 분명 있을 것이다. 이런 것을 서블릿 객체로 처리하기란 불가능하고, 매우 까다로울 것이다.

📎 2차 컨트롤러 구조

원래라면 web.xml에 각 컨트롤러를 모두 등록해야 하지만, DispatcherServlet이 모든 요청을 받고 세부 경로는 각 Controller에게 뿌려주는 프론트 컨트롤러의 역할을 함으로써, web.xml에 서블릿을 일일히 등록할 필요가 없어졌다. Controller의 매핑은 DispatcherServlet이 담당하기 때문이다.



📌 7. Handler Mapping


📎 Handler Mapping란?

웹 요청이 들어올 경우 DispatcherServlet객체(web.xml)가 요청을 어떤 컨트롤러에게 위임할 것인지를 결정해야 하는데 그 요청과 해당 요청을 처리하는 컨트롤러의 매핑을 담당하는 인터페이스이다.



📌 7. View Resolver


📎 View Resolver란?

View Resolver는 사용자가 요청한 것에 대한 응답 view를 렌더링하는 역할을 한다. view이름으로부터 사용될 view객체를 맵핑하는 역할을 하는 것이다.

👉 View Resolver의 동작 순서

  1. Controller는 ModelAndView 객체에 응답할 view이름을 넣고 Return
  2. DispatcherServlet은 ViewResolver에게 응답할 view를 요청
  3. ViewResolver는 View이름을 이용해 알맞은 view객체를 찾아 DispatcherServlet에게 전달


📖 참고

0개의 댓글