Spring boot application 의 setting 은 resources 경로의 application.properties 파일에서 합니다. Spring application 에서는 특정 경로의 .xml 파일로 설정하던 작업들이 .properties 파일 내에서 거의 모두 가능하게 되었죠.
src/main/resources 경로의 application.properties 파일을 열어봅시다.
처음에는 spring.application.name 하나의 설정만 있습니다.
application 의 설정을 할수 있는 확장자에는 .properties 말고도 .yml 확장자도 있는데요,
우선 application.properties 의 확장자를 .yml 로 변경해 봅니다.
rename 단축키는 Shift + f6 입니다. 변경 후에는 기존의 application name 을 아래와 같이 바꿔줍니다.
차이가 보이시나요? 저는 개인적으로 보다 계층적이고 반복구분이 없는 .yml 을 선호하는 편 입니다.
몇가지 설정을 추가해보겠습니다.
spring:
application:
name: api
profiles:
active: dev
server:
port: 13713
servlet:
context-path: /my-api
encoding:
charset: utf-8
enabled: true
force: true
---
spring:
config:
activate:
on-profile: dev
---
spring:
config:
activate:
on-profile: prod
서버의 포트와 contex-path, encoding 설정을 추가했고, profiles 를 구분했습니다.
.yml 에서 '---' 를 사용해서 파일을 구분할 수 있습니다.
기본적인 설정은 가장 위의 설정 내용에서 참고하고 profiles.active 설정으로 개발 환경에 따라 다른 파일('---'로 구분된)의 설정내용을 불러오게 구성했습니다.
프로젝트를 실행(Shift + f10) 해보면 설정 내용들이 반영된 것을 확인할 수 있습니다.
이제 실제 요청에 의한 응답을 처리하는 Controller 를 작성해보겠습니다.
main package 에 domain/greeting 이라는 package 를 추가하고 GreetingController 를 추가합니다.
package com.geonlee.api.domin.greeting;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author GEONLEE
* @since 2024-07-15
*/
@RestController
public class GreetingController {
@GetMapping(value = "/greeting", produces = MediaType.TEXT_PLAIN_VALUE)
public String greeting() {
return "Hello world!";
}
}
단순하게 request 가 들어오면 "Hello world!" 라는 텍스트를 리턴하는 메서드 입니다. 프로젝트를 실행하고 'http://localhost:13713/my-api/greeting' 주소를 브라우저에서 요청하면 'Hello world!' 가 출력됩니다.
브라우저에서 F12 를 눌러 개발 도구를 보면 설정한 내용에 맞게 데이터가 전달 된 것을 확인 할 수 있습니다.😄
Controller annotation 은 예전 MVC 모델에서 View를 반환하기 위해 사용했었습니다. 물론 데이터를 반환할 때는 @ResponseBody 를 붙여 사용했습니다. 하지만 API 에서는 View 를 제외한 데이터만 반환하기 때문에(ViewResolver X) Controller + ResponseBody 인 @RestController 를 사용합니다.
대표적인 HTTP Methods 에는 GET, POST, PUT, DELETE 이 있습니다. 메서드의 용도에 따라 구분해 사용해야 하지만, 요청에 의한 행위가 유추되면 보안상의 이슈가 발생할 수 있기 때문에 현업에서는 보통 GET, POST Method 만 사용합니다.
// Use Class, Method Level
@RequestMapping(value = "/greeting", method = RequestMethod.GET)
// Use Method Level
@GetMapping("/greeting")
@RequestMapping 은 request 와 method 를 매핑하기 위해 사용합니다. method 속성 설정으로 HTTP Method를 설정할 수 있지만, @RestController 사용 시에는 @GetMapping, @PostMapping 등을 사용합니다. class level 에서 매핑을 해야 할 경우(URI prefix 가 필요한 경우)에는 @RequestMapping을 사용하기도 합니다.
RequestMapping 의 속성으로 사용되는 comsumes, produces 는 request, response header 의 Content-type 제약을 주기 위해 사용됩니다. 예를들어 아래와 같이 consumes 를 추가할 경우 요청 데이터가 Json type 이 아닐 경우 415 Unsupported Media Type 오류가 발생하게 됩니다.
@GetMapping(value = "/greeting", consumes = MediaType.APPLICATION_JSON_VALUE,
produces = MediaType.TEXT_PLAIN_VALUE)
public String greeting(@RequestBody TestRecord parameter) {
return "Hello world!";
}
두 어노테이션은 HTTP request/response body의 데이터를 처리할 때 사용됩니다. 보통 Json message 를 Java 객체로, 또는 그 반대의 경우 데이터를 전달할 때 사용됩니다. 직렬화(Serialization) 라는 용어를 사용하고, 내부적으로는 HttpMessageConverter 의 구현체가 동작하여 해당 기능을 수행합니다.