엄범

@RequestParam

```java

@RequestParam("name")

 

// ?name이 없어도 4** 뜨지 않음

@RequestParam(value="name", required=false) 

 

// ?name이 없으면 defaultValue 들어감

@RequestParam(value="name", defaultValue="unknown") 

```

  • queryString에서 파라미터를 하나 하나 받을 때 사용한다.
  • 그러다 보니 파라미터 여러개를 받을 때는 애너테이션 때문에 지저분해져서 부적합하다.
    • 아래 처럼 Map으로 받는 방식은 쓰지 않는 것이 좋다.
    • 대신 커맨드 객체(+ModelAttribute)를 사용하자.

```java

// 별로다. 커맨드 객체를 쓰자

@RequestParam HashMap<string,string> paramMap

```

 

@ModelAttribute

```java

public List<User> getUserList(UserSearch userSearch) {
    return userService.getUserList(userSearch);
}

```

  • 이렇게 아무것도 안쓰면, 알아서 파라미터를 UserSearch 클래스의 필드 이름으로 매핑해준다.
    • 이렇게 자동으로 매핑되어 반환되는 객체를 커맨드 객체라고 부른다.
  • `` @ModelAttribute`` 애너테이션을 명시하지 않더라도, 자동으로 매핑된다.
    • 이 애너테이션은 ``java @ModelAttribute("query")``와 같이 쓰면 jsp에서 `` query``로 데이터에 접근하도록 지정할 수 있다.
    • 꼭 저런 용도가 아니더라도 명시적으로 나타내기 위해서 붙여줄 수 있다.
    • `` @Valid``와 함께 쓴다.

 

@RequestBody

  • POST / PUT 등 바디를 통해 데이터 받을 때 쓴다.
  • Controller에서 `` @RequestBody``로 바로 객체로 매핑하는 경우, Spring은 생성자를 호출하는게 아니라 각각의 필드에 대해 setter를 호출해서 넣어준다!

 

기타 Controller와 관련된 애너테이션

  • ``java @ControllerAdvice``
    • 컨트롤러와 관련된 전역 적인 처리를 하고 싶을 때 사용
    • GlobalExceptionHandler 달 때 사용한다.