Controller에서 사용되는 Annotations

DongGyun Cho·2023년 3월 26일

Java/Spring/Annotation

목록 보기
5/7

출처:

오늘은 Controller 에서 사용되는 Annotations들을 정의해보기로 하겠다.

@Controller

해당 클래스가 Controller로 사용됨을 Spring Framework에 알린다.

@RestController

  • @Controller + @ResponseBody
  • @ResponseBody를 모든 메소드에 적용시킨다
    - 메소드의 반환 결과(문자열)를 JSON 형태로 반환한다.
  • @Controller 와 @RestController 의 차이
    • @Controller
      • API와 view를 동시에 사용하는 경우에 사용
      • 대신 API 서비스로 사용하는 경우는 @ResponseBody를 사용하여 객체를 반환한다.
      • view(화면) return이 주목적
    • @RestController
      • view가 필요없는 API만 지원하는 서비스에서 사용 (Spring 4.0.1부터 제공)
      • @RequestMapping 메서드가 기본적으로 @ResponseBody 의미를 가정한다.
      • data(json, xml 등) return이 주목적
      • 즉, @RestController = @Controller + @ResponseBody

@RequestMapping

해당 컨트롤러는 어떤 uri 요청을 처리할지 정의하기 위해 사용

@Controller
@RequestMapping("/home") // (1)
public class HomeController {
	@RequestMapping(method = RequestMethod.GET)
    public String getAllEmployees(Model model) {
    	... 
    }
	@RequestMapping(value = "/employees", method = RequestMethod.POST)
    public String addEmployee(Model model) {
    	... // (2)
    }
    
    @PostMapping() // (3)
    public String getAnEmployee(Model model) {
    	... 
    }
}

(1) Class Level Mapping
- 모든 메서드에 적용되는 경우 사용
- "/home"로 들어오는 모든 요청에 대한 처리를 해당 클래스에서 한다는 의미

(2) Handler Level Mapping
- 요청 uri에 대해 해당 메서드에서 처리해야 되는 경우
- "/home/employees" POST 요청에 대한 처리를 addEmployee()에서 한다는 것을 의미

(3) Handler Level Mapping2
- (2) 과 마찬가지로 요청 uri에 대해 해당 메서드에서 처리해야하는 경우 사용되며 좀더 간결하게 사용하도록 만들어졌다.
- 사용해야하는 HTTP METHOD에 알맞게 GET, POST, PUT, DELETE + Mapping() 을 사용한다.

@RequestParam

HTTP GET 요청에 대해 매칭되는 request parameter 값이 자동으로 들어간다.
- uri 뒤에 붙는 parameter 값을 가져올 때 사용한다.
- ex) http://localhost:8080/home?index=1&page=2

@GetMapping("/home")
    public String show(@RequestParam("page") int page) {
    	...
    }
  • 위의 경우 GET/home?index=1&page=2와 같이 uri가 전달될 때 page parameter를 받아 온다.

pathVariable

HTTP 요청에 대해 매칭되는 request parameter 값이 자동으로 들어간다.
- uri에서 각 구분자에 들어오는 값을 처리해야 할 때 사용한다.
- ex) http://localhost:8080/index/1
- REST API에서 값을 호출할 때 주로 많이 사용한다.

    @PostMapping("/indx/{idx}")
    @ResponseBody
    public boolean deletePost(@PathVariable("idx") int idx) {
    	return postService.deletePost(idx);
    }
  • 위의 경우 POST/index/{idx} 와 같이 uri가 전달될 때 해당하는 구분자 {idx} 를 받아온다.

EX) @RequestParam@PathVariable 동시 사용 예제

@GetMapping("/user/{userId}/invoices")
public List<Invoice> listUsersInvoices(@PathVariable("userId") int userId,
									  @RequestParam(value = "date", required = false) Date dateOrNull) {
                                      
}
  • 위의 경우 GET/user/{userId}/invoices?date=190101 같이 uri가 전달될 때
  • 구분자 {userId}는 @PathVariable("userId")로,
  • 뒤에 이어붙은 parameter는 @RequestParam("date")로 받아온다.

@RequsetBody

반드시 HTTP POST 요청에 대해서만 처리한다.
- HTTP POST 요청에 대해 request body에 있는 request message에서 값을 얻어와 매칭한다
- ReuqestData를 바로 Model 이나 클래스로 매핑한다.
- 이를테면 JSON 이나 XML 같은 데이터를 적절한 messageConverter로 읽을 때 사용하거나 POJO 형태의 데이터 전체로 받는 경우에 사용한다.(일반적으로 DTO로 받는다)

profile
끈기를 가지고 해보자.

0개의 댓글