war 패키징과는 달리 jar 패키징을 사용하게 되면 /resources/static/index.html 위치에 index.html을 두면 welcome page로 처리해준다. war 패키징을 사용하면 webapps 하위 경로를 사용했었다.
@Controller 애노테이션을 사용하면 컨트롤러(핸들러)가 컴포넌트스캔의 대상이 되어서 스프링빈으로 등록된다.
@Controller내부에는 @RequestMapping과 @Component의 조합으로 구성된다.
따라서, @Controller가 붙은 클래스는 return 값은 뷰 이름으로 지정된다.
@Controller와 달리 @RestController가 붙은 클래스에서의 리턴값은 Http 메시지 바디에 바로 입력된다.
log4j를 이용해서 로깅을 하는 경우 아래와같이 사용하지 말아야한다.
log.info(" test log = " + "test"); ----> X
log.info(" test log = {}", "test"); ----> O
+연산은 불필요한 연산이 수행되기 떄문에 만약 trace 로그라면 로그를 출력하지도 않는데 연산을 수행하게 된다고 한다!!
RequestMapping 애노테이션을 이용해서 핸들러를 정의할수있다.
RequestMapping시에 MethodType을 지정하지 않으면 모든 메서드를 받을 수 있다. 그뿐만 아니라 URL 경로도 배열로 복사개도 지정이 가능하다.
하지만, 메서드 타입을 지정하지 않는건 지양해야하기 떄문에 스프링에서 GetMapping과 PostMapping 애노테이션을 지원한다.
RequestMapping시에 URL에 전달된 식별자값 PathVariable 기능으로 보다 쉽게 조회가 가능하다.
/**
* PathVariable 사용
* 변수명이 같으면 생략 가능
*
* @PathVariable("userId") String userId -> @PathVariable String userId
* /mapping/userA
*/
@GetMapping("/mapping/{userId}")
public String mappingPath(@PathVariable("userId") String data) {
log.info("mappingPath userId={}", data);
return "ok";
}
또한, 1개의 PathVariable 뿐만 아니라 여러개의 PathVariable도 사용이 가능하다.
/**
* PathVariable 사용 다중
*/
@GetMapping("/mapping/users/{userId}/orders/{orderId}")
public String mappingPath(@PathVariable String userId, @PathVariable Long orderId) {
log.info("mappingPath userId={}, orderId={}", userId, orderId);
return "ok";
}
이외에도 여러가지 Request Mapping에 제약조건을 걸 수 있는데 아래와 같다.
// Request Parameter로 mode=debug가 들어있어야 호출됨.
@GetMapping(value = "/mapping-param", params = "mode=debug")
// Request Header에 mode=debug가 있어야 호출됨.
@GetMapping(value = "/mapping-header", headers = "mode=debug")
// Request Header에 content-type이 application/json 이어야 호출됨.
consumes의 의미는 현재 서버입장에서 Request를 소비함을 의미함.
@PostMapping(value = "/mapping-consume", consumes = MediaType.APPLICATION_JSON_VALUE)
// Request Header에 accept가 text/html이어야함.
@PostMapping(value = "/mapping-produce", produces = MediaType.TEXT_HTML_VALUE)
해당 포스팅은 아래의 강의를 학습 한 후 정리한 내용입니다.
김영한님의 스프링MVC