REST API는 웹 서비스의 설계 원칙 중 하나로, 클라이언트와 서버 간의 데이터 전송을 HTTP 프로토콜을 통해 수행하는 방법론입니다. REST(Representational State Transfer)는 자원의 표현을 전달한다는 의미로, 웹 애플리케이션의 아키텍처 스타일을 정의합니다. REST API는 REST 원칙을 준수하여 설계된 API를 의미하며, 주로 웹 애플리케이션 간의 통신을 위해 사용됩니다.
REST API의 기본 원칙
REST API는 여러 원칙과 제약 조건을 기반으로 설계됩니다. 주요 REST 원칙은 다음과 같습니다:
클라이언트-서버 구조:
- 클라이언트와 서버는 서로 독립적으로 동작합니다.
- 클라이언트는 서버에게 요청을 보내고, 서버는 클라이언트에게 응답을 제공합니다.
무상태성(Stateless):
- 각 요청은 독립적이며, 요청 간에 상태를 저장하지 않습니다.
- 클라이언트의 상태는 모든 요청에 포함되어야 하며, 서버는 각 요청을 독립적으로 처리합니다.
캐시 가능(Cachable):
- 서버 응답은 캐시가 가능하도록 설계되어야 합니다.
- HTTP 헤더를 통해 응답의 캐시 가능 여부를 명시할 수 있습니다.
계층화 시스템(Layered System):
- 클라이언트와 서버 사이에 중간 레이어(프록시, 게이트웨이 등)를 추가하여 확장성과 보안을 높일 수 있습니다.
통일된 인터페이스(Uniform Interface):
- 리소스를 식별하고 조작하기 위한 일관된 인터페이스를 제공해야 합니다.
- URI를 통해 자원을 명확히 식별하며, HTTP 메서드를 통해 자원을 조작합니다.
코드 온 디맨드(Optional):
- 서버에서 클라이언트로 코드를 전송하여 클라이언트가 실행할 수 있도록 할 수 있습니다. (예: 자바스크립트)
HTTP 메서드
REST API는 HTTP 메서드를 통해 클라이언트와 서버 간의 상호작용을 정의합니다. 주요 HTTP 메서드는 다음과 같습니다:
- GET: 서버로부터 리소스를 조회할 때 사용됩니다. (데이터 조회)
- POST: 서버에 새로운 리소스를 생성할 때 사용됩니다. (데이터 생성)
- PUT: 서버의 리소스를 업데이트할 때 사용됩니다. (데이터 전체 업데이트)
- PATCH: 서버의 리소스를 부분적으로 업데이트할 때 사용됩니다. (데이터 일부 업데이트)
- DELETE: 서버의 리소스를 삭제할 때 사용됩니다. (데이터 삭제)
REST API의 리소스 설계
REST API에서 리소스는 URI를 통해 식별됩니다. 리소스의 URI는 일관된 규칙을 따라야 하며, 명확하고 직관적으로 설계되어야 합니다. 일반적인 URI 설계 방식은 다음과 같습니다:
/resources # 모든 리소스 목록 조회
/resources/{id} # 특정 리소스 조회
/resources/{id}/sub # 하위 리소스 조회
예제: 도서 관리 시스템 REST API
다음은 도서 관리 시스템의 REST API 예제입니다:
- GET /books: 모든 도서 목록 조회
- GET /books/{id}: 특정 도서 조회
- POST /books: 새로운 도서 추가
- PUT /books/{id}: 특정 도서 정보 업데이트
- PATCH /books/{id}: 특정 도서의 일부 정보 업데이트
- DELETE /books/{id}: 특정 도서 삭제
JSON 형식의 응답 예시
REST API는 주로 JSON(JavaScript Object Notation) 형식으로 데이터를 주고받습니다. JSON은 경량 데이터 교환 형식으로, 읽기 쉽고 기계 해석이 용이합니다.
GET /books/1 응답 예시:
{
"id": 1,
"title": "The Great Gatsby",
"author": "F. Scott Fitzgerald",
"publishedDate": "1925-04-10"
}
POST /books 요청 예시:
{
"title": "1984",
"author": "George Orwell",
"publishedDate": "1949-06-08"
}
REST API 구현
REST API는 다양한 언어와 프레임워크를 사용하여 구현할 수 있습니다. 여기서는 Java를 사용한 REST API 구현 예제를 간단히 소개하겠습니다.
Java Spring Boot를 사용한 REST API 구현
Spring Boot는 RESTful 웹 서비스를 쉽게 구현할 수 있는 프레임워크입니다. Spring Boot를 사용하면 최소한의 설정으로 REST API를 개발할 수 있습니다.
프로젝트 설정
Spring Initializr를 통해 프로젝트를 생성합니다.
- 웹 애플리케이션으로 설정하고,
Spring Web
의존성을 추가합니다.
- 웹 애플리케이션으로 설정하고,
프로젝트 구조:
src/main/java ├── com.example.demo │ ├── DemoApplication.java │ ├── BookController.java │ └── Book.java
REST API 코드 예제
Book.java (모델 클래스)
package com.example.demo;
public class Book {
private Long id;
private String title;
private String author;
private String publishedDate;
// 기본 생성자
public Book() {}
// 매개변수가 있는 생성자
public Book(Long id, String title, String author, String publishedDate) {
this.id = id;
this.title = title;
this.author = author;
this.publishedDate = publishedDate;
}
// Getter와 Setter 메서드
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getPublishedDate() {
return publishedDate;
}
public void setPublishedDate(String publishedDate) {
this.publishedDate = publishedDate;
}
}
BookController.java (컨트롤러 클래스)
package com.example.demo;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
@RestController
@RequestMapping("/books")
public class BookController {
private List<Book> books = new ArrayList<>();
public BookController() {
books.add(new Book(1L, "The Great Gatsby", "F. Scott Fitzgerald", "1925-04-10"));
books.add(new Book(2L, "1984", "George Orwell", "1949-06-08"));
}
// 모든 도서 조회
@GetMapping
public List<Book> getAllBooks() {
return books;
}
// 특정 도서 조회
@GetMapping("/{id}")
public Book getBookById(@PathVariable Long id) {
return books.stream()
.filter(book -> book.getId().equals(id))
.findFirst()
.orElseThrow(() -> new RuntimeException("Book not found"));
}
// 새로운 도서 추가
@PostMapping
public Book addBook(@RequestBody Book book) {
book.setId((long) (books.size() + 1));
books.add(book);
return book;
}
// 도서 정보 업데이트
@PutMapping("/{id}")
public Book updateBook(@PathVariable Long id, @RequestBody Book book) {
Book existingBook = getBookById(id);
existingBook.setTitle(book.getTitle());
existingBook.setAuthor(book.getAuthor());
existingBook.setPublishedDate(book.getPublishedDate());
return existingBook;
}
// 도서 삭제
@DeleteMapping("/{id}")
public void deleteBook(@PathVariable Long id) {
books.removeIf(book -> book.getId().equals(id));
}
}
Spring Boot 애플리케이션 실행
- DemoApplication.java: Spring Boot 애플리케이션의 진입점입니다.
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
Spring Boot 애플리케이션을 실행한 후 브라우저 또는 Postman과 같은 도구를 사용하여 REST API를 테스트할 수 있습니다.
REST API의 장단점
장점
확장성: REST API는 클라이언트와 서버의 확장이 용이하며, 서로 독립적으로 발전할 수 있습니다.
다양한 클라이언트 지원: REST API는 웹, 모바일, 데스크톱 등 다양한 플랫폼에서 사용될 수 있습니다.
표준화된 프로토콜: HTTP 표준을 기반으로 하므로, 다양한 도구와 라이브러리를 활용할
수 있습니다.
캐시 가능: 응답을 캐시할 수 있어 성능을 개선할 수 있습니다.
단점
- 복잡한 요청 처리: 클라이언트가 상태 정보를 저장해야 하므로, 복잡한 요청의 경우 클라이언트 쪽 코드가 복잡해질 수 있습니다.
- 통신 오버헤드: HTTP 프로토콜의 오버헤드로 인해, 대량의 데이터를 처리하는 경우 비효율적일 수 있습니다.
- 버전 관리: API의 버전 관리를 잘못할 경우, 클라이언트와의 호환성 문제가 발생할 수 있습니다.
결론
REST API는 현대 웹 애플리케이션 개발에서 널리 사용되는 기술입니다. 간단하고 일관된 인터페이스를 제공하며, 다양한 플랫폼과 쉽게 통합할 수 있습니다. REST API를 설계할 때는 REST의 원칙을 잘 준수하고, 클라이언트와 서버 간의 효율적인 데이터 전송을 고려하는 것이 중요합니다. 또한, Spring Boot와 같은 프레임워크를 활용하면 RESTful 웹 서비스를 더 쉽게 구현할 수 있습니다.
'Software > JAVA' 카테고리의 다른 글
JAVA 시작하기 - 개발분야 (0) | 2024.07.31 |
---|---|
JAVA 시작하기 - 개발환경 (0) | 2024.07.31 |
JAVA 시작하기 - JSP 소개 (0) | 2024.07.30 |
JAVA 시작하기 - Tomcat 소개 (0) | 2024.07.30 |
VScode에서 Java 시작하기 - Java환경설치 (0) | 2023.12.20 |