[Section2] Spring MVC

이강욱·2023년 6월 13일

확실히 직접 타이핑을 하며 익히니 Spring 개념을 익힐 때 보다는 훨씬 느낌이 오는거 같아 마음이 조금 괜찮아지는 것 같다..

기쁜(?) 마음으로 정리를 해보자

Spring MVC란

Spring MVC 프레임워크라고도 하며 Model, View, Controller로 구성되어 있다.

Model은 작업의 결과물이며 웹이 클라이언트에 요청을 받았을 때 요청을 처리하기 위해 작업을 하고 작업 결과를 응답하여 돌려줘야하는 데이터를 Model이라고 한다.

View는 화면에 보이는 리소스를 제공하는 역활을 한다.

HTML 페이지의 출력

PDF, Excel 등의 문서 형태로 출력

XML, JSON 등 특정 형식의 포맷으로의 변환

3가지가 있으며 현재 배우고 있는 것은 Model 데이터를 JSON 프로토콜 데이터로 변환하는 것이다.

클라이언트가 요청했을 때 서버 쪽에서는 요청정보를 JSON 전송해준다.

Spring MVC의 동작 방식과 구성 요소

확실히 블로깅은 윈도우보다 Mac이 편하다 다음부터는 MB으로 블로깅을 해보자..

Spring MVC의 요청 처리 흐름

클라이언트의 요청을 제일 먼저 전달받는 구성요소는 DispatcherServlet이다.

DispatcherServlet은 HandlerMapping 인터페이스에게 Controller의 검색을 위임한다.

DispatcherServlet은 검색된 Controller 정보를 토대로 HandlerAdapter 인터페이스에게 Controller 클래스 내에 있는 Handler 메서드의 호출을 위임한다.

HandlerAdapter 인터페이스는 Controller 클래스의 Handler 메서드를 호출한다.

DispatcherServlet은 ViewResolver에게 View의 검색을 위임한다.

DispatcherServlet은 View에게 Model 데이터를 포함한 응답 데이터 생성을 위임한다.

DispatcherServlet은 최종 응답 데이터를 클라이언트에게 전달한다.

DispatcherServlet이 애플리케이션의 가장 앞단에 배치되어 다른 구성요소들과 상호작용하면서 클라이언트의 요청을 처리하는 패턴을 Front Controller Pattern이라고 한다.

Controller 클래스 설계 및 구조 생성

클라이언트 요청 흐름의 끝에는 Controller가 있다.

Controller 클래스를 만들 때 제일 먼저 ‘클라이언트로부터 발생할 요청에는 어떤 것들이 있을까’를 고민해야한다.

@RestController를 클래스에 추가함으로써 해당 클래스를 REST API의 리소스(자원, Resource)를 처리하기 위한 API 엔드포인트로 동작하게 해 준다.

@RequestMapping을 Controller 클래스 레벨에 추가하여 클래스 전체에 사용되는 공통 URL(Base URL)을 설정할 수 있다.

핸들러 메서드(Handler Method) 적용

핸들러 메서드를 작성하기 전에 먼저 각 핸들러 메서드에서 필요한 기능별 정보들을 정의해야한다.

클라이언트의 요청을 전달받아서 처리하기 위해서는 요청 핸들러 메서드(Request Handler Method)가 필요하다.

Spring MVC에서는 HTTP Method 유형과 매치되는 @GetMapping, @PostMapping 등의 애너테이션을 지원한다.

@PathVariable 애너테이션을 사용하면 클라이언트 요청 URI에 패턴 형식으로 지정된 변수의 값을 파라미터로 전달받을 수 있다.

@RequestParam 애너테이션을 사용하면 쿼리 파라미터(Query Parmeter 또는 Query string), 폼 데이터(form-data), x-www-form-urlencoded 형식의 데이터를 파라미터로 전달받을 수 있다.

@GetMapping, @PostMapping 등에서 URI를 생략하면 클래스 레벨의 URI 경로만으로 요청 URI를 구성한다.

@ResponseEntity 사용시 응답 데이터를 리턴이 가능하다
ex)return new ResponseEntity<>(example, HttpStatus.CREATED);

DTO(Data Transfer Object)란?

Transfer라는 의미에서 알 수 있듯이 데이터를 전송하기 위한 용도의 객체이다.

Spring을 배우고 시작하면서 유일하게 정확하게 이해한 부분인 것 같다..

DTO를 사용 시 코드가 보다 간결해지고 요청 데이터를 쉽게 수정 및 보안이 가능해진다.

또한 유효성(Validation) 검증이 보다 쉽게 가능하며

Spring의 개발을 위한 도구임을 한번 더 느껴지게 되었다.

대신 아래의 내용일 잊지 말자

JSON 형식의 Request Body를 전달받기 위해서는 DTO 객체에 @RequestBody 애너테이션을 붙여야 한다.

Response Body를 JSON 형식으로 전달하기 위해서는
@ResponseBody 애너테이션을 메서드 앞에 붙여 주어야 하지만 ResponseEntity 객체를 리턴 값으로 사용할 경우 @ResponseBody를 생략할 수 있다.

클라이언트 쪽에서 JSON 형식의 데이터를 서버 쪽으로 전송하면 서버 쪽의 웹 애플리케이션은 전달받은 JSON 형식의 데이터를 DTO 같은 Java의 객체로 변환하는데 이를 역직렬화(Deserialization)이라고 한다.

서버 쪽에서 클라이언트에게 응답 데이터를 전송하기 위해서 DTO 같은 Java의 객체를 JSON 형식으로 변환하는 것을 직렬화(Serialization)라고 한다.

0개의 댓글