SpringBoot
REST API
김윤지.
2024. 10. 28. 10:51
REST API 구현하기
REST란?
Representatinal State Transfer 의 약자로 자원을 이름으로 구분한 상태(정보)를 주고 받는 것을 말한다.
- 자원(Resource): 소프트웨어가 관리하는 모든 것 ( 데이터, 이미지, 문서 등등)
- 표현(Representation): 해당 자원을 표현하기 위한 이름( students : [학생정보…] )
- 상태 전달 : 클라이언트에서 정보를 요청하면 해당 정보를 ( students : [학생정보…] ) 이런 상태로 전달한다. 이때 데이터의 타입은 XML, JSON이다.
REST의 개념
- 어떤 자원에 대해 CRUD 연산을 수행하기 위해 URI(Resource)로 GET, POST 등의 방식(Method)을
사용하여 요청을 보내고, 요청을 위한 자원은 특정한 형태로 표현된다.
- restful: restAPI로 구현한 시스템을 지칭하는 용어
REST API MODEL
REST API 란?
RESTful API는 두 컴퓨터 시스템이 인터넷을 통해 정보를 안전하게 교환하기 위해 사용하는 인터페이스이다.
클라이언트와 서버 간의 독립성을 보장하므로 유연하고 확장 가능한 애플리케이션을 구축하는 데 유용하며, 다양한 언어와 프레임워크에서 지원되고 있음.
- rest 제약 조건
- 클라이언트-서버 : 구현 방식이 클라이언트와 서버 구조이다.(웹애플리케이션)
- 무상태 : 상태가 없으므로 다른 요청들에 영향을 받지 않는다.(각각의 요청이 독립적으로 처리되므로 클라이언트에 대한 상태를 저장할 필요가 없어 더 많은 클라이언트를 동시에 처리할 수 있다 )
- 캐시 가능성 : 캐시 가능을 정의하여, 동일한 자원을 계속 요청할 경우 클라이언트가 임시로 데이터를 저장하여 재사용하게 함
- 일관적인 인터페이스: 리소스에 접근하는 방식, 요청, 응답의 형식이 일관되어야 한다.
- 레이어 시스템 : 요청이 바로 중앙서버로 가지 않고, 중간 서버들을 거쳐서 처리되도록 하는 시스템(클라이언트의 요청에 따라 인증서버, 캐싱 서버, 로드 밸런서 등에 영향을 미치지 않도록 한다.- 보안성, 확장성,유연성 향상)
REST API 설계 규칙
- URL 규칙
- 마지막에 / 포함하지 않는다. http://api.test.com/list/ → http://api.test.com/list
- _언더바 대신에 - 대쉬를 사용한다.
http://api.test.com/list_test → http://api.test.com/list-test - 소문자를 사용한다.
http://api.test.com/listTest → http://api.test.com/listtest - 행위는 URL 에 포함하지 않는다. (method : post, get, put, delete)
http://api.test.com/delete-post/1 → http://api.test.com/post/1
2. REST API HTTP 메소드
- GET : 리소스의 세부 정보를 가져온다.
- POST : 새 리소스를 생성한다.
- PUT : 지정된 URI 에 리소스를 만들거나 수정한다.
- DELETE : 지정된 URI의 리소스를 제거한다.
리소스 | POST | GET | PUT | DELETE |
/customers | 새 고객 만들기 | 모든 고객 검색 | 고객 대량 업데이트 | 모든 고객 제거 |
/customers/1 | Error | 고객 1에 대한 세부 정보 검색 | 고객 1이 있는 경우 고객 1의 세부 정보 업데이트 | 고객 1 제거 |
/customers/1/orders | 고객 1에 대한 새 주문 만들기 | 고객 1에 대한 모든 주문 검색 | 고객 1의 주문 대량 업데이트 | 고객 1의 모든 주문 제거 |
Spring boot Controller에서 REST API HTTP 메소드 사용 예시
@RestController
@RequestMapping("/users")
public class UserController {
// 사용자 정보 조회
@GetMapping("/{userId}")
public ResponseEntity<User> getUser(@PathVariable Long userId) {
// userId에 해당하는 사용자 정보 조회
User user = userService.getUser(userId);
// ResponseEntity객체: HTTP응답 제어기능을 제공하는 객체로 클라이언트로 전달되는 값은
// → user{K:V,K:V..} 와 200코드이다. 클라이언트에서는 response.state로 200값을 받을 수 있다.
return ResponseEntity.ok(user);
}
// 사용자 정보 등록
@PostMapping
public ResponseEntity<User> createUser(@RequestBody User user) {
// 사용자 정보 등록
User savedUser = userService.createUser(user);
return ResponseEntity.ok(savedUser);
}
// 사용자 정보 수정
@PutMapping("/{userId}")
public ResponseEntity<User> updateUser(@PathVariable Long userId, @RequestBody User user) {
// userId에 해당하는 사용자 정보 수정
User updatedUser = userService.updateUser(userId, user);
return ResponseEntity.ok(updatedUser);
}
// 사용자 정보 삭제
@DeleteMapping("/{userId}")
public ResponseEntity<Void> deleteUser(@PathVariable Long userId) {
// userId에 해당하는 사용자 정보 삭제
userService.deleteUser(userId);
return ResponseEntity.noContent().build();
}
}
REST API 구현하기 [ CORS란? ]
- CORS(Cross-Origin Resource Sharing)는 보안 상의 이유로 동일한 출처(origin)를 가지지 않는 다른 도메인 간의 리소스 공유를 제한하는 브라우저의 정책입니다.
따라서, Open API를 사용할 때, 클라이언트에서 다른 도메인의 서버로 요청을 보낼 때 CORS 정책에 따라 요청이 차단될 수 있습니다.