REST API란 무엇일까?

청포도봉봉이·2023년 6월 8일
0

Spring

목록 보기
18/32
post-thumbnail

REST API

REST(API)는 Representational State Transfer(표현 상태 전송)의 약자로, 웹 서비스를 구축하고 통신하기 위한 아키텍처 스타일입니다. REST는 HTTP 프로토콜을 기반으로 하며, 클라이언트와 서버 간의 통신을 위한 규칙과 제약을 제시합니다.

REST API는 네트워크를 통해 클라이언트가 서버와 상호작용할 수 있는 인터페이스를 제공합니다. 클라이언트는 HTTP 요청(GET, POST, PUT, DELETE 등)을 사용하여 서버의 리소스에 접근하고 조작합니다. 서버는 이러한 요청을 받아들이고 적절한 응답을 반환합니다.


REST API의 주요 특징

  • Stateless (무상태성): 서버는 클라이언트의 상태를 저장하지 않습니다. 각각의 요청은 클라이언트의 모든 필요한 정보를 포함하고 있어야 합니다. 서버는 독립적인 요청 단위로 작업을 수행하며, 클라이언트는 세션 유지 등의 추가적인 관리 없이 각각의 요청에 대한 응답을 받을 수 있습니다.

  • 리소스 중심성: REST는 리소스를 중심으로 설계되어야 합니다. 리소스는 서버에서 제공되는 모든 것을 나타내며, 일반적으로 URL로 표현됩니다. 클라이언트는 리소스의 식별자(URI)를 사용하여 리소스에 접근하고 조작합니다.

  • 표현적 상태 전송 (Representational State Transfer): 클라이언트와 서버 간의 통신은 리소스의 표현을 전송함으로써 이루어집니다. 리소스의 표현은 일반적으로 JSON 또는 XML 형식으로 이루어집니다. 클라이언트는 서버로부터 받은 표현을 기반으로 다음 동작을 결정합니다.

  • 일관적인 인터페이스: REST API는 통일된 인터페이스를 사용하여 클라이언트와 서버 간의 상호작용을 정의합니다. 일반적으로 HTTP 메서드(GET, POST, PUT, DELETE 등)를 사용하여 리소스에 대한 작업을 지정하고, HTTP 상태 코드를 사용하여 요청의 성공 또는 실패를 나타냅니다.


REST API의 예시

REST API의 예시는 CRUD(Create, Read, Update, Delete) 작업을 수행하는 API입니다. 이를 통해 클라이언트는 게시물을 생성, 조회, 수정, 삭제할 수 있습니다.

GET

게시물 목록 조회 (GET /posts): 모든 게시물을 조회하는 엔드포인트입니다. 클라이언트는 이 엔드포인트에 GET 요청을 보내면 서버는 모든 게시물의 목록을 응답으로 반환합니다.

특정 게시물 조회 (GET /posts/{id}): 특정 게시물을 조회하는 엔드포인트입니다. 클라이언트는 게시물의 고유 식별자(ID)를 URL에 포함하여 GET 요청을 보내면 서버는 해당 게시물의 정보를 응답으로 반환합니다.

POST

게시물 생성 (POST /posts): 새로운 게시물을 생성하는 엔드포인트입니다. 클라이언트는 이 엔드포인트에 POST 요청을 보내면 서버는 요청에 포함된 데이터를 기반으로 새로운 게시물을 생성합니다.

PUT

게시물 수정 (PUT /posts/{id}): 특정 게시물을 수정하는 엔드포인트입니다. 클라이언트는 게시물의 고유 식별자(ID)를 URL에 포함하고 수정할 내용을 요청 본문에 포함하여 PUT 요청을 보내면 서버는 해당 게시물을 수정합니다.

DELETE

게시물 삭제 (DELETE /posts/{id}): 특정 게시물을 삭제하는 엔드포인트입니다. 클라이언트는 게시물의 고유 식별자(ID)를 URL에 포함하여 DELETE 요청을 보내면 서버는 해당 게시물을 삭제합니다.


Example Code

@RestController
@RequestMapping("/posts")
public class PostController {
    
    private List<Post> posts = new ArrayList<>(); // 가정: 게시물을 리스트로 저장하는 데이터베이스 대용
    
    // 게시물 목록 조회
    @GetMapping
    public List<Post> getAllPosts() {
        return posts;
    }
    
    // 게시물 생성
    @PostMapping
    public ResponseEntity<String> createPost(@RequestBody Post newPost) {
        // 새로운 게시물 생성 로직
        posts.add(newPost);
        return ResponseEntity.ok("게시물이 성공적으로 생성되었습니다.");
    }
    
    // 특정 게시물 조회
    @GetMapping("/{id}")
    public ResponseEntity<Post> getPostById(@PathVariable int id) {
        // ID에 해당하는 게시물 조회 로직
        Post post = findPostById(id);
        if (post != null) {
            return ResponseEntity.ok(post);
        } else {
            return ResponseEntity.notFound().build();
        }
    }
    
    // 게시물 수정
    @PutMapping("/{id}")
    public ResponseEntity<String> updatePost(@PathVariable int id, @RequestBody Post updatedPost) {
        // ID에 해당하는 게시물 수정 로직
        Post post = findPostById(id);
        if (post != null) {
            // 게시물 수정 코드
            // updatedPost의 필드를 사용하여 게시물을 업데이트
            return ResponseEntity.ok("게시물이 성공적으로 수정되었습니다.");
        } else {
            return ResponseEntity.notFound().build();
        }
    }
    
    // 게시물 삭제
    @DeleteMapping("/{id}")
    public ResponseEntity<String> deletePost(@PathVariable int id) {
        // ID에 해당하는 게시물 삭제 로직
        Post post = findPostById(id);
        if (post != null) {
            posts.remove(post);
            return ResponseEntity.ok("게시물이 성공적으로 삭제되었습니다.");
        } else {
            return ResponseEntity.notFound().build();
        }
    }
    
    // ID에 해당하는 게시물 조회 메소드
    private Post findPostById(int id) {
        // ID에 해당하는 게시물을 리스트에서 찾는 로직
        // 가정: 리스트에서 ID를 기반으로 게시물을 찾아 반환
        for (Post post : posts) {
            if (post.getId() == id) {
                return post;
            }
        }
        return null;
    }
}
profile
자존감 낮아질 시간에 열심히 학습하고 커밋하자

0개의 댓글