TIL(Today I Learned)

TIL 44th day

keepgoing 2021. 12. 5. 17:37

ResponseBody

  • RestController와 유사한 기능
  • HTTP 메시지 바디에 return 값을 출력해줌.

RequestParam

  • parameter 설정을 지원하는 어노테이션
  • request.getParameter와 같은 기능을 함
  • 요청 파라미터와 변수명이 같고, String, int, Integer 등 단순 타입일 시에 RequestParam을 선언하지 않아도 사용 가능

Required

  • 필수 값 true or false
  • Required = true여도 ''(빈문자)는 들어갈 수 있으므로 주의해야한다.

Integer와 int의 차이

  • int는 기본형이기 때문에 null이 들어갈 수 없다. (대신에 '0'이 들어감)(500 예외 발생)
  • Integer는 객체형이기 때문에 Null 값이 들어갈 수 있다.

DefaultValue

  • 파라미터 값이 전달되지 않았을 때, 기본 값인 defaultvalue를 넘겨주는 기능(사용자가 설정)
  • defaultvalue 설정 시, 사실상 required는 무의미해진다.
  • 빈 문자를 넘겨준 경우에도 defaultvalue 값을 넘겨준다.

RequestParamMap

  • 파라미터를 Map이나 MultiValueMap으로 사용할 수 있다.
  • Map은 키 값이 하나로 확실할 때 사용
  • MultiValueMap은 키 값이 여러개 일 때 사용한다.(해쉬함수)
    • 일반적으로 파라미터 값은 하나만 쓴다.

ModelAttribute

  • 실제 개발에서의 요청 파라미터를 받아서 필요한 객체를 만들고 그 객체 안에 값을 넣어줘야 하는 번거로운 과정을 생략하게 해주는 어노테이션
  • 모델 객체를 자동으로 생성하고, 요청 파라미터 값도 전부 자동으로 포함시켜준다.
  • 요청 파라미터 이름에 해당하는 객체의 프로퍼티를 찾고 setter를 호출해서 파라미터에 값을 입력(바인딩) 한다.
    • 예를 들어) 파라미터 이름이 username이면 setUsername() 메서드를 찾고, 호출하면서 값을 입력한다.
  • 참고) ModelAttribute를 생략할 수도 있다.
    • @RequestParam과 어떻게 구별할까?
      • @RequestParam은 String, int, Integer와 같읕 단순 타입일 때
      • 나머지 = @ModelAttribute(argument resolver로 지정해둔 타입 외)(argument resolver는 HttpServletResponse와 같은 것)

lombok

  • getter, setter 지원
  • toString 기능 지원
    • 객체를 toString으로 찍히게 해주는 기능

객체의 Property

  • 여기서 프로퍼티는 set.xxx, get.xxx를 의미
    • 프로퍼티 값을 변경하면 set.xxx
      • 프로퍼티 값을 호출하면 get.xxx

단순 텍스트 요청 메시지

  • InputStream으로 메시지 바디를 직접 보여줄 수 있다(바이트코드 -> String 형식으로 변환해줌).
  • OutputStream 또는 Writer로 메시지 바디에 직접 출력할 수 있다.
  • HttpEntity<>를 이용해서 자동으로 메시지 바디 text를 문자로 바꿔서 보여줌
    • 반환(응답)도 가능(Writer기능)
    • HTTP Header 또는 body를 간편하게(직접) 조회해준다.
    • view 조회 x(RestController)
    • RequestEntity<>로 사용 가능, ResponseEntity(응답)에는 상태 코드 삽입 가능
  • @RequestBody를 이용해서 HTTP 메시지 바디를 조회할 수 있도록 해준다.(가장 많이 사용)
    • 참고) header 정보가 필요하다면 Entity<>를 사용 또는 @RequestHeader 사용
  • @ResponseBody를 이용해 메시지 바디에 직접 응답할 수 있다.
  • Http 메시지 바디를 조회하거나 직접 응답하는 것은 당연하게도 요청 파라미터를 조회하는 @RequestParam 또는 @ModelAttribute와는 전혀 관계가 없다.(파라미터로 요청하거나 값이 저장되는 것이 전혀 아니기 때문)

InputStream

  • 바이트코드로 넘어가기 때문에 문자 변환 형식을 지정해줘야한다(UTF-8과 같은)(지정하지 않을 경우 기본 값으로 변환됨(권장 x))

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

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

RequestBody

  • @RequestBody에 직접 만든 객체를 지정할 수 있다.
    • HTTP 메시지 컨버터가 HTTP 메시지 바디의 내용을 우리가 원하는 문자나 객체로 변환해준다.
    • HTTP 메시지 컨버터는 문자 뿐만 아니라 JSON도 객체로 변환해준다.(맵핑해주는 과정 생략해줌)
  • 생략 x(생략은 @RequestParam 또는 @ModelAttribute만 가능하다.)
  • 이때 생성(지정)된 객체는 응답에도 데이터 형식으로(json) 반환 가능(HTTP 메시지 컨버터 사용)
  • 정리) @RequestBody 요청
    • Json 요청 -> HTTP 메시지 컨버터(josn을 처리하는, Accept : application/json) -> 객체
  • @ResponseBody 응답
    • 객체 -> HTTP 메시지 컨버터 -> Json 응답

GET, POST, HTTP API차이

  • GET과 POST는 요청 파라미터를 통해 값을 조회하거나 저장하는데 반면,
  • HTTP API는 메시지 바디에 데이터를 요청하거나 응답받는 방식이므로 어노테이션 사용이 다르다.
  • GET과 POST는 @RequestParam 또는 @ModelAttribute를 사용
  • HTTP API는 @RequestBody 또는 @ResponseBody 사용 (HttpEntity도 사용 가능)

Generic이란

  • 특정 타입을 지정하지 않고 외부에서 지정하는 타입을 자동 지정해주는 기능
  • 때문에 관리하기가 편하다.