728x90
2025년 2월 19일에 작성됨
크롤링을 하고 나서 저장되는 데이터들에 대해 생각해보다가 문득 차량의 가격을 크롤링 데이터에 포함하지 않았다는 생각이 들었다.
추가로 데이터갱신 시간(크롤링한 데이터가 데이터베이스에 저장된 시간)도 추가했다.
그래서 Car
엔티티 클래스부터 CarController
, CarService
, CarRepository
에 대한 수정이 이루어졌다.
물론 쿼리문도 수정이 필요했다.
쿼리문 수정
수정한 쿼리문은 아래와 같다.
CREATE TABLE cars (
id BIGINT AUTO_INCREMENT PRIMARY KEY, -- 차량 ID (자동 증가)
car_type VARCHAR(50) NOT NULL, -- 차량 종류 (국산차/수입차)
model VARCHAR(100) NOT NULL, -- 차량 모델명
year VARCHAR(20) NOT NULL, -- 연식 (예: "22/01식")
mileage BIGINT UNSIGNED NOT NULL, -- 주행거리 (예: "100000") -> 음수가 될 수 없으므로 UNSIGNED 추가
price BIGINT UNSIGNED NOT NULL DEFAULT 0, -- 차량 가격 (예: "15000000" -> 1,500만 원)
fuel VARCHAR(20) NOT NULL, -- 연료 종류 (예: 가솔린, 디젤)
region VARCHAR(50) NOT NULL, -- 지역 (예: 서울, 경기 등)
url VARCHAR(255) UNIQUE, -- 차량 상세 페이지 URL (중복 방지)
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- 데이터 삽입 시간 기록
);
price BIGINT UNSIGNED NOT NULL DEFAULT 0
을 추가함으로써 기본적으로 가격을 int
로 받고, 만약 가격이 NULL
값이라면 디폴트로 0으로 설정하는 것이다.
Car 엔티티 수정
그리고 Car 엔티티에서도 가격과 시간을 추가했다.
package com.example.autofinder.model;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.time.LocalDateTime;
// car
@Entity
@Table(name = "cars")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Car {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String carType;
private String model;
private String year;
private Long mileage;
private Long price;
private String fuel;
private String region;
private String url;
// 데이터 생성 시간 (자동 설정)
@Column(columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP")
private LocalDateTime createdAt;
// 생성 시 자동으로 현재 시간 설정
@PrePersist
protected void onCreate() {
this.createdAt = LocalDateTime.now();
}
}
CarController 수정
또한 CarController
에서 차량의 최솟값과 최댓값 필터를 추가하여 특정 가격 범위 내에서 차량을 검색할 수 있도록 하였다.
// 차량 검색 API (페이징 + 필터링)
@GetMapping("/search")
public ResponseEntity<Page<Car>> searchCars(
@RequestParam(required = false) String model,
@RequestParam(required = false) String fuel,
@RequestParam(required = false) String region,
@RequestParam(required = false) Long minPrice,
@RequestParam(required = false) Long maxPrice,
Pageable pageable) {
Page<Car> cars = carService.searchCars(model, fuel, region, minPrice, maxPrice, pageable);
return ResponseEntity.ok(cars);
}
결론
오늘 한 내용은 비교적 단순한 기능 개선 및 파일 수정이었다.
- 가격을 크롤링하고 DB에 저장하도록 변경 (DB에 추가되는 시간도 추가)
- 가격 검색 필터 추가
- 백엔드 코드 개선 및 쿼리문 수정
현재 포스팅까지의 내용을 보면 백엔드의 기본적인 CRUD 기능을 구현하였고, DB와의 연동도 원활히 이루어졌다.
그래서 앞으로 이어질 포스팅은 프론트엔드 연동에 관해 다룰 것 같다.
사실 프론트엔드에 대해 공부한 적은 거의 없기 때문에 앞으로 공부를 더 하면서 해당 프로젝트에 적용해나가볼 것이다.
'SIDE PROJECT > AUTOFINDER' 카테고리의 다른 글
차량의 필터링(조건 검색) 기능 추가 (1) | 2025.04.17 |
---|---|
프론트엔드 연동 (React, Tailwind 적용) (0) | 2025.04.17 |
JWT를 활용한 로그인 및 API 인증 처리 (0) | 2025.04.17 |
회원가입, 보안 로직 개발 (1) | 2025.04.17 |
CRUD 기능 구현 (0) | 2025.04.17 |