Spring MVC는 DispatcherServlet 코드의 변경 없이 기능 변경 및 확장이 가능ㅎ다ㅏ. (대부분 interface로 만들어졌기 때문)
-> interface를 implements 하여 구현하면 내가 만든 클래스를 사용할 수 있다(다형성)
@Component
@Slf4j
Slf4j는 인터페이스이며, 그 구현체로 Logback같은 라이브러리를 선택한다.
실제 개발에서는 Spring Boot가 기본으로 제공하는 Logback을 대부분 사용한다.
이젠 System.out.println();
이 아닌 해당 어노테이션을 통해 로그를 찍어서 확인해봐야한다. (설정 파일에 설정 해둬야함 얌파일이면 얌파일에, properties라면 해당 파일)
로그를
log.tarc("문자 trace={}", sparta);
log.info("문자 info " + sparta);
+
는 문자열과 문자열을 더해주는 것이며, 출력하지 않게 설정했음에도 불구하고 (문자열 연산은 무조건 하게 되어있다)불필요한 동작을 수행하게 되기 때문에 항상 로그를 사용할 때는 {}
를 써서 치환해주게끔 코드를 구성하는 것이 중요하다.
객체를 로그 찍으면, 객체의 주소 값이 로깅으로 출력되는 것을 확인할 수 있다.
@Controller
View가 있는 경우에만 사용한다.
@RestController
응답할 Data가 있는 경우에만 사용한다.
URL
DeleteMapping, PostMapping이렇게 바로 어노테이션을 붙이면 되는거 아닌가 ?
-> 이러한 것들의 Target은 Method Level이다.
반면에, @Request Mapping 의 Target은 class, method 레벨에 적용이 가능하다.
즉, 쉽게 말해 클래스 레벨에서는 Request Mapping을 쓰면 되는 것이고, 메서드 레벨에서는 @GetMapping
등 직관적인 어노테이션을 쓰면 된다는 말이다.
이것은 3 가지 방법 이외에는 없기 때문에 꼭 외우주시는 것이 좋습니다!
HTTP 요청이 들어오고, 컨트롤러에서 @RequestBody 혹은 HttpEntity 파라미터 사용하는 상황
MessageConverter가 메시지를 읽을 수 있는 확인하기 위해 canRead() 메서드 호출 (대상 클래스 타입을 지원하는지, HTTP 요청의 Content-Type 미디어 타입을 지원하는지 체크)
canRead() 조건을 만족할 경우 read() 메서드를 호출해서 객체 생성 후 반환
컨트롤러에서 @ResponseBody 혹은 HttpEntity로 값이 반환되는 상황
MessageConverter가 메시지를 쓸 수 있는지 확인하기 위해 canWrite() 메서드 호출 (대상 클래스 타입을 지원하는지, HTTP 요청의 Accept 미디어 타입을 지원하는지 체크)
canWrite() 조건을 만족할 경우 write() 메서드를 호출해서 HTTP 응답 메시지 바디 내 데이터 생성
ByteArrayHttpMessageConverter
StringHttpMessageConverter
MappingJackson2HttpMessageConverter
byte [] 데이터 처리
클래스 타입: byte []
미디어 타입: /
HTTP 요청 예시: @RequestBody byte [] example
HTTP 응답 예시: @ResponeBody return byte[] (쓰기 MediaType: application/octet-stream)
String 문자열로 데이터 처리
클래스 타입: String
미디어 타입: /
HTTP 요청 예시: @RequestBody String example
HTTP 응답 예시: @ResponseBody return example (쓰기 MediaType: text/plain)
@RequestMapping
String stringHttpMessageConverterExample(@RequestBody String example){
return example;
}
application/json 처리
클래스 타입: 객체 또는 HashMap
미디어 타입: application/json
HTTP 요청 예시: @RequestBody Example example
HTTP 응답 예시: @ResponseBody return example (쓰기 MediaType: application/json)
reference : https://jaimemin.tistory.com/1823