스프링 MVC - 기본 기능

ttaho·2023년 5월 4일
0

Spring-MVC

목록 보기
5/6

로깅

운영 시스템에서는 System.out.println() 같은 시스템 콘솔을 사용하지 않고 별도의 로깅 라이브러리를 사용해서 로그를 출력한다
@Slf4j를 사용하면 log를 사용할 수 있다.

로그 사용시 장점

  • 쓰레드 정보, 클래스 이름 같은 부가 정보를 함께 볼 수 있고, 출력 모양을 조정할 수 있다.
  • 로그 레벨에 따라 개발 서버에서는 모든 로그를 출력하고, 운영서버에서는 출려갛지 않는 등 로그를 상황에 맞게 조절할 수 있다.
  • 시스템 아웃 콘솔에만 출력하는 것이 아니라, 파일이나 네트워크 등, 로그를 별도의 위치에 남길 수 있다. 특히 파일로 남길 때는 일별, 특정 용량에 따라 로그를 분할하는 것도 가능하다.
  • 성능도 일반 System.out보다 좋다. (내부 버퍼링, 멀티 쓰레드 등등) 그래서 실무에서는 꼭 로그를 사용해야 한다.

요청 매핑

@RestController

  • @Controller는 반환 값이 String 이면 뷰 이름으로 인식된다. 그래서 뷰를 찾고 뷰가 랜더링 된다.
  • @RestController는 반환 값으로 뷰를 찾는 것이 아니라, HTTP 메시지 바디에 바로 입력한다.

@RequestMapping("/hello-basic")

  • /hello-basic URL호출이 오면 이 메서드가 실행되도록 매핑한다.
  • @RequestMapping에 method 속성으로 HTTP 메서드를 지정하지 않으면 HTTP 메서드와 무관하게 호출된다.
  • 모두 허용: GET,HEAD,POST,PUT,PATCH,DELETE

HTTP 메서드 매핑 축약

  • @GetMapping, @PostMapping, @PutMapping, @DeleteMApping, @PatchMapping 등 메서드를 축약해서 사용 가능하다. 축약한 애노테이션이 더 직관적이므로 사용하자.

PathVariable(경로 변수) 사용

  • 최근 HTTP API는 다음과 같이 리소스 경로에 식별자를 넣는 스타일을 선호한다.
  • /mapping/userA
  • /users/1
  • @RequestMapping은 URL 경로를 템플릿화 할 수 있는데, @PathVariable을 사용하면 매칭 되는 부분을 편리하게 조회할 수 있다.
  • @PathVariable의 이름과 파라미터 이름이 같으면 생략할 수 있다.

PathVariable 사용 - 다중

HTTP 요청 파라미터 - 쿼리 파라미터, HTML Form

클라이언트에서 서버로 요청 데이터를 전달할 때는 주로 다음 3가지 방법을 사용한다.

  • GET - 쿼리 파라미터
    • /url?username=hello&age=20
    • 메시지 바디 없이, URL의 쿼리 파라미터에 데이터를 포함해서 전달
    • 예) 검색, 필터, 페이징등에서 많이 사용하는 방식
  • POST - HTML Form
    • content-type:application/x-www-form-urlencoded
    • 메시지 바디에 쿼리 파라미터 형식으로 전달 username=hello&age=20
    • 예) 회원 가입, 상품 주문, HTML Form 사용
  • HTTP message body에 데이터를 직접 담아서 요청
    • HTTP API에서 주로 사용, JSON, XML, TEXT
    • 데이터 형식은 주로 JSON 사용
    • POST, PUT, PATCH

GET - 쿼리 파라미터

이런 방식으로 요청 파라미터 조회가 가능하다.
반환 타입이 없으면서 이렇게 응답에 값을 직접 집어넣으면, view 조회X

POST - HTML Form

테스트용 form을 만들자.
main/resources/static/basic/hello-form.html

HTTP 요청 파라미터 - @RequestParam

스프링이 제공하는 @RequestParam을 사용하면 요청 파라미터를 매우 편리하게 사용할 수 있다.

파라미터 이름이 변수 이름과 같으면 @RequestParam(name="xx") 생략가능

파라미터를 Map, MultiValueMap으로 조회할 수 있다.

HTTP 요청 파라미터 - @ModelAttribute

실제 개발을 하면 요청 파라미터를 받아서 필요한 객체를 만들고 그 객체에 값을 넣어주어야 한다. 보통 다음과 같이 코드를 작성할 것이다.

@RequestParam String username;
@RequestParam int age;

HelloData data = new HelloData();
data.setUsername(username);
data.setAge(age);

스프링은 이 과정을 완전히 자동화해주는 @ModelAttribute 기능을 제공한다.
먼저 요청 파라미터를 바인딩 받을 객체를 만들자.

@ModelAtrribute가 있으면 다음을 실행한다.

  • HelloData 객체를 생성한다.
  • 요청 파라미터의 이름으로 HelloData 객체의 프로퍼티를 찾는다. 그리고 해당 프로퍼티의 setter를 호출해서 파라미터의 값을 입력(바인딩) 한다.
  • 예) 파라미터 이름이 username 이면 setUsername() 메서드를 찾아서 호출하면서 값을 입력한다.

HTTP 요청 메시지 - 단순 텍스트

  • 먼저 가장 단순한 텍스트 메시지를 HTTP 메시지 바디에 담아서 전송하고, 읽어보자.

@RequestBody를 사용하면 HTTP 메시지 바디 정보를 편리하게 조회할 수 있다.
@ResponseBody를 사용하면 응답 결과를 HTTP 메시지 바디에 직접 담아서 전달할 수 있다.

HTTP 요청 메시지 - JSON

@RequestBody 객체 파라미터

@RequestBody에 직접 만든 객체를 지정할 수 있다.
@RequestBody를 생략하면 @ModelAttribute가 적용되어 버리므로 HTTP 메시지 바디가 아니라 요청 파라미터를 처리하게 되므로 생략하지 말자!

@ResponseBody
응답의 경우에도 @ResponseBody를 사용하면 해당 객체를 HTTP 메시지 바디에 직접 넣어줄 수 있다.

  • @RequestBody 요청
    • JSON 요청 -> HTTP 메시지 컨버터 -> 객체
  • @ResponseBody 응답
    • 객체 -> HTTP 메시지 컨버터 -> JSON 응답
profile
백엔드 꿈나무

0개의 댓글