Spring - @RestController

박민수·2023년 11월 14일
0

Spring

목록 보기
4/46
post-thumbnail

@RestController

@RestController는 @Controller에 @ResponseBody가 결합된 어노테이션이며, 주로 JSON 형태의 객체 데이터를 반환하는 용도로 사용한다. 주로 RESTful 웹 서비스를 만들 때 자주 사용된다.

@Controller, @RestController 차이

@Controller는 반환 값이 String이면 뷰 이름으로 인식해서 뷰를 찾고 뷰가 랜더링 되지만, 반면에 @RestController는 반환 값으로 뷰를 찾는 것이 아니라, HTTP 메시지 바디에 바로 입력한다.

@Controller

  • 반환 값이 String이면 뷰 이름으로 인식해서 뷰를 찾고 뷰가 랜더링된다.
  • 주로 HTML 뷰를 반환할 때 사용된다.
@Controller
public class MyController {
    @RequestMapping("/hello")
    public String hello() {
        return "hello"; // 뷰 이름 "hello"를 반환하여, hello.jsp 또는 hello.html을 찾음
    }
}

@RestController

  • 반환 값으로 뷰를 찾는 것이 아니라, HTTP 메시지 바디에 바로 데이터를 입력한다.
  • 주로 JSON 또는 XML 형식의 데이터를 반환할 때 사용된다.
@RestController
public class MyRestController {
    @RequestMapping("/hello")
    public String hello() {
        return "hello"; // 문자열 "hello"를 HTTP 메시지 바디에 그대로 반환
    }
    
    @RequestMapping("/user")
    public User getUser() {
        return new User("John", 30); // 객체를 반환하면 JSON 형식으로 변환되어 반환됨
    }
}

추가 내용

주요 용도

  • @RestController는 RESTful 웹 서비스에서 주로 사용되며, 클라이언트와 서버 간에 데이터를 주고받을 때 유용하다. 예를 들어, 모바일 애플리케이션이나 프론트엔드 자바스크립트 애플리케이션과 통신할 때 사용된다.

HTTP 메서드 매핑

  • @RestController를 사용하면 다양한 HTTP 메서드(GET, POST, PUT, DELETE 등)에 대한 매핑을 쉽게 할 수 있다.
@RestController
@RequestMapping("/api/users")
public class UserController {
    @GetMapping("/{id}")
    public User getUser(@PathVariable Long id) {
        return userService.findById(id);
    }
    
    @PostMapping
    public User createUser(@RequestBody User user) {
        return userService.save(user);
    }
    
    @PutMapping("/{id}")
    public User updateUser(@PathVariable Long id, @RequestBody User user) {
        return userService.update(id, user);
    }
    
    @DeleteMapping("/{id}")
    public void deleteUser(@PathVariable Long id) {
        userService.delete(id);
    }
}

@ResponseBody 생략

  • @RestController를 사용하면 각 메서드에 @ResponseBody를 생략할 수 있다. 모든 메서드가 기본적으로 HTTP 메시지 바디에 직접 데이터를 쓰기 때문이다.

예외 처리

  • @RestControllerAdvice를 사용하면 @RestController에서 발생하는 예외를 전역적으로 처리할 수 있다.
@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(ResourceNotFoundException.class)
    public ResponseEntity<String> handleNotFound(ResourceNotFoundException ex) {
        return new ResponseEntity<>(ex.getMessage(), HttpStatus.NOT_FOUND);
    }
}
profile
안녕하세요 백엔드 개발자입니다.

0개의 댓글