포스트

[TIL] 스프링 입문 - Controller와 HTTP 매핑

Spring MVC에서 Controller와 HTTP 메서드 매핑을 사용하는 방법을 정리한 TIL입니다.

For the English version of this post, see here.
[TIL] 스프링 입문 - Controller와 HTTP 매핑

오늘 할 일

공부한 내용

@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은 생략 가능!**)

    • 동적 페이지 처리 과정
      1. Client의 요청을 Controller에서 Model로 처리
      2. Template engine(Thymeleaf)에게 View, Model 전달
        • View: 동적 HTML 파일
        • Model: View에 적용할 정보들
      3. Template engine
        • View에 Model을 적용 -> 동적 웹페이지 생성
      4. 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); } ```

  • 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()); } ```

문제 & 오류

내일 할 일