엄범

@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

```

 

@RequestParam VS @PathVariable

자원 자체를 나타낼 때는 @PathVariable

orderBy나, filter 같은 조건을 명시하는 것에는 @RequestParam

근데 깔끔하게 설계가 잘 안되는 경우도 있으니까. 상황에 따라 맞춰서 사용하는 경우도 있음.

포함 관계가 아닐 때가 애매한데, 이는 검색 조건으로 보고 @RequestParam으로 처리하는 것이 매끄러운 것 같기도 함.

REST api / RESTful 이란.

 

@ModelAttribute

```java

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

```

  • URL 파라미터들을 UserSearch 클래스의 필드들로 매핑해준다.
    • 이렇게 자동으로 매핑되어 반환되는 객체를 커맨드 객체라고 부른다.
  • 이 애너테이션은 ``java @ModelAttribute("query")``와 같이 쓰면 jsp에서 `` query``로 데이터에 접근하도록 지정할 수 있다.

 

@RequestBody

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

 

애너테이션은 웬만하면 붙여주는 편이 명확하다.
  • @ModelAttribute를 명시하지 않아도 자동으로 URL 파라미터를 객체로 매핑해주고,
  • GET은 관례적으로 URL 파라미터로 데이터를 전달하기 때문에, 굳이 @ModelAttribute를 사용해야 하느냐 라고 생각할 수 있는데
  • Controller에서 GetMapping 메서드는 사실 (URL 파라미터/HTTP 바디) 양 쪽 모두 데이터를 받을 수 있다.
  • 그래서 `` @ModelAttribute / @RequestBody``를 명시해 주는 편이 좋다.

 

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