매주 스프링 부트 핵심 가이드 를 읽으며 이전에 궁금했거나, 새롭게 알게 된 내용들을 정리할 예정이다.
(이번 주는 4~5장을 읽었다.)
maven은 자바 기반 프로젝트를 빌드하고 관리하는 데 사용하는 도구이다.
pom.xml
파일에 라이브러리를 추가하면 그 라이브러리와 해당 라이브러리에 필요한 라이브러리까지 전부 내려받아 관리가 가능하다. 현재는 그래들(gradle) 로 전환되는 추세이긴 하지만 아직은 메이븐을 활용한 프로젝트가 많다.
메이븐의 생명주기는 크게 기본(Default), 클린(Clean), 사이트(Site) 생명주기의 3가지로 구분된다. 각 생명주기에는 단계가 존재하고 특정 단계를 수행하기 위해서는 이전 단계를 마쳐야 한다.
기본적으로 컨트롤러 클래스를 만들고 클래스 위에 @RestController
어노태이션을 붙여줘 컨트롤러임을 스프링에게 알려준다. 그 다음 클래스에 @RequestMapping
을 붙여주면 내부 메소드에서 사용할 공통 URL을 설정할 수 있다.
메소드에 @RequestMapping
어노태이션을 다른 설정 없이 선언하면 모든 HTTP 요청을 받을 수 있으나, 특정 요청만 받으려면 별도 설정이 필요하다. 스프링의 버전이 업데이트되면서 @GetMapping, @PostMapping, @PutMapping, @DeleteMapping
등 이름에서부터 명시된 어노태이션을 사용하므로 특별히 활용해야 하는 경우가 아니라면 @RequestMapping
은 사용하지 않는다.
GET 메소드에 매개 변수를 전달하는 방법은 크게 URL 자체에 값을 담거나 쿼리 문자열을 명시하는 방법이 있다. 각각 메소드에
@PathVariable
을 포함하거나@RequestParam
을 포함하는 방식으로 구현이 가능하다.
// 일반적인 방법
@GetMapping("/api/{value}")
public String getValue(@PathVariable String value) {
return value;
}
// URL 매핑과 메소드 매개변수의 이름이 다른 경우
@GetMapping("/api/{value}")
public String getValue(@PathVariable("value") String val) {
return val;
}
// http://localhost:8080/request?value1=Hello&value2=World
@GetMapping("/request")
public String getRequest(@RequestParam String value1, @RequestParam String value2) {
return "value1: " + value1 + "value2: " + value2;
}
// 값이 정해져 있지 않다면 Map 객체 활용 가능
@GetMapping("/request")
public String getValue(@RequestParam Map<String, String> parameterMap) {
...
}
POST 메소드에서는 저장하고자 하는 값이나 리소스를 HTTP 바디(body) 에 담아 전달한다.
바디는 다수의 환경에서 JSON 형식으로 전달해준다.
// 바디에 어떤 값이 들어올지 특정하기 어려울 경우 Map 객체 사용
@PostMapping("/request")
public String postRequest(@RequestBody Map<String, Object> requestBody) {
...
}
// DTO(Data Transfer Object) 가 있다면 DTO 활용 가능
// DTO의 멤버 변수를 바디의 키와 매핑
@PostMapping("/request")
public String postRequest(@RequestBody PersonDto personDto) {
...
}
이외에 PUT, DELETE 도 유사한 구조를 가지고 있으며 각각 수정과 삭제의 기능을 한다는 점이 차이가 있다.
각각 요청과 응답 객체를 더욱 편하게 생성해줄 수 있는 객체이다. 모든 HTTP 메소드에서 사용 가능하며, 헤더와 바디 이외에 HTTP 응답 코드도 지정해 줄 수 있다.
// DTO를 활용
@DeleteMapping("/request")
public ResponseEntity<PersonDto> postRequest(@RequestBody PersonDto personDto) {
return ResponseEntity
.status(HttpStatus.OK)
.body(personDto);
}
API 명세 문서를 만들어주는 라이브러리이다. 컨트롤러에 있는 메소드에 추가적으로 어노태이션을 달아주면 Swagger가 자동으로 문서를 만들어주는데, Spring 버전별로(2.x.x 이거나 3.x.x) 어노태이션에 차이가 있으므로 유의해야 한다.
서버에서 발생하는 로그를 파일로 저장할 때 사용하는 라이브러리이다. 에러, 경고, 디버그 등 다양한 로그 레벨을 설정하여 종류별로 관리할 수 있으며, 자체적으로 로그 파일 압축, 로그 파일 보관 기간 설정 등 다양한 기능을 지원한다.