Heestory

05.Spring-MVC)기본 기능 본문

개발(~국비)/Spring

05.Spring-MVC)기본 기능

까만밀가루 2022. 11. 5. 17:49

@RestController : 반환 값으로 HTTP메시지 바디에 바로 입력

@Controller : 반환 값이 String이면 뷰 이름으로 인식, 뷰를 찾고 뷰가 렌더링

 +@ResponseBody 추가하면 @RestController 역할 가능

 

 

@RequestMapping

  • 다중 설정이 가능하며, 배열로 제공
  • method를 별도 지정하지 않으면 HTTP 메서드와 무관하게 모두 허용

 

@PathVariable(경로변수) 사용

:이름과 파라미터 이름이 같으면 생략할 수 있다.

 

 

consumes , produces

  • consumes : 클라이언트가 서버에서 보내는 데이터 타입, Request Body에 담는 타입을 제한
  • produces : 서버가 클라이언트에게 반환하는 데이터 타입

 

@RequestParam

  • @RequestParam("username") String memberName = request.getParameter("username")
  • HTTP 파라미터 이름이 변수 이름과 같으면 @RequestParam(name="xx")생략 가능
  • String, int , Integer 등의 단순 타입이면 @RequestParam 생략 가능
  • required=true 명시할 경우 파라미터 필수 
    - 파라미터 이름만 있고 값이 없는 경우는 빈문자(" ")로 통과, NULL과 다르다! 
  • 기본형 null 입력시 Integer나 dafaultValue를 사용하자

 

@ModelAttribute

  • 요청 파라미터를 받아서 필요한 객체를 만들고 그 객체에 값을 넣어주어야 한다.
  • String, int, Integer과 같은 단순 타입을 제외한 경우 사용

 

 HTTP 요청 메시지 - 단순메시지 

HTTP message body에 데이터를 직접 담아서 요청

  • HTTP API에서 주로 사용, JSON, XML, TEXT
  • 데이터 형식은 주로 JSON 사용
  • POST, PUT, PATCH

HTTP 메시지 바디에 직접 조회 및 출력 : InputStream(Reader) / OutputStream(Writer)

 

HttpEntity 

  • HTTP header, body 정보를 편리하게 조회, 바디 정보를 직접 조회
  • 요청 파라미터를 조회하는 기능과 관계 없음(@RequestParam, @ModelAttribute)
  • RequestEntity, ResponseEntity 기능 제공

 

@RequestBody (생략 불가)

HTTP 메시지 바디 정보를 편리하게 조회

헤더 정보가 필요할 땐 HttpEntity 사용하거나 @RequestHeader 사용

 

@ResponseBody (생략 불가)

응답 결과를 HTTP 메시지 바디에 직접 담아서 전달, 이 경우에도 view를 사용하지 않는다.

 

 

HTTP 요청 메시지 - JSON

: 문자로 된 JSON 데이터를 Jackson 라이브러리인 objectMapper를 사용해서 자바 객체로 변환

  • @RequestBody 요청
    JSON 요청 → HTTP 메시지 컨버터 → 객체
  • @ResponseBody 응답
    객체 → HTTP 메시지 컨버터 → JSON 응답

 

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

  • 정적 리소스 : 웹 브라우저에 정적인 HTML, css, js를 제공할 때, 정적 리소스를 사용 
    /static, /public, /resources, /META-INF, /resources
  • 뷰 템플릿 src/main/resources/templates

String을 반환하는 경우 @ResponseBody가 없으면 뷰 리졸버가 실행되어서 뷰를 찾고 렌더링 한다.

Void를 반환하는 경우 : HTTP 메시지 바디를 처리한느 파라미터가 없으면 요청 URL을 참고해서 논리 뷰 이름으로 사용

 

 

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

HTML이 아닌 데이터를 전달해야하므로 JSON과 같은 데이터를 실어 보낸다.

@RestController : @Controller + @ResponseBody 
Rest API(HTTP API)를 만들 때 사용하는 컨트롤러

 


요청 파라미터 vs HTTP 메시지 바디

  • 요청 파라미터를 조회하는 기능 : @RequestParam, @ModelAttribute
  • HTTP 메시지 바디를 직접 조회하는 기능 : @RequestBody

 

HTTP 메시지 컨버터 

1.사용되는 경우

HTTP 요청 : @RequestBody, HttpEntity(RequestEntity)

HTTP 응답 : @ResponseBody, HttpEntity(ResponseEntity)

 

2.대상 클래스와 미디어 타입(content-type) 체크

 

3.일치하면 read() 호출해서 객체 생성 및 반환 / wrtie()를 호출해서 HTTP 응답 메시지 바디에 데이터를 생성

 

 

요청 매핑 헨들러 어뎁터 구조

애노테이션 기반의 컨트롤러는 다양한 파라미터를 사용하게 함

 

ArgumentResolver

컨트롤러(핸들러)가 필요로 하는 다양한 파라미터의 값(객체)를 생성

→ 파라미터의 값이 모두 준비되면 컨트롤러를 호출하면서 값을 넘겨준다.

이때 HTTP 메시지 컨버터를 사용해서 필요한 객체를 생성

 

ReturnValueHandler : 응답값을 반환하고 처리

 

 

로그

  • 올바른 사용법
    log.debug("data+"+data)  X
    log.debug("data={}",data) : 불필요한 연산이 발생하지 않아 이렇게 쓴다

  • 로그 사용시 장점
    - 쓰레드 정보, 클래스 이름 같은 부가 정보를 함께 볼 수 있고 , 출력 모양을 조정 할 수 있다.
    - 로그 레벨에 따라 개발 서버는 모든 로그를 출력하고, 운영 서버에서는 출력하지 않는 등 로그를 상황에 맞게 조절할 수 있다.
    - 시스템 아웃 콜솔에만 출력하는 것이 아니라, 파일이나 네트워크 등, 로그를 별도의 위치에 남길 수 있다.
    - 일반적으로 System.out 보다 성능이 좋다.
  • 로글 레벨 : TRACE > DEBUG > INFO > WARN > ERROR