스프링 MVC-기능

김용빈·2022년 7월 12일
0

로깅 알아보기

로그 라이브러리는 Logback, Log4J, Log4J2 등등 수 많은 라이브러리가 있는데, 그것을 통합해서
인터페이스로 제공하는 것이 바로 SLF4J 라이브러리다.
쉽게 이야기해서 SLF4J는 인터페이스이고, 그 구현체로 Logback 같은 로그 라이브러리를 선택하면 된다.
실무에서는 스프링 부트가 기본으로 제공하는 Logback을 대부분 사용한다

로그가 출력되는 포멧 확인

  • 시간, 로그 레벨, 프로세스 ID, 쓰레드 명, 클래스명, 로그 메시지
  • 로그 레벨 설정을 변경해서 출력 결과는
    LEVEL: TRACE > DEBUG > INFO > WARN > ERROR
  • 개발 서버는 debug 출력, 운영 서버는 info 출력하는 경우가 많음

하지만 로그를 사용하기 위해 위와같이 적기 귀찮다!!!
그래서 나온게 @Slf4j

올바른 로그 사용법
log.debug("data="+data)
로그 출력 레벨을 info로 설정해도 해당 코드에 있는 "data="+data가 실제 실행이 되어 버린다. 결과적으로 문자 더하기 연산이 발생한다.
log.debug("data={}", data)
로그 출력 레벨을 info로 설정하면 아무일도 발생하지 않는다. 따라서 앞과 같은 의미없는 연산이발생하지 않는다. 그러므로 하단의 로그방법을 사용해야함!!!


요청매핑

@RequestMapping("/hello-basic")
/hello-basic URL 호출이 오면 이 메서드가 실행되도록 매핑한다. 대부분의 속성을 배열[] 로 제공하므로 다중 설정이 가능하다. {"/hello-basic", "/hello-go"}

@Pathvariable 경로 매핑!

// 이렇게 다중으로도 사용가능 의미는 유저스의 아이디,주문들의 주문수량
@GetMapping("/mapping/users/{userId}/orders/{orderId}")
public String mappingPath(@PathVariable String userId, @PathVariable Long orderId)

요청매핑을 API로 어떻게 넘겨 받을까?

// RequestMapping을 활용해 중복 지우기!


HTTP 요청이 보내는 데이터들을 스프링 MVC로 어떻게 조회할까? 및 다양한 파라미터

우선 HTTP요청이 오는 방법에 대해서 알아보자

클라이언트에서 서버로 요청 데이터를 전달할 때는 주로 다음 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

@RequestParam

@RequestParam을 사용하면 요청파라미터를 매우 편리하게 사용할 수 있다

URL의 키값과 연동되서 값을 저장
//요청에 맞게 결과송출


주의사항

  • 파라미터 이름만 있고 값이 없는 경우 빈문자로 통과
  • null 을 int 에 입력하는 것은 불가능(500 예외 발생)
  • 따라서 null 을 받을 수 있는 Integer 로 변경하거나, 또는 다음에 나오는 defaultValue 사용

파라미터를 map으로 조회할 수 있다!!

  • 모든값을 다 받고 싶을떄 Map을 쓰고 value값을 Object로 받는다.

HTTP 요청파라미터 필요한 객체로 만들고 값 넣어주기

  • 기존에는 새로운 객체를 만들어 값을 할당했다

  • modelattribute를 사용하면?

마법처럼 HelloData 객체가 생성되고, 요청 파라미터의 값도 모두 들어가 있다.

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

객체에 getUsername() , setUsername() 메서드가 있으면, 이 객체는 username 이라는 프로퍼티를
가지고 있다.
username 프로퍼티의 값을 변경하면 setUsername() 이 호출되고, 조회하면 getUsername() 이
호출된다.

class HelloData {getUsername();setUsername();
}

ModelAttribute는 생략가능!

HTTP 요청메세지 - Message body에 데이터담아 요청할시

  • HTTP API에서 주로 사용 , 타입은 JSON (POST,PATCH,PUT)
    요청 파라미터와 다르게, HTTP 메시지 바디를 통해 데이터가 직접 넘어오는 경우는 @RequestParam , @ModelAttribute 를 사용할 수 없다.


이렇게 깔끔하게 spring이 변환까지 다해줌

정리!

스프링 MVC는 다음 파라미터를 지원한다.

  • HttpEntity: HTTP header, body 정보를 편리하게 조회
    메시지 바디 정보를 직접 조회
    요청 파라미터를 조회하는 기능과 관계 없음 @RequestParam X, @ModelAttribute X
    HttpEntity는 응답에도 사용 가능
    메시지 바디 정보 직접 반환,헤더 정보 포함 가능,view 조회X
  • HttpEntity 를 상속받은 다음 객체들도 같은 기능을 제공한다.
    RequestEntity ,HttpMethod, url 정보가 추가, 요청에서 사용
    ResponseEntity HTTP 상태 코드 설정 가능, 응답에서 사용
return new ResponseEntity<String>("Hello World", responseHeaders, 
HttpStatus.CREATED

HTTP메세지바디 읽고 응답하기 가장 간편하고 쉬운 방법

  • @RequestBody
    @RequestBody 를 사용하면 HTTP 메시지 바디 정보를 편리하게 조회할 수 있다. 참고로 헤더 정보가필요하다면 HttpEntity 를 사용하거나 @RequestHeader 를 사용하면 된다.

  • 이렇게 메시지 바디를 직접 조회하는 기능은 요청 파라미터를 조회하는 @RequestParam ,
    @ModelAttribute 와는 전혀 관계가 없다


HTTP 요청메세지 - JSON

값을 JSON형식으로 넘겨줄떄 주의할점은 반환타입을 반환클래스로 해야한다.

응답 데이터

응답 데이터의 3가지 방법

  • 정적 리소스
    예) 웹 브라우저에 정적인 HTML, css, js를 제공할 때는, 정적 리소스를 사용한다.
  • 뷰 템플릿 사용
    예) 웹 브라우저에 동적인 HTML을 제공할 때는 뷰 템플릿을 사용한다.
  • HTTP 메시지 사용
    HTTP API를 제공하는 경우에는 HTML이 아니라 데이터를 전달해야 하므로, HTTP 메시지 바디에
    JSON 같은 형식으로 데이터를 실어 보낸다.
  • 뷰템플릿 응답사용

  • HTTP 메세지사용

// @Responsebody를 클래스 위에 붙이면 전체다 Responsebody가 적용됨
// @Controller와 Responsebody합친것이 RestController

  • responseBodyJsonV1
    ResponseEntity 를 반환한다. HTTP 메시지 컨버터를 통해서 JSON 형식으로 변환되어서 반환된다.

  • responseBodyJsonV2
    ResponseEntity 는 HTTP 응답 코드를 설정할 수 있는데, @ResponseBody 를 사용하면 이런 것을
    설정하기 까다롭다.

  • @ResponseStatus(HttpStatus.OK) 애노테이션을 사용하면 응답 코드도 설정할 수 있다.
    물론 애노테이션이기 때문에 응답 코드를 동적으로 변경할 수는 없다. 프로그램 조건에 따라서 동적으로
    변경하려면 ResponseEntity 를 사용하면 된다.

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

profile
안녕하세요!

0개의 댓글