Spring Boot를 사용한 RESTful Web API 구현
Source: Dev.to
RESTful API?
REST(Representational State Transfer)는 확장 가능한 웹 서비스를 만들기 위한 규칙 집합을 정의하는 아키텍처 스타일입니다. REST API는 다음과 같은 HTTP 메서드를 사용합니다:
- GET – 데이터 조회
- POST – 데이터 생성
- PUT – 데이터 업데이트
- DELETE – 데이터 삭제
REST API는 **무상태(stateless)**이며, 각 요청은 독립적이고 필요한 모든 정보를 포함합니다.
우리가 만들게 될 것?
Spring Boot를 사용해 Task Tracker REST API를 구축합니다. 목표는 사용자가 일일 작업을 효율적으로 관리할 수 있도록 깔끔하고 의미 있으며 프로덕션 수준의 API를 설계하는 것입니다.
구축할 엔드포인트 (사용 사례)
| 엔드포인트 | HTTP 메서드 | 사용 사례 |
|---|---|---|
POST /api/tasks | Create a Task | 제목, 설명, 카테고리와 기본 상태 PENDING을 가진 새로운 작업 추가 |
GET /api/tasks | Get All Tasks | 시스템에 존재하는 모든 작업 조회 |
GET /api/tasks/{id} | Get Task by ID | ID를 사용해 단일 작업의 상세 정보 가져오기 |
PUT /api/tasks/{id} | Update a Task | 제목, 설명, 카테고리 또는 상태와 같은 작업 세부 정보를 수정 |
DELETE /api/tasks/{id} | Delete a Task | 작업을 시스템에서 삭제 |
GET /api/tasks/status/{status} | Get Tasks by Status | 상태 PENDING, COMPLETED에 따라 작업 필터링 |
사용 데이터베이스: H2 인‑메모리 데이터베이스
데모와 학습을 위해 H2를 사용합니다. H2는 다음과 같은 장점을 제공합니다:
- 설치가 필요 없음
- 자동 콘솔 UI 제공
- 빠른 개발 속도
- 손쉬운 테스트
Note: 애플리케이션을 재시작하면 데이터가 초기화되며, 튜토리얼 목적에 최적입니다.
계층형 아키텍처 개요
깨끗하고 유지보수 가능한 REST API는 다음 세 가지 주요 계층으로 구성된 계층형 아키텍처를 따릅니다:
- Controller – 들어오는 API 요청을 처리합니다.
- Service – 비즈니스 로직을 포함합니다.
- Repository – 데이터베이스와의 상호작용을 관리합니다.
프로젝트 구조
프로젝트 설정하기
1. 새로운 Spring Boot 프로젝트 생성
Spring Initializr에 접속해 프로젝트를 다음과 같이 설정합니다:
- Project: Maven
- Language: Java
- Spring Boot Version: 최신 안정 버전
- Group:
com.example(또는 원하는 패키지) - Artifact:
task-tracker-api - Name:
Task Tracker API - Packaging: Jar
- Java Version: 17 이상
2. 필요한 의존성 추가
다음 의존성을 선택합니다:
- Spring Web – REST 컨트롤러를 만들고 HTTP 엔드포인트를 노출합니다.
- Spring Data JPA – ORM 기반 데이터베이스 연동을 지원합니다.
- H2 Database – 개발/테스트용 경량 인‑메모리 데이터베이스입니다.
- Lombok – getter, setter, 생성자 등 보일러플레이트 코드를 줄여줍니다.

프로젝트를 생성하고 압축을 풀어 IDE(IntelliJ IDEA, Eclipse, VS Code 등)에서 엽니다.
3. 애플리케이션 실행
메인 클래스 TaskTrackerApiApplication.java를 찾아 실행합니다. 다음과 유사한 로그가 출력됩니다:
Started TaskTrackerApiApplication in X seconds
이제 Spring Boot 애플리케이션이 실행되었습니다.
Controller 계층
controller 패키지에 TaskController 클래스를 생성합니다. 이 계층은 들어오는 HTTP 요청을 처리하고 클라이언트에 응답을 반환합니다.
package com.arshadpatel.task_tracker_api.controller;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TaskController {
// 1. Create a Task
// 2. Get All Tasks
// 3. Get Task by ID
// 4. Update a Task
// 5. Delete a Task
// 6. Get Tasks by Status
}
Model
model 패키지에 Task.java를 생성합니다.
package com.arshadpatel.task_tracker_api.model;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
public class Task {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
private String status;
}
Annotation 의미
@Data– getter, setter,toString(),equals(),hashCode()를 자동 생성합니다.@NoArgsConstructor– 인자 없는 생성자를 생성합니다.@AllArgsConstructor– 모든 필드를 인자로 받는 생성자를 생성합니다.@Entity– 클래스를 JPA 엔티티(데이터베이스 테이블)로 지정합니다.@Id– 기본 키를 나타냅니다.@GeneratedValue– 기본 키 값을 자동으로 생성합니다.
Repository와 Service 계층
Repository
package com.arshadpatel.task_tracker_api.repository;
import com.arshadpatel.task_tracker_api.model.Task;
import org.springframework.data.jpa.repository.JpaRepository;
public interface TaskRepository extends JpaRepository<Task, Long> {
}
Service
package com.arshadpatel.task_tracker_api.service;
import com.arshadpatel.task_tracker_api.model.Task;
import com.arshadpatel.task_tracker_api.repository.TaskRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class TaskService {
@Autowired
private TaskRepository taskRepository;
// 1. Create a Task
// 2. Get All Tasks
// 3. Get Task by ID
// 4. Update Task
// 5. Delete Task
// 6. Get Tasks by Status
}
Controller와 Service 연결하기
컨트롤러에서 첫 번째 API 메서드(작업 생성)를 구현합니다. 구현 후에는 Postman 등 API 클라이언트로 JSON 본문을 포함한 POST 요청을 보내 테스트할 수 있습니다.
package com.arshadpatel.task_tracker_api.controller;
import com.arshadpatel.task_tracker_api.model.Task;
import com.arshadpatel.task_tracker_api.service.TaskService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api/tasks")
public class TaskController {
@Autowired
private TaskService taskService;
@PostMapping
public Task createTask(@RequestBody Task task) {
// 서비스에 작업 저장 요청
return taskService.createTask(task);
}
// 추가 엔드포인트 구현은 여기서 진행...
}
남은 엔드포인트(GET, PUT, DELETE 등)도 동일한 패턴으로 구현하고, 핵심 로직은 TaskService에 위임합니다. 모든 메서드를 완성하면 Spring Boot로 만든 완전한 기능의 Task Tracker REST API가 준비됩니다.
