
Spring Boot에서 RESTful API를 간단히 구현하기 위해
@RestController를 활용할 수 있습니다.
이 어노테이션은@ResponseBody와@Controller를 합친 기능을 제공하며, 클라이언트가 요청한 데이터를 JSON 또는 XML과 같은 형태로 반환하도록 지원합니다.
@RestController의 기능@Controller: Spring MVC의 컨트롤러로 작동하여 HTTP 요청을 처리합니다.@ResponseBody: 메서드가 반환하는 객체를 자동으로 HTTP 응답 본문에 작성하도록 합니다.즉, @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/t01Request:
GET /api/trainings/t01 Host: localhost:8080Response:
{ "id": "t01", "name": "Spring Boot Basics", "description": "Learn the fundamentals of Spring Boot." }
RESTful API에서 갱신 계열 작업(Create, Update, Partial Update, Delete)을 처리하기 위해 주로 사용하는 HTTP 메서드는 POST, PUT, PATCH, DELETE입니다. 각각의 메서드는 다음과 같은 목적에 사용됩니다.
| HTTP Method | 목적 | 설명 |
|---|---|---|
| POST | 리소스 등록 | 새로운 리소스를 생성합니다. |
| PUT | 리소스 갱신(전체 변경) | 리소스 전체를 수정합니다. 리소스가 없다면 생성합니다. |
| PATCH | 리소스 부분 갱신 | 리소스의 일부를 변경합니다. |
| DELETE | 리소스 삭제 | 지정된 리소스를 삭제합니다. |
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);
}
}
@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);
}
}