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)