Spring Boot를 사용한 RESTful Web API 구현

발행: (2025년 12월 14일 오후 07:34 GMT+9)
7 min read
원문: Dev.to

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/tasksCreate a Task제목, 설명, 카테고리와 기본 상태 PENDING을 가진 새로운 작업 추가
GET /api/tasksGet All Tasks시스템에 존재하는 모든 작업 조회
GET /api/tasks/{id}Get Task by IDID를 사용해 단일 작업의 상세 정보 가져오기
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 – 데이터베이스와의 상호작용을 관리합니다.

프로젝트 구조

Structure of our project

프로젝트 설정하기

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, 생성자 등 보일러플레이트 코드를 줄여줍니다.

Spring initializer for reference

프로젝트를 생성하고 압축을 풀어 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가 준비됩니다.

Back to Blog

관련 글

더 보기 »

Java Spring Boot를 사용한 기본 CRUD

Spring Boot란 무엇인가? Spring Boot는 웹 및 백엔드 애플리케이션을 쉽게 구축할 수 있도록 도와주는 Java 프레임워크입니다. 대부분의 설정과 구성을 자동으로 처리해 줍니다.