스프링 MVC 1편

최혜정

Updated:

Intro

안녕하세요. 최혜정 사원입니다. 스프링 MVC 1편 강의를 보고 정리한 내용입니다.

1. RequestMapping(요청 매핑) 이란?

요청이 왔을 때 어떤 컨트롤러가 호출이 되어야 하는지 알려주는 지표 같은 것

 @RestController
 @Slf4j
 public class Mapping{
      @RequestMapping("/hello-basic")
    	public String helloBasic() {
        	log.info("helloBasic");
          return "ok";
      }
  }

이렇게 매핑을 하면 localhost:8080/hello-basic으로 url을 입력했을 경우에 이것에 해당하는 메서드가 실행된다.

RequestMapping은 다중 요청도 가능하다 다중 요청을 하려면 배열로 묶어야 한다.

@RequestMapping(value = {"/hello", "/hello-basic"})

1-1. HTTP 메서드

@RequestMapping에 method 속성으로 HTTP 메서드를 지정하지 않으면 HTTP 메서드와 무관하게 호출된다.
모두 허용 GET, POST, PUT, PATCH, DELETE

@RequestMapping(value = "/hello-basic", method = RequestMethod.GET)

2. HTTP 메서드 매핑 축약

HTTP 메서드를 축약한 애노테이션을 사용하는 것이 더 직관적이다.

  • @GetMapping
  • @PostMapping
  • @PutMapping
  • @DeleteMapping
  • @PatchMapping
@GetMapping(value = "/hello-basic")

3. 경로변수(PathVariable) 사용

최근 HTTP API는 리소스 경로에 식별자를 넣는 스타일을 선호한다.
쿼리 파마리터로 식별자를 넣는 방법도 있지만 경로 변수를 사용하는 것이 매핑되는 부분을 편리하게 조회할 수 있다.

  • url 자체에 값이 들어가있다.
  • /mapping/userA
  • /users/1
@GetMapping("/mapping/{userId}")
public String mappingPath(@PathVariable("userId") String data) {
    log.info("mappingPath userId={}", data);
    return "ok";
}

localhost:8080/mapping/userA 라고 입력하면 userId가 data로 매칭돼서 편하게 사용할 수 있다.

변수명이 같으면 생략 가능

@GetMapping("/mapping/{userId}")
public String mappingPath(@PathVariable userId)

3-1. 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";
}

4. @ModelAttribute

요청 파라미터를 받아서 필요한 객체를 만들고 그 객체에 값을 넣어주어야 한다.
보통 @RequestParam을 사용해서 값을 받고, set을 사용해서 값을 넣어주곤 하지만 이 과정을 자동화시켜주는 것이 @ModelAttribute이다.

요청 파라미터를 바인딩 받을 객체

@Data
public class HelloData {
    private String username;
    private int age;
}

롬복 @Data : @Getter , @Setter , @ToString , @EqualsAndHashCode , @RequiredArgsConstructor 를 자동으로 적용해준다.

@ModelAttribute를 사용하지 않을 때

public void item(@RequestParam String username,
                 @RequestParam int age) {
    HelloData helloData = new HelloData();
    helloData.setUsername(username);
    helloData.setAge(age);
    
    log.info("username={}, age={}", helloData.getUsername(), helloData.getAge());
    return "ok";
}

@ModelAttribute를 사용할 때

@ResponseBody
@RequestMapping("/model-attribute-v1")
public String modelAttributeV1(@ModelAttribute HelloData helloData) {
    log.info("username={}, age={}", helloData.getUsername(), helloData.getAge());
    return "ok";
}
  • HelloData 객체를 생성한다.
  • 요청 파라미터의 이름으로 HelloData 객체의 프로퍼티를 찾는다. 그리고 해당 프로퍼티의 setter를 호출해서 파라미터의 값을 입력(바인딩) 한다.
  • 파라미터 이름이 username 이면 setUsername() 메서드를 찾아서 호출하면서 값을 입력한다.

5. 요청 매핑 - API 예시

@RestController
@RequestMapping("/mapping/users")
public class MappingClassController {

    @GetMapping
    public String user() {
        return "get users";
    }

    @PostMapping
    public String addUser() {
        return "post user";
    }

    @GetMapping("/{userId}")
    public String findUser(@PathVariable String userId) {
        return "get userId = " + userId;
    }

    @PatchMapping("/{userId}")
    public String updateUser(@PathVariable String userId) {
        return "update userId = " + userId;
    }

    @DeleteMapping("/{userId}")
    public String deleteUser(@PathVariable String userId) {
        return "delete userId = " + userId;
    }
}
  • 회원 목록 조회: GET /mapping/users
  • 회원 등록: POST /mapping/users
  • 회원 조회: GET /mapping/users/id1
  • 회원 수정: PATCH /mapping/users/id1
  • 회원 삭제: DELETE /mapping/users/id1

Leave a comment