[Spring]그림으로 배우는 스프링 6 - 13장 REST API 만들기

Gaeng·2024년 11월 25일

[Spring] 공부

목록 보기
14/21
post-thumbnail

REST API 만들기

참조 계열 REST API 만들기

Spring Boot에서 RESTful API를 간단히 구현하기 위해 @RestController를 활용할 수 있습니다.
이 어노테이션은 @ResponseBody@Controller를 합친 기능을 제공하며, 클라이언트가 요청한 데이터를 JSON 또는 XML과 같은 형태로 반환하도록 지원합니다.

@RestController의 기능

  • @Controller: Spring MVC의 컨트롤러로 작동하여 HTTP 요청을 처리합니다.
  • @ResponseBody: 메서드가 반환하는 객체를 자동으로 HTTP 응답 본문에 작성하도록 합니다.
    • 이 과정에서 HttpMessageConverter가 작동하여 객체를 JSON 또는 XML로 변환합니다.

즉, @RestController는 별도로 @ResponseBody를 추가하지 않아도 RESTful 방식으로 데이터를 응답하도록 구성된 어노테이션입니다.

@RestController
public class TrainingAdminRestController {

    private final TrainingAdminService trainingAdminService;

    // 생성자 주입
    public TrainingAdminRestController(TrainingAdminService trainingAdminService) {
        this.trainingAdminService = trainingAdminService;
    }

    // GET 요청 처리
    @GetMapping("/api/trainings/{id}")
    public Training getTraining(@PathVariable String id) {
        // ID를 기반으로 Training 정보를 반환
        return trainingAdminService.findById(id);
    }
}

요청: /api/trainings/t01

Request:

GET /api/trainings/t01
Host: localhost:8080

Response:

{
    "id": "t01",
    "name": "Spring Boot Basics",
    "description": "Learn the fundamentals of Spring Boot."
}

갱신 계열 REST API 만들기

RESTful API에서 갱신 계열 작업(Create, Update, Partial Update, Delete)을 처리하기 위해 주로 사용하는 HTTP 메서드는 POST, PUT, PATCH, DELETE입니다. 각각의 메서드는 다음과 같은 목적에 사용됩니다.

1. 주요 HTTP 메서드 개요

HTTP Method목적설명
POST리소스 등록새로운 리소스를 생성합니다.
PUT리소스 갱신(전체 변경)리소스 전체를 수정합니다. 리소스가 없다면 생성합니다.
PATCH리소스 부분 갱신리소스의 일부를 변경합니다.
DELETE리소스 삭제지정된 리소스를 삭제합니다.

2. REST API 구현

TrainingController 클래스

@RestController
@RequestMapping("/api/trainings")
public class TrainingAdminRestController {

    private final TrainingAdminService trainingAdminService;

    public TrainingAdminRestController(TrainingAdminService trainingAdminService) {
        this.trainingAdminService = trainingAdminService;
    }

    // POST: 리소스 등록
    @PostMapping
    public Training createTraining(@RequestBody Training training) {
        return trainingAdminService.save(training);
    }

    // PUT: 리소스 갱신 (전체 변경)
    @PutMapping("/{id}")
    public Training updateTraining(@PathVariable String id, @RequestBody Training training) {
        training.setId(id); // 기존 ID 유지
        return trainingAdminService.update(training);
    }

    // PATCH: 리소스 부분 갱신
    @PatchMapping("/{id}")
    public Training partialUpdateTraining(@PathVariable String id, @RequestBody Map<String, Object> updates) {
        return trainingAdminService.partialUpdate(id, updates);
    }

    // DELETE: 리소스 삭제
    @DeleteMapping("/{id}")
    public void deleteTraining(@PathVariable String id) {
        trainingAdminService.deleteById(id);
    }
}

3. TrainingAdminService 메서드 구현 예시

@Service
public class TrainingAdminService {

    private final Map<String, Training> trainingDatabase = new HashMap<>();

    // 리소스 등록
    public Training save(Training training) {
        training.setId(UUID.randomUUID().toString());
        trainingDatabase.put(training.getId(), training);
        return training;
    }

    // 리소스 전체 갱신
    public Training update(Training training) {
        trainingDatabase.put(training.getId(), training);
        return training;
    }

    // 리소스 부분 갱신
    public Training partialUpdate(String id, Map<String, Object> updates) {
        Training training = trainingDatabase.get(id);
        if (training == null) {
            throw new IllegalArgumentException("Training not found");
        }

        updates.forEach((key, value) -> {
            switch (key) {
                case "name":
                    training.setName((String) value);
                    break;
                case "description":
                    training.setDescription((String) value);
                    break;
            }
        });

        trainingDatabase.put(id, training);
        return training;
    }

    // 리소스 삭제
    public void deleteById(String id) {
        trainingDatabase.remove(id);
    }

    // 리소스 조회
    public Training findById(String id) {
        return trainingDatabase.get(id);
    }
}
profile
문제를 해결하면서 나온 문제를 기록하는 노트

0개의 댓글