Spring MVC 활용기

hoyong.eom·2023년 7월 13일
0

스프링

목록 보기
14/59
post-thumbnail

Spring

springMVC

war 패키징과는 달리 jar 패키징을 사용하게 되면 /resources/static/index.html 위치에 index.html을 두면 welcome page로 처리해준다. war 패키징을 사용하면 webapps 하위 경로를 사용했었다.

@Controller

@Controller 애노테이션을 사용하면 컨트롤러(핸들러)가 컴포넌트스캔의 대상이 되어서 스프링빈으로 등록된다.
@Controller내부에는 @RequestMapping과 @Component의 조합으로 구성된다.
따라서, @Controller가 붙은 클래스는 return 값은 뷰 이름으로 지정된다.

@RestController

@Controller와 달리 @RestController가 붙은 클래스에서의 리턴값은 Http 메시지 바디에 바로 입력된다.

log4j 사용시 주의사항

log4j를 이용해서 로깅을 하는 경우 아래와같이 사용하지 말아야한다.

log.info(" test log = " + "test"); ----> X
log.info(" test log = {}", "test"); ----> O

+연산은 불필요한 연산이 수행되기 떄문에 만약 trace 로그라면 로그를 출력하지도 않는데 연산을 수행하게 된다고 한다!!

@RequestMapping

RequestMapping 애노테이션을 이용해서 핸들러를 정의할수있다.
RequestMapping시에 MethodType을 지정하지 않으면 모든 메서드를 받을 수 있다. 그뿐만 아니라 URL 경로도 배열로 복사개도 지정이 가능하다.

하지만, 메서드 타입을 지정하지 않는건 지양해야하기 떄문에 스프링에서 GetMapping과 PostMapping 애노테이션을 지원한다.

RequestMapping에서의 PathVariable

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

0개의 댓글