티스토리 뷰

반응형

Controller?

Controller는 사용자의 요청을 받아 그에 맞는 동작을 하도록 연결하거나, 응답을 받기를 원하는 것을 돌려주는 역할을 한다.

요청을 분석하고, 처리된 결과를 가공하여 돌려주는 것이 핵심이다.

@Controller

클래스에 @Controller 어노테이션을 붙여주면 클래스를 Controller로 만들 수 있다.

주로 JSP 등을 이용한 View를 return할 때 사용하며, Json 등 데이터 객체를 반환하기 위해서는, @ResponseBody를 추가로 붙여주면 된다.

 

@Controller
class PostController() {
	@GetMapping
	fun post() = "post.jsp 디렉토리 경로"
}

 

@RestController

Controller에서 View를 사용하지 않을 때. 혹은, View에 대한 의존성을 가지고 싶지 않을 때. Json 형태로 데이터 객체만을 반환하게 하기 위해서 사용한다.

View를 반환하고 싶다면, ModelAndView타입을 반환하면 된다.

@RestController
class PostController() {
	@GetMapping
	fun getPosts() = listOf(
		Post()
	)
}

 

 

아래는 @Controller와 @RestController의 구현상 차이이다.

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {
    @org.springframework.core.annotation.AliasFor(annotation = org.springframework.stereotype.Component.class)
    java.lang.String value() default "";
}

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
    @org.springframework.core.annotation.AliasFor(annotation = org.springframework.stereotype.Controller.class)
    java.lang.String value() default "";
}

 

@RestController는 @Controller에 @ResponseBody가 추가된 것이다.

그리고, @Component를 통해 Bean에 등록된다.

 

HTTP 메서드 지정하기

Controller의 각 메서드에 어노테이션을 지정하여 어떤 http 메서드를 사용할지 지정할 수 있다.

각 메서드의 기능은 아래 포스팅에서 정리해두었다.

 

[HTTP] HTTP 메시지의 구조, 메서드, 응답 코드

HTTP 메시지는 시작 줄, 헤더, 본문 3부분으로 구성된다. 본문은 필요에 따라 있을 수도, 없을 수도 있다. 헤더의 Content-Length 필드는 본문의 크기를 표시한다. 요청 메시지 구조 응답 메시지 구조

sm-jeon-develop.tistory.com

  • @GetMapping: 서버의 리소스를 요청할 때 사용한다.
  • @PostMapping: 요청하는 데이터를 처리할 때, 주로 리소스를 등록할 때 사용한다.
  • @PatchMapping: 리소스를 부분 변경할 때 사용한다.
  • @PutMapping: 리소스를 대체하거나, 대체할 리소스가 없으면 등록할 때 사용한다.
  • @DeleteMapping: 리소스를 삭제할 때 사용한다.
  • @RequestMapping: 기타 메서드를 사용하거나, 한 메서드에 http 메서드를 여러개 지할 때 사용한다.

 

경로 지정하기

 

@XXXMapping 어노테이션을 사용하여 요청의 URL을 지정할 수 있다.

@RequestMapping을 클래스(Controller)에 사용하면 해당 클래스의 경로를 한번에 지정할 수 있고,

메소드에 @GetMapping 등을 사용하면 해당 메서드의 클래스에 지정된 경로 하위의 경로를 지정할 수 있다.

 

@RestController
@RequestMapping("/api")
class PostController() {
	@GetMapping("/get")
	fun getMethod() {} // .../api/get
    
	@PostMapping("/post")
	fun postMethod() {} // .../api/post
}

 

요청으로부터 값 받아오기

  • @PathVariable: URL의 경로를 변수로 사용한다.
  • @RequestParam: 쿼리스트링을 변수로 사용한다.
  • @RequestBody: Body를 변수로 사용한다.
@RestController
@RequestMapping("/api")
class PostController() {
	@GetMapping("/get/{id}")
	fun getMethod(@PathVariable("id")id: Int) {} // .../api/get/(id에 대한 int값)
    
	@GetMapping("/get")
	fun getQueryString(@RequestParam("p") id: Int {} // .../api/get?p=(p에 대한 int값)
    
	@PostMapping("/post")
	fun postMethod(@RequestBody post: Post) {} // .../api/post Post객체를 json형태로 받음
}

응답 코드 지정하기

HTTP의 요청의 응답에는 요청에 관한 상태를 코드로 반환한다. (200, 401, 404, 500 등..)

이때, Controller의 메서드나 Exception 등에 @ResponseStatus 어노테이션을 활용하여 응답 코드를 지정할 수 있다.

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함