Spring MVC - @RestController

지니·2023년 8월 20일
0

spring

목록 보기
9/13

@RestController는 주로 API를 통신하는 형태에서 많이 사용된다.

1. Spring Boot의 REST Controller

REST 개념

  • REST(Representational State Transfer)는 웹 서비스를 구현하는데 가장 널리 사용되는 아키텍처 스타일이다.

  • REST는 자원 지향 아키텍처(ROA)로, 웹 서비스는 자원(Resource)을 중심으로 설계되고 이들 자원에 대해 CRUD(Create, Read, Update, Delete) 연산을 수행한다.

  • Spring Boot에서는 이러한 RESTful 웹 서비스를 구현하기 위해 @RestController 어노테이션을 사용한다.


2. @RestController 어노테이션 설명

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {

	@AliasFor(annotation = Controller.class)
	String value() default "";

}

@RestController 어노테이션 설명

  • @Target(ElementType.TYPE)

    • 이 어노테이션은 클래스 레벨에서만 사용될 수 있다.
  • @Retention(RetentionPolicy.RUNTIME)

    • 이 어노테이션은 런타임에도 유지된다. 따라서 런타임에 리플렉션을 사용하여 이 어노테이션의 정보를 읽을 수 있다.
  • @Documented

    • 이 어노테이션은 Javadoc과 같은 문서에 포함된다.
  • @Controller

    • 이 어노테이션은 스프링의 @Controller 어노테이션을 포함하고 있으므로, 해당 클래스가 컨트롤러로 동작하게 된다.
  • @ResponseBody

    • 이 어노테이션 안에는 스프링의 @ResponseBody 어노테이션을 포함하고 있으므로, 메서드의 반환 값이 HTTP 응답 본문에 직접 작성된다.

@RestController 어노테이션의 속성설명

  • String value() default "";
    • 이 속성은 컴포넌트의 논리적 이름을 정할때 사용될 수 있으며, 자동 감지된 컴포넌트(빈)의 경우 스프링 빈으로 변환된다.

@RestController의 사용법 및 목적

  • @RestController 어노테이션은 RESTful 웹 서비스를 만드는 데 유용하다.
    • 이 어노테이션을 사용하면 @Controller@ResponseBody를 동시에 적용할 수 있으므로, HTTP 응답 본문에 직접 데이터를 작성할 수 있다.

버전 정보

  • 이 어노테이션은 스프링 4.0 버전부터 사용 가능하다.

정리

  • @RestController 어노테이션은 RESTful 웹 서비스를 쉽게 구현할 수 있게 해주는 편리한 어노테이션이다. 클래스 레벨에서 사용되며, 해당 클래스의 모든 메서드가 @ResponseBody의 의미를 가지게 된다.

  • 이를 통해 개발자는 HTTP 응답 본문에 직접 객체를 작성할 수 있으며, 이는 일반적으로 JSON 또는 XML 형식으로 클라이언트에 전송된다.


3. Rest Controller 사용 예시

먼저, Book 클래스를 만든다.

public class Book {
    private Long id;
    private String title;
    private String author;

    // 생성자, getter, setter 생략...
}

다음으로 Book 객체에 대한 CRUD 연산을 수행하는 REST 컨트롤러를 작성한다.

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/books")
public class BookController {

    private final BookService bookService; // 서비스 계층은 비즈니스 로직을 담당합니다.

    public BookController(BookService bookService) {
        this.bookService = bookService;
    }

    @GetMapping
    public List<Book> getAllBooks() {
        return bookService.getAllBooks();
    }

    @GetMapping("/{id}")
    public Book getBook(@PathVariable Long id) {
        return bookService.getBook(id);
    }

    @PostMapping
    @ResponseStatus(HttpStatus.CREATED)
    public Book createBook(@RequestBody Book book) {
        return bookService.createBook(book);
    }

    @PutMapping("/{id}")
    public Book updateBook(@PathVariable Long id, @RequestBody Book book) {
        return bookService.updateBook(id, book);
    }

    @DeleteMapping("/{id}")
    public void deleteBook(@PathVariable Long id) {
        bookService.deleteBook(id);
    }
}

완성된 코드 설명

  • getAllBooks():

    • 이 메소드는 HTTP GET 요청을 "/books" URL에 매핑하고, 모든 책의 목록을 반환한다.

    • @GetMapping 어노테이션은 이 메소드를 GET 요청에 매핑한다.

  • getBook(Long id):

    • 이 메소드는 특정 책을 반환한다.

    • @PathVariable 어노테이션을 이용해 URL 경로의 일부인 책의 ID를 메소드 매개변수로 전달한다.

  • createBook(Book book):

    • 이 메소드는 새로운 책을 생성한다.

    • @RequestBody 어노테이션을 사용해 HTTP 요청 본문을 Book 객체로 변환한다. @ResponseStatus(HttpStatus.CREATED) 어노테이션은 책이 성공적으로 생성되었을 때 HTTP 상태 코드 201(Created)를 반환하도록 지시한다.

  • updateBook(Long id, Book book):

    • 이 메소드는 특정 책의 정보를 수정한다.

    • 여기서도 @RequestBody와 @PathVariable 어노테이션을 사용하여 HTTP 요청 본문의 Book 객체와 URL 경로의 ID를 메소드 매개변수로 전달한다.

  • deleteBook(Long id):

    • 이 메소드는 특정 책을 삭제한다.

    • URL 경로의 ID는 @PathVariable 어노테이션을 통해 메소드 매개변수로 전달된다.

  • 위의 컨트롤러는 BookService 클래스에 의존하고 있으며, 이는 비즈니스 로직을 처리하는 서비스 계층이다. 실제 애플리케이션에서는 이 계층이 데이터베이스와 상호 작용하게 될 것이다. 이렇게 함으로써, 우리는 Spring Boot에서 REST 컨트롤러를 이용해 CRUD 연산을 수행하는 방법을 알게 되었다.
profile
탐구하는 Backend 개발자

0개의 댓글

관련 채용 정보