이번 섹션부터는 스프링 MVC가 제공하는 기본 기능들을 자세히 알아보자.
(이번 섹션은 내용이 방대하여, 1) ~ 4)
, 5) ~ 10)
, 11) ~ 15)
를 각각 나눠서 정리하고자 한다.)
👉 목차는 다음과 같다.
1) 프로젝트 생성
2) 로깅 간단히 알아보기
3) 요청 매핑
4) 요청 매핑 - API 예시
5) HTTP 요청 - 기본, 헤더 조회
6) HTTP 요청 파라미터 - 쿼리 파라미터, HTML Form
7) HTTP 요청 파라미터 - @RequestParam
8) HTTP 요청 파라미터 - @ModelAttribute
9) HTTP 요청 메시지 - 단순 텍스트
10) HTTP 요청 메시지 - JSON
11) 응답 - 정적 리소스, 뷰 템플릿
12) HTTP 응답 - HTTP API, 메시지 바디에 직접 입력
13) HTTP 메시지 컨버터
14) 요청 매핑 헨들러 어뎁터 구조
15) 정리
1) 먼저 새로 프로젝트를 만들어 볼 것이다. 2) 그리고 지금까지는 System.out.println(...)
으로 출력했었지만, 사실 실무에서 개발할 때는 로거를 통해서 로깅으로 남겨야 한다. 그래서 그와 관련해서 간단히 알아볼 것이다.
3) ~ 4) 이후 본격적으로 스프링의 요청 매핑에 대해서 알아볼 것이다. 5) 그리고 이전에 서블릿에서 했던 HTTP 요청 기본 정보, 헤더 정보 조회를 스프링 MVC로는 어떻게 더 편리하게 사용할 수 있는지 알아보자.
6) ~ 8) 그리고 서블릿에서 했던 request.getParameter(...)
로 조회했던 것을 스프링으로 하면 굉장히 편리하게 조회할 수 있는데 그 방법에 대해서 알아볼 것이다.
9) ~ 10) 그 다음에는, HTTP 요청 메시지 바디는 어떻게 꺼내서 사용하는지 알아볼 것이다.
11) ~ 12) 그리고 HTTP 응답에 대한 것(정적 리소스, 뷰 템플릿, HTTP API)을 알아볼 것이다.
그리고 추가로 13) HTTP 메시지 컨버터, 14) 요청 매핑 헨들러 어뎁터 구조에 대해서 알아볼 것이다.
Project
: Gradle - GroovyLanguage
: JavaSpring Boot
: 2.7.15 (강의에서는 2.4.3 버전으로 하였지만, 필자가 강의를 듣는 시점에는 해당 버전이 선택지에 없어 2.7.15 버전으로 하였다.)Project Metadata
Dependendies
http://localhost:8080
호출해서 Whitelabel Error Page가 나오면 정상 동작.Jar
를 사용하면 /resources/static/
위치에 index.html
파일을 두면 Welcome 페이지로 처리해준다. (스프링 부트가 지원하는 정적 컨텐츠 위치에 /index.html
이 있으면 된다.))https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#boot-features-spring-mvc-welcome-page
)✔️ 참고
앞으로 로그를 사용할 것이기 때문에, 이번에는 로그에 대해서 간단히 알아보자.
운영 시스템에서는 System.out.println()
같은 시스템 콘솔을 사용해서 필요한 정보를 출력하지 않고, 별도의 로깅 라이브러리를 사용해서 로그를 출력한다. 참고로 로그 관련 라이브러리도 많고, 깊게 들어가면 끝이 없기 때문에 여기서는 최소한의 사용 방법만 알아본다.
로깅 라이브러리
spring-boot-starter-logging
)가 함께 포함된다. 스프링 부트 로깅 라이브러리는 기본으로 다음 로깅 라이브러리를 사용한다.로그 선언
private Logger log = LoggerFactory.getLogger(getClass());
private static final Logger log = LoggerFactory.getLogger(Xxx.class)
@Slf4j
: 롬복 사용 가능 (롬복이 제공하는 애노테이션이다. 이렇게 적용하면 롬복이 위 코드를 자동으로 반영한다.)로그 호출
log.info("hello")
👉 그 전에 먼저 로그 선언과 호출을 코드로 확인해보자.
LogTestController
: src > main > java > hello > springmvc > basic 패키지를 생성하고, 내부에 LogTestController 클래스를 생성하자.TRACE > DEBUG > INFO > WARN > ERROR
@Slf4j
로 변경로그 레벨 설정
application.properties
올바른 로그 사용법
log.debug("data="+data)
log.debug("data={}", data)
로그 사용시 장점
✔️ 참고
요청 매핑이란, 요청이 왔을때 어떤 컨트롤러가 호출되어야하는지 매핑하는 것을 의미한다.
단순히 URL을 가지고 매핑하는 것 뿐만 아니라, 여러가지 요소들을 가지고 조합해서 매핑할 수 있다.
👉 먼저 간단하게 컨트롤러를 하나 만들어보자.
MappingController
: src > main > java > hello > springmvc > basic 패키지 내 requestmapping 패키지를 생성하자. 그리고 내부에 MappingController 클래스를 생성하자.@RestController
@Controller
는 반환 값이 String이면 뷰 이름으로 인식된다. 그래서 뷰를 찾고 뷰가 랜더링 된다.@RestController
는 반환 값으로 뷰를 찾는 것이 아니라, HTTP 메시지 바디에 바로 입력한다. 따라서 실행 결과로 "ok" 메시지를 받을 수 있다. (이는 @ResponseBody
와 관련이 있는데 뒤에서 더 자세히 설명한다.)@RequestMapping("/hello-basic")
/hello-basic
URL 호출이 오면 이 메서드가 실행되도록 매핑한다.배열[]
로 제공하므로 다중 설정이 가능하다. {"/hello-basic", "/hello-go"}
HTTP 메서드 매핑
@RequestMapping
에 method
속성으로 HTTP 메서드를 지정하지 않으면 HTTP 메서드와 무관하게 호출된다. (모두 허용 GET, HEAD, POST, PUT, PATCH, DELETE)@RestController
오류 모양을 JSON 스타일로 보내준다.@GetMapping
, @PostMapping
, @PutMapping
, @DeleteMapping
, @PatchMapping
PathVariable(경로 변수) 사용
: 요청 URL 자체에 값이 들어가있는 것. (경로 변수)
@PathVariable("userId") String data
-> @PathVariable String userId
PathVariable 사용 - 다중 매핑
특정 파라미터 조건 매핑
: 쿼리 파라미터를 조건에 매핑할 수 있다. (URL 정보 뿐만 아니라, 파라미터 정보까지 매핑되어야 함.)
특정 헤더 조건 매핑
: 파라미터 매핑과 비슷하지만, HTTP 헤더를 사용한다.
미디어 타입 조건 매핑 - HTTP 요청 Content-Type, consume
: HTTP 요청의 Content-Type 헤더를 기반으로 미디어 타입으로 매핑한다.
( 만약 Content-Type에 따른 조건(application/json인지 text/html인지 등)을 넣고싶은 경우, 이 경우는 위 특정 헤더 조건 매핑의 예시처럼 headers를 사용하면 안되고, consume을 사용해야 한다. 왜냐하면 스프링 MVC에서 내부적으로 이것을 가지고 처리하는 것들이 있기 때문이다. )
(참고) consumes 예시
미디어 타입 조건 매핑 - HTTP 요청 Accept, produce
(참고) produces 예시
✔️ 지금까지 요청 매핑에 대해서 알아보았다.
다음에는 지금까지 했던 요청 매핑을 API로 만드는 예시를 확인해보자.
회원을 관리하는 HTTP API를 만든다고 생각하고 매핑을 어떻게 하는지 알아보자.
(실제 데이터가 넘어가는 부분은 생략하고, URL 매핑하는 것만 예제를 통해 확인해보자.)
회원 관리 API (회원 관리 API 스펙을 다음과 같이 정했다고 가정하자.)
/users
)/users
)/users/{userId}
)/users/{userId}
)/users/{userId}
)👉 코드로 확인해보자.
MappingClassController
: src > main > java > hello > springmvc > basic > requestmapping 패키지 내부에 MappingClassController 클래스를 생성하자. (생성 후 postman으로 실행해보자.)/mapping
는 강의의 다른 예제들과 구분하기 위해 사용했다.@RequestMapping("/mapping/users")
👉 매핑 방법을 이해했으니, 이제부터 HTTP 요청이 보내는 데이터들을 스프링 MVC로 어떻게 조회하는지 알아보자.
강의를 듣고 정리한 글입니다. 코드와 그림 등의 출처는 김영한 강사님께 있습니다.