2025년 2월 15일에 작성됨
이전 포스팅에서는 Spring Boot를 활용하여 Entity, Repository, Service, Controller를 생성하는 과정을 다뤘다.
이제는 웹애플리케이션의 가장 기본 기능인 CRUD를 구현할 차례이다.
CRUD?
1. CRUD 기능이란?
CRUD는 Create(생성), Read(조회), Update(수정), Delete(삭제)를 의미한다.
즉, 자동차 정보를 추가, 조회, 수정, 삭제하는 기능을 구현하는 과정이다.
2. Service 계층에서 CRUD 기능 추가
CarService에서 CRUD 기능을 담당하는 메서드를 추가한다.
package com.example.autofinder.service;
import com.example.autofinder.model.Car;
import com.example.autofinder.repository.CarRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Optional;
@Service
@RequiredArgsConstructor
public class CarService {
private final CarRepository carRepository;
// 차량 추가 (CREATE)
public Car addCar(Car car) {
return carRepository.save(car);
}
// 특정 ID로 차량 조회 (READ)
public Optional<Car> getCarById(Long id) {
return carRepository.findById(id);
}
// 전체 차량 목록 조회 (READ)
public List<Car> getAllCars() {
return carRepository.findAll();
}
// 특정 조건(연료, 주행거리, 지역)으로 차량 검색 (READ)
public List<Car> searchCars(String fuel, String mileage, String region) {
int mileageInt = Integer.MAX_VALUE; // 기본값 설정 (최대값)
if (mileage != null && !mileage.isEmpty()) {
try {
mileageInt = Integer.parseInt(mileage.replace(",", "").replace("km", "").trim());
} catch (NumberFormatException e) {
throw new IllegalArgumentException("주행거리는 숫자로 변환할 수 있는 형식이어야 합니다.");
}
}
return carRepository.searchCars(fuel, mileageInt, region);
}
// 차량 정보 수정 (UPDATE)
public Car updateCar(Long id, Car updatedCar) {
return carRepository.findById(id).map(car -> {
car.setCarType(updatedCar.getCarType());
car.setModel(updatedCar.getModel());
car.setYear(updatedCar.getYear());
car.setMileage(updatedCar.getMileage());
car.setFuel(updatedCar.getFuel());
car.setRegion(updatedCar.getRegion());
car.setUrl(updatedCar.getUrl());
return carRepository.save(car);
}).orElseThrow(() -> new IllegalArgumentException("해당 ID의 차량을 찾을 수 없습니다."));
}
// 차량 삭제 (DELETE)
public void deleteCar(Long id) {
if (!carRepository.existsById(id)) {
throw new IllegalArgumentException("해당 ID의 차량을 찾을 수 없습니다.");
}
carRepository.deleteById(id);
}
}
addCar(Car car)
→ 차량 추가getCarById(Long id)
→ 특정 차량 조회getAllCars()
→ 전체 차량 조회searchCars(String fuel, String mileage, String region)
→ 조건 검색updateCar(Long id, Car updatedCar)
→ 차량 정보 수정deleteCar(Long id)
→ 차량 삭제
각 메서드의 기능을 정리한 것이다.
3. Controller에서 CRUD 기능 추가
이제 Controller에서 API 요청을 받을 수 있도록 구현한다.
package com.example.autofinder.controller;
import com.example.autofinder.model.Car;
import com.example.autofinder.service.CarService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Optional;
@RestController
@RequestMapping("/api/cars")
@RequiredArgsConstructor
public class CarController {
private final CarService carService;
// 차량 검색 (연료, 주행거리, 지역 조건)
@GetMapping("/search")
public List<Car> searchCars(
@RequestParam(required = false) String fuel,
@RequestParam(required = false) String mileage,
@RequestParam(required = false) String region) {
return carService.searchCars(fuel, mileage, region);
}
// 전체 차량 목록 조회
@GetMapping
public List<Car> getAllCars() {
return carService.getAllCars();
}
// 특정 차량 조회 (ID 기반)
@GetMapping("/{id}")
public ResponseEntity<Car> getCarById(@PathVariable Long id) {
Optional<Car> car = carService.getCarById(id);
return car.map(ResponseEntity::ok)
.orElseGet(() -> ResponseEntity.notFound().build());
}
// 차량 추가 (CREATE)
@PostMapping
public ResponseEntity<Car> addCar(@RequestBody Car car) {
Car savedCar = carService.addCar(car);
return ResponseEntity.ok(savedCar);
}
// 차량 정보 수정 (UPDATE)
@PutMapping("/{id}")
public ResponseEntity<Car> updateCar(@PathVariable Long id, @RequestBody Car updatedCar) {
try {
Car car = carService.updateCar(id, updatedCar);
return ResponseEntity.ok(car);
} catch (IllegalArgumentException e) {
return ResponseEntity.notFound().build();
}
}
// 차량 삭제 (DELETE)
@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteCar(@PathVariable Long id) {
try {
carService.deleteCar(id);
return ResponseEntity.noContent().build();
} catch (IllegalArgumentException e) {
return ResponseEntity.notFound().build();
}
}
}
GET /api/cars/search
→ 조건 검색GET /api/cars
→ 전체 차량 조회GET /api/cars/{id}
→ 특정 차량 조회POST /api/cars
→ 차량 추가PUT /api/cars/{id}
→ 차량 수정DELETE /api/cars/{id}
→ 차량 삭제
각 엔드포인트의 기능을 정리한 것이다.
결론
사실 CRUD 기능을 만들면서 Postman으로 테스트 하는 방법을 더 공부해야겠다고 생각했다. 어떻게 보면 가장 중요한 단계가 실제로 기능이 작동하는지 테스트하는 부분이라고 생각하기 때문에 이 부분에 있어서 더 공부를 해야할 것 같다. 사실 이번 포스팅에서 같이 다룰까 했지만 관련 개념을 더 습득한 다음 기회가 되면 포스팅할 계획이다.
'SIDE PROJECT > AUTOFINDER' 카테고리의 다른 글
JWT를 활용한 로그인 및 API 인증 처리 (0) | 2025.04.17 |
---|---|
회원가입, 보안 로직 개발 (1) | 2025.04.17 |
스프링 부트(Spring Boot)를 이용한 서버 구축 (0) | 2025.04.17 |
데이터 저장 방식의 변경 (MySQL 사용) (0) | 2025.04.17 |
크롤링과 데이터 정제 (0) | 2025.04.17 |