[TIL] 스프링 입문 - Controller와 HTTP 매핑
Spring MVC에서 Controller와 HTTP 메서드 매핑을 사용하는 방법을 정리한 TIL입니다.
For the English version of this post, see here.
오늘 할 일
공부한 내용
@Controller
- 해당 클래스가 Controller의 역할을 수행할 수 있도록 함
- Spring MVC는 효율적 API 처리를 위해 Front Controller 패턴을 만들어냄
- API 마다 파일을 만들 필요가 없고, 유사한 성격의 API를 하나의 Controller로 관리함
@GET, @POST, @PUT, @DELETE 각각의 HTTP Method에 매핑되는 어노테이션
1 2 3 4 5 @GetMapping("/api/get") @ResponseBody public String get() { return "GET Method 요청"; }
@RequestMapping 중복되는 URL을 단축시켜줌
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 @Controller @RequestMapping("/api") public class HelloController { @GetMapping("/hello") @ResponseBody public String hello() { return "Hello World!"; } @GetMapping("/get") @ResponseBody public String get() { return "GET Method 요청"; } @PostMapping("/post") @ResponseBody public String post() { return "POST Method 요청"; } @PutMapping("/put") @ResponseBody public String put() { return "PUT Method 요청"; } @DeleteMapping("/delete") @ResponseBody public String delete() { return "DELETE Method 요청"; } }
정적 페이지와 동적 페이지
- 정적 페이지
/resources/static/파일이름.html- SpringBoot 서버에 html 파일을 바로 요청하면 해당 html 파일을 static 폴더에서 찾아서 반환해줌
- Controller를 통해서도 반환 가능하지만, 이미 완성된 정적 html 파일을 Controller를 통해 반환할 필요는 없음
java @GetMapping("/static-hello") public String hello() { return "hello.html"; }
- Redirect
- 템플릿 엔진(thymeleaf)을 적용한 상태에서 static 폴더의 html 파일을 Controller를 통해서 처리하고 싶다면 redirect 요청을 문자열로 반환하면 요청이 재수행 되면서 static 폴더의 파일을 반환할 수 있음 ``` java @GetMapping(“/html/redirect”) public String htmlStatic() { return “redirect:/hello.html”; }
```
- 동적 페이지
/resources/templates/파일이름.html- static 폴더에 있는 html 파일을 바로 호출하는 방법이 가장 간단하지만
- 외부 브라우저에서 바로 접근하지 못하게 하고 싶거나 특정 상황에 Controller를 통해서 제어하고 싶다면
templates 폴더에 해당 정적 html 파일을 추가하고 해당 html 파일명인** “파일이름” 문자열을 반환하여 처리할 수 있음 (
.html은 생략 가능!**)- 동적 페이지 처리 과정
- Client의 요청을 Controller에서 Model로 처리
- Template engine(Thymeleaf)에게 View, Model 전달
- View: 동적 HTML 파일
- Model: View에 적용할 정보들
- Template engine
- View에 Model을 적용 -> 동적 웹페이지 생성
- Client(브라우저)에게 View(동적 웹 페이지, HTML)를 전달 해줌
데이터를 Client에 반환하는 방법
- 프론트엔드와 백엔드가 각각 따로 발전하면서 -> 느슨하게 결합하는 방식 채택
- 서버가 직접 뷰(html/css)를 반환하기 보다는 요청에 맞는 특정한 정보만 반환하는 것을 선호함
- JSON 데이터를 요청하는 API를 통해 브라우저에서 html을 조작하여 반영하는 식으로 진행 예정
JSON 데이터를 반환하는 법
- 템플릿 엔진(Thyemleaf)가 적용된 SpringBoot에서는 Controller에서 문자열을 반환하면 templates 폴더에서 해당 문자열의
.html파일을 찾아 반환해줌 -> 따라서, html 파일이 아닌 JSON 데이터를 브라우저에 반환하고 싶다면 해당 메서드에@ResponseBody어노테이션을 추가해줘야함@Controller에서는 return 값이 기본적으로 “HTML 파일 이름”으로 해석됨@ResponseBody가 있다면, Spring이 View를 찾는 게 아니라, 그냥 데이터를 그대로 응답으로 보내라는 것으로 해석함1 2 3 4 5
@ResponseBody @GetMapping("/json") public Star test() { return new Star("Robbie", 95); }
- 반환값이 String인 경우 Java는 JSON 타입을 지원하지 않기 때문에 JSON 형태의 String 타입으로 변환해서 사용해야함
- 반환값이 String 외 자바 클래스인 경우 “Java 객체 -> JSON으로 변환” Spring에서 자동으로 Java의 객체를 JSON으로 변환해줌
@RestController @Controller + @ResponseBody
- @RestController를 사용하면 해당 클래스의 모든 메서드에 @ResponseBody 어노테이션이 추가되는 효과를 부여할 수 있음
Jackson이란
- Jackson 라이브러리
JSON데이터 구조를 처리해주는 라이브러리
- Object를
JSON타입의 String으로 변환해줄 수 있음- JSON 타입의 String을 Object로 변환해줄 수 있음
- Spring이
Jackson과 관련된 API를 제공함으로써, 직접 소스 코드를 작성하여JSON데이터를 처리하지 않아도 자동으로 처리할 수 있다. - 직접
JSON데이터를 처리해야할 때는 Jackson 라이브러리의ObjectMapper를 사용할 수 있음 - Object to JSON
- Object를
JSON타입의 String으로 변환하기 위해서는 해당 Object의 get Method가 필요함 ``` java @Test @DisplayName(“Object To JSON : get Method 필요”) void test1() throws JsonProcessingException { Star star = new Star(“Robbie”, 95);
ObjectMapper objectMapper = new ObjectMapper(); // Jackson 라이브러리의 ObjectMapper String json = objectMapper.writeValueAsString(star); // objectMapper의 writeValueAsString 메서드를 사용하여 변환할 수 있음 // 파라미터에 JSON으로 변환시킬 Object의 객체를 주면 됨
System.out.println(“json = “ + json); } ```
- Object를
- JSON to Object
JSON타입의 String을 Object로 변환하기 위해서는 해당 Object에 기본 생성자와 get 혹은 set 메서드가 필요함 ``` java @Test @DisplayName(“JSON To Object : 기본 생성자 & (get OR set) Method 필요”) void test2() throws JsonProcessingException { String json = “{"name":"Robbie","age":95}”; // JSON 타입의 String
ObjectMapper objectMapper = new ObjectMapper(); // Jackson 라이브러리의 ObjectMapper
Star star = objectMapper.readValue(json, Star.class); // objectMapper의 readValue 메서드를 사용해 변환 // 첫 번째 파라미터는 JSON 타입의 String, 두 번째 파라미터에는 변환할 Object의 class 타입을 줌 System.out.println(“star.getName() = “ + star.getName()); } ```