Spring MVC 기본기능-경로매핑

강정우·2023년 12월 4일
0

Spring-boot

목록 보기
31/73

Jar vs War

  • Jar를 사용하면 항상 내장 서버(톰캣등)를 사용하고, webapp 경로도 사용하지 않는다.
    내장 서버 사용에 최적화 되어 있는 기능이다.
    War를 사용하면 내장 서버도 사용가능 하지만, 주로 외부 서버에 배포하는 목적으로 사용한다.

  • spring boot는 /resources/static/index.html 위치에 index.html을 위치해두면 자동으로 Index 페이지를 지정해준다.

RequestMapping

@RestController
@Slf4j
public class MappingController {
    @RequestMapping( {"/hello-basic", "/hello-go"})
    public String helloBasic() {
        log.info("helloBasic");
        return "ok";
    }
}
  • 위코드는 /hello-basic URL 호출이 오면 이 메서드가 실행되도록 매핑한다.
    대부분의 속성을 배열[] 로 제공하므로 다중 설정이 가능하다. {"/hello-basic", "/hello-go"}

경로변수

/**
 * PathVariable 사용
 * 변수명이 같으면 생략 가능
 * @PathVariable("userId") String userId -> @PathVariable String userId
*/
@GetMapping("/mapping/{userId}")
public String mappingPath(@PathVariable("userId") String data) {
    log.info("mappingPath userId={}", data);
    return "ok";
}
  • 그리고 만약 url의 경로변수와 해당 메서드의 변수가 같다면 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";
}

파라미터 매핑

  • 또한 @GetMapping 끝단에 params 속성을 붙여 조건에 따라 요청을 수행하도록 조건을 부여할 수도 있다. (근데 거의 사용 안 함)
/**
 * 파라미터로 추가 매핑
 * params="mode",
 * params="!mode"
 * params="mode=debug"
 * params="mode!=debug" (! = )
 * params = {"mode=debug","data=good"}
 */
@GetMapping(value = "/mapping/users/{userId}/orders/{orderId}", params = "mode=debug")

특정 헤더 조건 매핑

/**
 * 특정 헤더로 추가 매핑
 * headers="mode",
 * headers="!mode"
 * headers="mode=debug"
 * headers="mode!=debug" (! = )
 */
@GetMapping(value = "/mapping-header", headers = "mode=debug")
public String mappingHeader() {
    log.info("mappingHeader");
    return "ok";
}

미디어 타입 조건 매핑

/**
 * Content-Type 헤더 기반 추가 매핑 Media Type
 * consumes="application/json"
 * consumes="!application/json"
 * consumes="application/*"
 * consumes="*\/*"
 * MediaType.APPLICATION_JSON_VALUE
 */
@PostMapping(value = "/mapping-consume", consumes = "application/json")
public String mappingConsumes() {
    log.info("mappingConsumes");
    return "ok";
}
  • HTTP 요청의 Content-Type 헤더를 기반으로 미디어 타입으로 매핑한다.
    만약 맞지 않으면 HTTP 415 상태코드(Unsupported Media Type)을 반환한다
consumes = "text/plain"
consumes = {"text/plain", "application/*"}
consumes = MediaType.TEXT_PLAIN_VALUE
  • 또한 이렇게 여러개의 타입을 지정할 수도 있다.
/**
 * Accept 헤더 기반 Media Type
 * produces = "text/html"
 * produces = "!text/html"
 * produces = "text/*"
 * produces = "*\/*"
 */
@PostMapping(value = "/mapping-produce", produces = "text/html")
public String mappingProduces() {
    log.info("mappingProduces");
    return "ok";
}
  • 그리고 위 consumes는 말그대로 받는 사람 입장에서 보낸 req의 헤더에 해당 타입이 명시되어있어야하고 반대로 produces는 http req의 header에 accept 타입이 명시되어있어야한다.
    이때 만약 명시가 안 되어있다면 406 not-accepable 에러를 낼 것이다.

  • 참고 produce든, consumes든 그냥 string으로 적는 것 보단,
    타입으로 작성하는 것이 더 좋다.

경로 매핑

@RestController
@RequestMapping("/mapping/users")
public class MappingClassController {
    /**
     * GET /mapping/users
     */
    @GetMapping
    public String users() {
        return "get users";
    }
    /**
     * POST /mapping/users
     */
    @PostMapping
    public String addUser() {
        return "post user";
    }
    /**
     * GET /mapping/users/{userId}
     */
    @GetMapping("/{userId}")
    public String findUser(@PathVariable String userId) {
        return "get userId=" + userId;
    }
    /**
     * PATCH /mapping/users/{userId}
     */
    @PatchMapping("/{userId}")
    public String updateUser(@PathVariable String userId) {
        return "update userId=" + userId;
    }
    /**
     * DELETE /mapping/users/{userId}
     */
    @DeleteMapping("/{userId}")
    public String deleteUser(@PathVariable String userId) {
        return "delete userId=" + userId;
    }
}
profile
智(지)! 德(덕)! 體(체)!

0개의 댓글