TIL
관통 프로젝트
Feat : 청약공고에 대한 복잡한 쿼리 API 구현
청약 공고 데이터를 다양한 조건(지역, 주택 유형, 공급 금액, 날짜 기준 등)으로 검색할 수 있는 API와 상세 조회 API를 구현했습니다. 또한, 기존 OpenAPI 데이터 수집 및 CSV 로딩 과정에서 사용되던 DTO를 별도의 LoadingDto로 분리하여 역할과 책임을 명확히 리팩토링했습니다.
🛠️ 작업 내용 (Key Changes)
1. 청약 공고 조회 API 구현 (SubscriptionController, Service)
- 검색 API (
GET /api/subscriptions): SubscriptionSearchRequestDTO를 통해 검색 조건을 받습니다.- 지원 조건: 지역, 주택유형, 최소/최대 공급금액, 날짜 범위.
-
날짜 기준 동적 처리:
dateType파라미터(공고일, 당첨자발표일, 계약일, 입주예정월, 접수일 등)에 따라 검색 기준 컬럼이 동적으로 변경되도록 구현했습니다. - 상세 조회 API (
GET /api/subscriptions/{subId}): - 특정 청약 공고의 기본 정보와 주택형별 상세 정보(
details)를 함께 반환합니다.
2. MyBatis 동적 쿼리 작성 (SubscriptionMapper.xml)
<choose>,<when>태그를 사용하여 사용자가 요청한 날짜 기준(NOTICE,WINNER,CONTRACT등)에 맞춰WHERE절이 동적으로 생성되도록 SQL을 작성했습니다.- 지역명(
region)과 주택유형(housingType)은LIKE검색을 지원합니다.
3. 데이터 로딩 로직 리팩토링 (DTO 분리)
- 기존 도메인 객체(
UnifiedSubscriptionDto)가 OpenAPI 매핑과 비즈니스 로직에 혼재되어 있던 점을 개선했습니다. - 변경 전:
UnifiedSubscriptionDto하나로 수집과 로직 처리. - 변경 후:
UnifiedSubscriptionLoadingDto,UnifiedDetailLoadingDto: OpenAPI/CSV 파싱 및 데이터 적재 전용 DTO (JSON/CSV 매핑 담당).- 테스트 코드(
AptDataFetchTest,CsvLoadTest)도 해당 변경 사항을 반영하여 업데이트했습니다.
💡 주요 로직 설명 (Optional)
- 동적 날짜 검색: 사용자가 “접수 기간”을 기준으로 검색할 수도 있고 “입주 예정월”을 기준으로 검색할 수도 있어,
SubscriptionSearchRequest의dateType필드를 스위칭하여 쿼리를 분기 처리했습니다. - DTO 분리 이유: OpenAPI 응답 필드명(스네이크 케이스 등)과 내부 로직에서 사용하는 필드명이 달라질 수 있고,
@JsonIgnoreProperties등의 설정이 도메인 영역을 침범하지 않도록LoadingDto를 분리했습니다.
✅ 테스트
CsvLoadTest를 통해 로딩용 DTO가 CSV 데이터를 정상적으로 파싱하는지 확인.AptDataFetchTest를 통해 OpenAPI 데이터 수집 로직 정상 작동 확인.- 검색 API 호출 시 조건별 필터링 정상 작동 확인.