41DAYS) [Spring MVC] API 계층 - Controller, 핸들러 메서드

nacSeo (낙서)·2022년 12월 15일
0

◉ 학습목표

1. Spring MVC에 대해 알고, 동작방식과 구성요소에 관해 이해할 수 있다.
2. Controller 클래스의 구조에 대해 이해하고, 핸들러 메서드를 작성할 수 있다.
  1. Spring MVC

⦿ 학습내용

☞ Spring MVC

✔︎ 클라이언트의 요청을 편하게 처리해주는 프레임워크
✔︎ 서블릿(Servlet) API 기반으로 클라이언트 요청을 처리하는 모듈

☞ 서블릿 (Servlet)

✔︎ 클라이언트 요청을 처리하도록 특정 규약에 맞춰서 Java 코드로 작성하는 클래스 파일

※ 아파치 톰캣(Apache Tomcat) : 서블릿들이 웹 애플리케이션으로 실행이 되도록 해주는 서블릿 컨테이너(Servlet Container)

☞ MVC

✔︎ M (Model)

  • 작업의 처리 결과 데이터

✔︎ V (View)

  • Model 데이터를 이용해서 클라이언트 애플리케이션 화면에 보여지는 리소스(Resource)를 제공하는 역할

※ JSON(Java Script Object Notation)
- 클라이언트 애플리케이션과 서버 애플리케이션이 주고 받는 데이터 형식
- 기본 포맷 : {"속성":"값"}

✔︎ C (Controller)

  • 클라이언트 측의 요청을 직접적으로 전달받는 엔드포인트(Endpoint)
  • Model과 View의 중간에서 상호작용 담당

✔︎ Spring MVC 작동 방식

  • Client가 요청 데이터 전송
    → Controller가 요청 데이터 수신 → 비즈니스 로직 처리 → Model 데이터 생성
    → Controller에게 Model 데이터 전달 → Controller가 View에게 Model 데이터 전달
    → View에서 응답 데이터 생성

☞ Spring MVC 동작 방식 및 구성 요소

(1) 클라이언트가 요청을 전송해 DispatcherServlet 클래스에 요청 전달
(2) DispatcherServlet은 클라이언트 요청을 처리할 Controller에 대한 검색을 HandlerMapping 인터페이스에 요청
(3) HandlerMapping은 클라이언트 요청과 매핑되는 핸들링 객체를 리턴
(4) HandlerAdapter에게 실제로 클라이언트 요청을 처리할 Handler 메서드 호출을 위임
(5) 전달받은 Controller를 기반으로 해당 ControllerHandler 메서드 호출


(6) ControllerHandler 메서드는 비즈니스 로직 처리 후 리턴받은 Model 데이터를 전달
(7) 전달받은 Model 데이터View 정보를 전달
(8) 전달받은 View 정보를 다시 ViewResolver에게 전달해서 View 검색 요청
(9) View 정보에 해당하는 View를 찾아 리턴
(10) ViewResolver에게 전달받은 View 객체를 통해 Model 데이터를 넘겨주면서 클라이언트에게 전달할 응답 데이터 생성을 요청
(11) View는 응답 데이터를 생성해서 리턴
(12) DispatcherServlet은 전달받은 응답 데이터를 최종적으로 클라이언트에게 전달

  1. Controller

⦿ 학습내용

☞ Controller 클래스 설계 및 구조 생성

✔︎ Spring Boot 애플리케이션으로서 동작하기 위한 엔트리포인트에는 @SpringBootApplication을 추가
✔︎ main()메서드 내에 SpringApplication.run()을 호출하면 Spring Boot 기반 애플리케이션이 동작
✔︎ @RestController를 클래스에 추가함으로써 해당 클래스를 REST API의 리소스를 처리하기 위한 API 엔드포인트로 동작하게 만듦
✔︎ @RequestMapping을 Controller 클래스 레벨에 추가하여 클래스 전체에 공용으로 사용되는 공통 URL(Base URL) 설정 가능

☞ 핸들러 메서드 (Handler Method)

✔︎ 클라이언트의 요청을 전달 받아 처리하기 위해서는 요청 핸들러 메서드 (Request Handler Method)가 필요
✔︎ Spring MVC에서는 HTTP Method 유형과 매치되는 @GetMapping, @PostMapping 등의 애너테이션 지원
(참고 링크)
✔︎ PathVariable 애너테이션을 사용하면 클라이언트 요청 URI에 패턴 형식으로 지정된 변수의 값을 파라미터로 전달받을 수 있음
✔︎ @RequestParam 애너테이션을 사용하면 쿼리 파라미터, 폼 데이터, x-www-form-urlencoded 형식의 데이터를 파라미터로 전달받을 수 있음
✔︎ @GetMapping, @PostMapping 등에서 URI를 생략하면 클래스 레벨의 URI 경로만으로 URI 구성

☞ 응답 데이터에 ResponseEntity 적용

✔︎ 핸들러 메서드의 리턴 값으로 Map 객체를 리턴하면 Spring MVC 내부적으로 JSON 형식의 데이터를 생성
→ 클래스 레벨의 @RequestMapping에 'produces' 애트리뷰트를 지정할 필요 ❌
✔︎ ResponseEntity 클래스로 응답 데이터를 래핑함으로써 좀 더 세련된 방식으로 응답 데이터 리턴 가능
✔︎ POST Method 형식의 클라이언트 요청에 대한 응답 상태는 HttpStatus.OK보다는 HttpStatus.CREATED가 좀 더 자연스러움

  1. Controller 심화

⦿ 학습내용

☞ HTTP 헤더 (Header)

✔︎ HTTP 메시지의 구성 요소 중 하나
✔︎ 클라이언트의 요청이나 서버의 응답에 포함되어 부가적인 정보를 HTTP 메시지에 포함
✔︎ HTTP 헤더 정보 찾기

  • @RequesHeader 애너테이션을 이용해 개별∙전체 헤더 정보를 얻을 수 있음
  • HttpServletRequest 또는 HttpEntity 객체로 헤더 정보를 얻을 수 있음

✔︎ HTTP Response 헤더 정보 추가

  • ResponseEntityHttpHeaders를 이용해 헤더 정보 추가 가능
  • HttpServletResponse 객체를 이용해 헤더 정보 추가 가능

☞ Rest Client

✔︎ 웹 브라우저 : 웹 서버로부터 HTML 컨텐츠를 제공받는 클라이언트 중 하나
✔︎ 어떤 서버가 HTTP 통신을 통해서 다른 서버의 리소스를 이용한다면 그 때만큼은 클라이언트 역할 수행
✔︎ Rest Client : Rest API 서버에 HTTP 요청을 보낼 수 있는 클라이언트 툴 또는 라이브러리
✔︎ RestTemplate : 원격지에 있는 다른 Backend 서버에 HTTP 요청을 전송할 수 있는 Rest Client API
✔︎ RestTemplate 사용 단계

  • RestTemplate 객체 생성
  • HTTP 요청을 전송할 엔드포인트의 URI 객체 생성
  • getForObject(), getForEntity(), exchange() 등을 이용해 HTTP 요청 전송

✔︎ RestTemplate 사용 예시

  • 결제 서비스
  • 메시징 서비스
  • 지도 서비스
  • Open API
  • 기타 원격지 API 서버와의 통신

◉ 느낀 점

☞ Section3의 첫 시작이다. Section2의 마지막 부분의 Spring Framework의 개념들이나 특징들이 내게는 너무 어려웠어서, Spring Framework 내용으로만 가득 채워진 Section3를 잘 소화해낼 수 있을 지 시작부터 걱정이 들었던 게 사실이다.
오늘은 Spring MVC와 Controller, 핸들링 메서드에 관해 주로 학습했는데, 다행히 무리없이 어느 정도 잘 이해한 것 같다. 이론적인 개념공부보다 직접 실습을 해보며, 과제도 주어지는 수업 방식에 좀 더 잘 이해할 수 있었다. 페어와 함께 하는 과제에서도 처음 방향성을 잡을 때는 약간 주춤했으나, 궁금한 점들을 찾아가며 감을 잡고 작성하다보니 무사히 마칠 수 있었다 :)
실습이 많은 만큼 직접 코드들을 여러 번 작성해가면서 Spring과 친해진다면 잘 해내갈 수 있을 거라 자신감이 생기는 하루였다. 실무에서도 무엇보다 핵심적이고 중요한 내용들이기에 Section1,2 회고들을 바탕으로 부족한 점들을 보완하고 실천 사항들을 실천하며 최선을 다해 임해야겠다.

◉ 내일의 키워드

・ DTO (Data Transfer Object)
profile
백엔드 개발자 김창하입니다 🙇‍♂️

0개의 댓글