Programming/Java

[Spring] 스프링부트 REST API 관련 Annotation

dev seon 2024. 11. 4. 00:09

REST란?

REpresentational State Transfer

웹에서 컴퓨터 간 표준을 제공하는 아키텍처 스타일로 6가지 특징이 있다.

 

1. 균일한 인터페이스

2. 클라이언트-서버 분리

3. 무상태

4. 캐시 가능성

5. 계층화된 시스템 아키텍처

6. 코드 온디맨드

 

즉, RESTful한 설계란, 클라이언트와 서버가 서로 독립적이며 서로에게 영향을 주지 않아야 한다.

또한 각 요청에 필요한 정보를 포함하여 무상태성을 유지해야 한다.

이러한 원칙에 따라 설계한 API가 REST API이다.

 

REST의 구성 요소에는 자원(resource), HTTP 메서드, 표현(representation)이 있다.

- 자원 : URI (Uniform Resource Identifier)로 경로를 구분한다.

- HTTP 메서드 : CRUD 작업에 대해 정의한다. (GET / POST / PUT / PATCH / DELETE)

- 표현 : JSON, XML 등을 통해 클라이언트와 서버 간 자원의 상태를 전달하는 방법이다.

 

REST API란?

REST API는 HTTP URI를 통해 제어할 자원을 명시하고

HTTP Method를 통해 자원을 제어하는 명령을 내리는 방식의 아키텍처이다.

 


 

기존 스프링 MVC 패턴의 Service에서는 요청 처리를 하고 데이터를 뷰로 만들어 반환하였으나

REST API를 적용할 경우 데이터를 JSON이나 XML 형식으로 전달한다.

즉, REST API를 적용함으로써 백엔드와 프론트엔드가 구분될 수 있다.

프론트에서 API 요청을 보내면 백엔드에서 응답으로 데이터를 보내준다.

 

REST API 관련 Annotation

스프링부트에서 REST API를 설계하기 위해서는 아래와 같은 Annotation이 필요하다.

 

1. @ResponseBody

기존의 Controller는 뷰를 반환했지만 데이터를 반환하기 위해서는 이 annotation이 필요하다.

이 annotation을 적용하면 JSON, XML 등 형식으로 응답에 담아 클라이언트에게 데이터를 전송할 수 있다.

@Controller + @ResponseBody 두 Annotation의 기능을 합쳐 @RestController를 사용할 수도 있다.

 

2. 요청 메서드 mapping

@GetMapping / @PostMapping / @PutMapping / @PatchMapping / @DeleteMapping

HTTP 메서드에 따라 annotation을 다르게 사용한다.

Get은 데이터를 조회하기 위해,

Post는 데이터를 생성하기 위해,

Delete는 데이터를 삭제하기 위해,

그리고 Put과 Patch는 데이터를 수정하기 위해 사용한다.

Put은 명시하지 않은 값을 빈 값으로 만들지만

Patch는 명시한 값만 수정한다는 차이가 있다.

 

3. @PathVariable

URI 일부를 변수로 가져와 메서드의 파라미터로 사용할 때 사용한다.

예를 들어 /board/{id}와 같은 방식으로 매핑을 한 뒤에

{id}를 꺼내오고 싶을 때 PathVariable을 쓴다.

변수가 두 개 이상일 경우에는 어떤 데이터를 가져오는지 꼭 명시해주자!

 

4. @RequestBody

HTTP 요청 본문에 포함된 데이터를 자바 객체로 변환할 때 사용한다.

클라이언트에서 전송한 데이터가 JSON 형태일 경우에는 @RequestBody를 사용해 받는다.

반대로 form-data 형식으로 전송할 경우에는 @ModelAttribute를 사용해 받을 수 있다.

 

5. @ResponseEntity

HTTP 응답을 나타내는 클래스로 상태 코드와 헤더, 본문을 설정할 수 있다.

사용하는 방법은 다양하다.

return ResponseEntity.status(HttpStatus.OK).body("...");
return ResponseEntity.status(HttpStatus.OK).build();
return ResponseEntity.ok("...");
return new ResponseEntity("...", HttpStatus.OK);

 

6. @CrossOrigin

교차 출처 리소스 공유, CORS 에러를 해결하기 위해 사용하는 annotation이다.

CORS란 웹 어플리케이션의 리소스가 자신의 출처와 다를 때 교차 출처 요청을 실행한다.

예를 들어, 서버는 8000번, 클라이언트는 3000번일 때 포트가 달라 문제가 생길 수 있다.

요청이 들어오는 것까진 가능하지만 응답을 받을 때 문제가 생긴다.

서버 측에서 적용하고 싶은 path와 method를 설정하여 CORS를 해결할 수 있다.