Spring/MVC

스프링 MVC 1편 (3) - MVC 기본 기능

ummchicken 2023. 1. 1. 14:06

강의 : 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

 

내가 보려고 씀

 

 


 

섹션 6. 스프링 MVC - 기본 기능

 

 

매핑 정보

@Controller
- 반환 값이 String 이면 뷰 이름으로 인식된다. 그래서 뷰를 찾고 뷰가 랜더링 된다.

@RestController
- 반환 값으로 뷰를 찾는 것이 아니라,HTTP 메시지 바디에 바로 입력한다.
따라서 실행 결과로 ok 메세지를 받을 수 있다. @ResponseBody 와 관련이 있다.

 

 

 

로깅 간단히 알아보기

앞으로 로그를 사용할 것이기 때문에, 로그에 대해서 간단히 알아보자.

 

운영 시스템에서는 System.out.println() 같은 시스템 콘솔을 사용해서 필요한 정보를 출력하지 않고,
별도의 로깅 라이브러리를 사용해서 로그를 출력한다.

 

package hello.springmvc.basic;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class LogTestController {

    private final Logger log = LoggerFactory.getLogger(getClass());

    @RequestMapping("/log-test")
    public String logTest() {
        String name = "Spring";

        System.out.println("name = " + name);
        log.info(" info log={}", name);

        return "ok";
    }
}

결과 로그

 

※ 로그 레벨

TRACE > DEBUG > INFO > WARN > ERROR
  • 개발 서버는 debug 출력
  • 운영 서버는 info 출력

 

 


 

요청 매핑

 

HTTP 메서드

@RequestMapping 에 method 속성으로 HTTP 메서드를 지정하지 않으면,
HTTP 메서드와 무관하게 호출된다.

모두 허용 GET, HEAD, POST, PUT, PATCH, DELETE

 

 

HTTP 메서드 매핑

@RequestMapping(value = "/hello-basic", method = RequestMethod.GET)
public String helloBasic() {
    log.info("helloBasic");
    return "ok";
}

 

 

HTTP 메서드 매핑 축약

/**
 * 편리한 축약 애노테이션 (코드보기)
 * @GetMapping
 * @PostMapping
 * @PutMapping
 * @DeleteMapping
 * @PatchMapping
 */
@GetMapping(value = "/mapping-get-v2")
public String mappingGetV2() {
    log.info("mapping-get-v2");
    return "ok";
}

HTTP 메서드를 축약한 애노테이션을 사용하는 것이 더 직관적이다.

 

 

PathVariable(경로 변수) 사용

/**
 * PathVariable 사용
 * 변수명이 같으면 생략 가능
 * @PathVariable("userId") String userId -> @PathVariable userId
 */
@GetMapping("/mapping/{userId}")
public String mappingPath(@PathVariable("userId") String data) {
    log.info("mappingPath userId={}", data);
    return "ok";
}

 

 


 

요청 매핑 - API 예시

 

회원 관리를 HTTP API로 만든다 생각하고 매핑을 어떻게 하는지 알아보자.

회원 관리 API

  • 회원 목록 조회: GET /users
  • 회원 등록: POST /users
  • 회원 조회: GET /users/{userId}
  • 회원 수정: PATCH /users/{userId}
  • 회원 삭제: DELETE /users/{userId}

 

 


 

HTTP 요청 파라미터 - @RequestParam

 

● @ResponseBody

@ResponseBody 를 사용하면 응답 결과를 HTTP 메시지 바디에 직접 담아서 전달할 수 있다.
물론 이 경우에도 view를 사용하지 않는다.
// @RestController와 같은 효과
// @Controller에서도 뷰를 찾지 않음
// 원래 String 반환이면, 뷰를 찾음(@Controller에서)
@ResponseBody

 

 


 

HTTP 요청 파라미터 - @ModelAttribute

● 롬복 @Data
@Getter , @Setter , @ToString , 
@EqualsAndHashCode , @RequiredArgsConstructor를
자동으로 적용해준다.

 

 


 

HTTP 요청 메시지 - JSON

HTTP API에서 주로 사용하는 JSON 데이터 형식

 

 

 


 

HTTP 응답 - 정적 리소스, 뷰 템플릿

 

정적 리소스

예) 웹 브라우저에 정적인 HTML, css, js를 제공할 때는, 정적 리소스를 사용한다.

정적 리소스는 해당 파일을 변경 없이 그대로 서비스하는 것이다.

웹 브라우저에서 다음과 같이 실행하면 된다.
http://localhost:8080/basic/hello-form.html

 

 

뷰 템플릿 사용

예) 웹 브라우저에 동적인 HTML을 제공할 때는 뷰 템플릿을 사용한다.

뷰 템플릿을 거쳐서 HTML이 생성되고, 뷰가 응답을 만들어서 전달한다.

 

 

HTTP 메시지 사용

HTTP API를 제공하는 경우에는 HTML이 아니라 데이터를 전달해야 하므로,
HTTP 메시지 바디에 JSON 같은 형식으로 데이터를 실어 보낸다.

 

 


 

HTTP 응답 - HTTP API, 메시지 바디에 직접 입력

 

@RestController

@Controller 대신에 @RestController 애노테이션을 사용하면, 해당
컨트롤러에 모두 @ResponseBody 가 적용되는 효과가 있다.
따라서 뷰 템플릿을 사용하는 것이 아니라, HTTP 메시지 바디에 직접 데이터를 입력한다.
이름 그대로 Rest API(HTTP API)를 만들 때 사용하는 컨트롤러이다.

※ 참고로 @ResponseBody 는 클래스 레벨에 두면 전체 메서드에 적용되는데,
@RestController 에노테이션 안에 @ResponseBody 가 적용되어 있다.