1. Spring MVC에 대해 알고, 동작방식과 구성요소에 관해 이해할 수 있다.
2. Controller 클래스의 구조에 대해 이해하고, 핸들러 메서드를 작성할 수 있다.
- Spring MVC
✔︎ 클라이언트의 요청을 편하게 처리해주는 프레임워크
✔︎ 서블릿(Servlet) API 기반으로 클라이언트 요청을 처리하는 모듈
✔︎ 클라이언트 요청을 처리하도록 특정 규약에 맞춰서 Java 코드로 작성하는 클래스 파일
※ 아파치 톰캣(Apache Tomcat) : 서블릿들이 웹 애플리케이션으로 실행이 되도록 해주는 서블릿 컨테이너(Servlet Container)
✔︎ M (Model)
✔︎ V (View)
※ JSON(Java Script Object Notation)
- 클라이언트 애플리케이션과 서버 애플리케이션이 주고 받는 데이터 형식
- 기본 포맷 : {"속성":"값"}
✔︎ C (Controller)
엔드포인트(Endpoint)
✔︎ Spring MVC 작동 방식
(1) 클라이언트가 요청을 전송해 DispatcherServlet
클래스에 요청 전달
(2) DispatcherServlet
은 클라이언트 요청을 처리할 Controller
에 대한 검색을 HandlerMapping
인터페이스에 요청
(3) HandlerMapping
은 클라이언트 요청과 매핑되는 핸들링 객체를 리턴
(4) HandlerAdapter
에게 실제로 클라이언트 요청을 처리할 Handler 메서드
호출을 위임
(5) 전달받은 Controller
를 기반으로 해당 Controller
의 Handler 메서드
호출
(6) Controller
의 Handler 메서드
는 비즈니스 로직 처리 후 리턴받은 Model 데이터
를 전달
(7) 전달받은 Model 데이터
와 View 정보
를 전달
(8) 전달받은 View 정보
를 다시 ViewResolver
에게 전달해서 View 검색 요청
(9) View 정보
에 해당하는 View를 찾아 리턴
(10) ViewResolver
에게 전달받은 View 객체
를 통해 Model 데이터
를 넘겨주면서 클라이언트에게 전달할 응답 데이터
생성을 요청
(11) View
는 응답 데이터를 생성해서 리턴
(12) DispatcherServlet
은 전달받은 응답 데이터를 최종적으로 클라이언트에게 전달
- Controller
✔︎ Spring Boot 애플리케이션으로서 동작하기 위한 엔트리포인트에는 @SpringBootApplication
을 추가
✔︎ main()메서드 내에 SpringApplication.run()
을 호출하면 Spring Boot 기반 애플리케이션이 동작
✔︎ @RestController
를 클래스에 추가함으로써 해당 클래스를 REST API의 리소스를 처리하기 위한 API 엔드포인트로 동작하게 만듦
✔︎ @RequestMapping
을 Controller 클래스 레벨에 추가하여 클래스 전체에 공용으로 사용되는 공통 URL(Base URL) 설정 가능
✔︎ 클라이언트의 요청을 전달 받아 처리하기 위해서는 요청 핸들러 메서드 (Request Handler Method)가 필요
✔︎ Spring MVC에서는 HTTP Method 유형과 매치되는 @GetMapping
, @PostMapping
등의 애너테이션 지원
(참고 링크)
✔︎ PathVariable
애너테이션을 사용하면 클라이언트 요청 URI에 패턴 형식으로 지정된 변수의 값을 파라미터로 전달받을 수 있음
✔︎ @RequestParam
애너테이션을 사용하면 쿼리 파라미터, 폼 데이터, x-www-form-urlencoded 형식의 데이터를 파라미터로 전달받을 수 있음
✔︎ @GetMapping
, @PostMapping
등에서 URI를 생략하면 클래스 레벨의 URI 경로만으로 URI 구성
✔︎ 핸들러 메서드의 리턴 값으로 Map 객체를 리턴하면 Spring MVC 내부적으로 JSON 형식의 데이터를 생성
→ 클래스 레벨의 @RequestMapping
에 'produces' 애트리뷰트를 지정할 필요 ❌
✔︎ ResponseEntity 클래스로 응답 데이터를 래핑함으로써 좀 더 세련된 방식으로 응답 데이터 리턴 가능
✔︎ POST Method 형식의 클라이언트 요청에 대한 응답 상태는 HttpStatus.OK
보다는 HttpStatus.CREATED
가 좀 더 자연스러움
- Controller 심화
✔︎ HTTP 메시지의 구성 요소 중 하나
✔︎ 클라이언트의 요청이나 서버의 응답에 포함되어 부가적인 정보를 HTTP 메시지에 포함
✔︎ HTTP 헤더 정보 찾기
@RequesHeader
애너테이션을 이용해 개별∙전체 헤더 정보를 얻을 수 있음HttpServletRequest
또는 HttpEntity
객체로 헤더 정보를 얻을 수 있음✔︎ HTTP Response 헤더 정보 추가
ResponseEntity
와 HttpHeaders
를 이용해 헤더 정보 추가 가능HttpServletResponse
객체를 이용해 헤더 정보 추가 가능✔︎ 웹 브라우저 : 웹 서버로부터 HTML 컨텐츠
를 제공받는 클라이언트 중 하나
✔︎ 어떤 서버
가 HTTP 통신을 통해서 다른 서버의 리소스를 이용한다면 그 때만큼은 클라이언트 역할 수행
✔︎ Rest Client : Rest API 서버에 HTTP 요청을 보낼 수 있는 클라이언트 툴 또는 라이브러리
✔︎ RestTemplate : 원격지에 있는 다른 Backend 서버에 HTTP 요청을 전송할 수 있는 Rest Client API
✔︎ RestTemplate 사용 단계
getForObject()
, getForEntity()
, exchange()
등을 이용해 HTTP 요청 전송✔︎ RestTemplate 사용 예시
☞ Section3의 첫 시작이다. Section2의 마지막 부분의 Spring Framework의 개념들이나 특징들이 내게는 너무 어려웠어서, Spring Framework 내용으로만 가득 채워진 Section3를 잘 소화해낼 수 있을 지 시작부터 걱정이 들었던 게 사실이다.
오늘은 Spring MVC와 Controller, 핸들링 메서드에 관해 주로 학습했는데, 다행히 무리없이 어느 정도 잘 이해한 것 같다. 이론적인 개념공부보다 직접 실습을 해보며, 과제도 주어지는 수업 방식에 좀 더 잘 이해할 수 있었다. 페어와 함께 하는 과제에서도 처음 방향성을 잡을 때는 약간 주춤했으나, 궁금한 점들을 찾아가며 감을 잡고 작성하다보니 무사히 마칠 수 있었다 :)
실습이 많은 만큼 직접 코드들을 여러 번 작성해가면서 Spring과 친해진다면 잘 해내갈 수 있을 거라 자신감이 생기는 하루였다. 실무에서도 무엇보다 핵심적이고 중요한 내용들이기에 Section1,2 회고들을 바탕으로 부족한 점들을 보완하고 실천 사항들을 실천하며 최선을 다해 임해야겠다.
・ DTO (Data Transfer Object)