REST API란?
클라이언트 종류에 상관없이 서버의 자원을 사용할 수 있도록 설계된 방식이다. HTTP 요청을 통해 서버의 자원을 반환하며, 모든 기기에서 통용될 수 있는 형식(JSON 등)으로 응답을 제공한다.
REST API 동작방식
서버는 클라이언트의 요청에 JSON 형식으로 데이터를 응답하며, 최근에는 JSON이 표준으로 자리 잡고 있다. 다른 형식(XML, YAML 등)도 가능하지만 주로 JSON이 사용된다.
HTTP 메서드에 관한 내용은 여기서 알아보자.
HTTP 개념과 특징
HTTP (HyperText Transfer Protocol) HTTP는 웹 개발의 핵심이며 웹 개발자라면 반드시 알고 있어야 한다. 클라이언트(브라우저)와 서버가 어떻게 데이터를 주고받는지를 모르면 문제를 해결하기가 힘들
lys5654.tistory.com
REST API 실습
간단하게 메모장으로 CRUD를 실습해 봤다. 실습한 것 을 토대로 전반적으로 어떤 흐름을 가지는지 알아보자
메모장으로 CRUD를 실습하며 전체적인 흐름을 정리하면 다음과 같다.
🚀 메모를 CRUD할 수 있는 Web Application
1. 메모 생성 기능 C
2. 메모 단 건 조회 기능 R
3. 메모 전체 수정 기능 U
4. 메모 단 건 삭제 기능 D
- 요구사항 분석 및 설계
- 통신 데이터 형식: JSON
- 메모 구성 요소: id(식별자), title(제목), contents(내용)
- 필요한 기능: CRUD (생성, 조회, 수정, 삭제)
- HTTP API 설계
- CRUD에 맞는 HTTP Method 사용
- RESTful API 원칙을 따라 URL 매핑
- API 설계
- 메모 생성 → POST /memos
- 메모 조회(단건) → GET /memos/{id}
- 메모 수정(전체 변경) → PUT /memos/{id}
- 메모 삭제 → DELETE /memos/{id}
메모장 API 구현
1️⃣ 클래스 설계
먼저 메모 데이터를 관리하기 위한 Memo 엔티티를 설계한다.
id(식별자), title(제목), contents(내용) 필드로 구성된다.
✅ Memo 클래스 (엔티티)
import lombok.Getter;
import lombok.AllArgsConstructor;
@Getter
@AllArgsConstructor
public class Memo {
private Long id;
private String title;
private String contents;
// Memo 업데이트 메서드
public void update(MemoRequestDto requestDto) {
this.title = requestDto.getTitle();
this.contents = requestDto.getContents();
}
}
- update(MemoRequestDto requestDto): 메모 내용을 업데이트하는 메서드이다. 이 메서드는 클라이언트에서 보낸 MemoRequestDto를 이용해 title과 contents를 변경한다.
2️⃣ DTO 설계
두번째로 클라이언트와 데이터를 주고받기 위한 DTO 객체를 만든다
- RequestDto → 클라이언트에서 보낸 요청 데이터를 받음
- ResponseDto → 클라이언트에게 응답 데이터를 보냄
✅ MemoRequestDto (요청 DTO)
import lombok.Getter;
@Getter
public class MemoRequestDto {
private String title;
private String contents;
}
// 클라이언트가 전송하는 데이터를 담는 DTO
// title과 contents 필드는 요청 본문(body)에 담길 데이터
✅ MemoResponseDto (응답 DTO)
import lombok.Getter;
@Getter
public class MemoResponseDto {
private Long id;
private String title;
private String contents;
// Memo 객체를 받아서 ResponseDto로 변환하는 생성자
public MemoResponseDto(Memo memo) {
this.id = memo.getId();
this.title = memo.getTitle();
this.contents = memo.getContents();
}
}
//클라이언트에게 반환할 데이터를 포함하는 DTO
3️⃣ 메모 생성 기능
MemoController 클래스는 메모 관리 API의 핵심 역할을 한다. 이 클래스는 클라이언트로부터 요청을 받고, 그에 맞는 비즈니스 로직을 수행한 후 응답을 반환하는 역할을 한다.
✅ MemoController 클래스 (API 컨트롤러)
import org.springframework.web.bind.annotation.*;
import java.util.*;
@RestController
@RequestMapping("/memos") // 기본 경로 설정
public class MemoController {
// 메모 데이터를 저장할 In-memory DB 역할
private final Map<Long, Memo> memoList = new HashMap<>();
// 메모 생성 API
@PostMapping
public MemoResponseDto createMemo(@RequestBody MemoRequestDto requestDto) {
// 새로운 ID 생성 (기존 ID 중 최댓값 + 1)
Long memoId = memoList.isEmpty() ? 1 : Collections.max(memoList.keySet()) + 1;
// Memo 객체 생성
Memo memo = new Memo(memoId, requestDto.getTitle(), requestDto.getContents());
// Map에 Memo 저장
memoList.put(memoId, memo);
// ResponseDto로 변환하여 반환
return new MemoResponseDto(memo);
}
// 특정 메모 조회 API
@GetMapping("/{id}")
public MemoResponseDto findMemoById(@PathVariable Long id) {
Memo memo = memoList.get(id);
return new MemoResponseDto(memo);
}
// 메모 수정 API
@PutMapping("/{id}")
public MemoResponseDto updateMemoById(@PathVariable Long id, @RequestBody MemoRequestDto requestDto) {
Memo memo = memoList.get(id);
memo.update(requestDto);
return new MemoResponseDto(memo);
}
// 메모 삭제 API
@DeleteMapping("/{id}")
public void deleteMemo(@PathVariable Long id) {
memoList.remove(id);
}
}
- 메모 생성: 클라이언트에서 POST /memos 요청으로 메모를 생성한다.
- 메모 조회: 클라이언트에서 GET /memos/{id} 요청으로 메모를 조회한다.
- 메모 수정: 클라이언트에서 PUT /memos/{id} 요청으로 메모를 수정한다.
- 메모 삭제: 클라이언트에서 DELETE /memos/{id} 요청으로 메모를 삭제한다.
MemoController는 메모의 생성, 조회, 수정, 삭제를 담당하며, 메모 데이터를 메모리 내의 Map 자료구조에 저장하고, DTO를 사용해 클라이언트와 데이터를 주고받는다.
각 메서드는 클라이언트의 요청에 맞춰 메모를 처리하고, 그 결과를 HTTP 응답으로 반환하게 한다.
이렇게 간단한 메모장 REST API를 통해 CRUD 작업을 수행하는 흐름을 이해할 수 있게 되었다.
하지만 이 프로젝트를 진행하면서 몇 가지 문제점을 발견했다.
첫 번째는 MemoController가 너무 많은 책임을 지고 있다는 점이다. 이는 코드의 유지보수성과 확장성을 저해할 수 있을 것이다.
두 번째 문제는 서버가 종료되면 메모 데이터가 초기화되는 점입니다. 현재 데이터는 메모리에서만 관리되고 있기 때문에, 서버가 다시 시작되면 기존의 모든 데이터가 사라지게 된다.
아마 인메모리를 사용해서 그런 것일 거다. 다음에는 디비를 활용하여해 볼 것이다.
'Spring' 카테고리의 다른 글
JDBC (0) | 2025.03.24 |
---|---|
롬복(Lombok)이란? (0) | 2025.03.21 |
데이터베이스와 트랜잭션의 개념 (0) | 2025.03.20 |
Spring MVC란? (0) | 2025.03.18 |
HTTP 개념과 특징 (1) | 2025.03.17 |