TIL

관통 프로젝트

Feat : 청약공고에 대한 복잡한 쿼리 API 구현

청약 공고 데이터를 다양한 조건(지역, 주택 유형, 공급 금액, 날짜 기준 등)으로 검색할 수 있는 API와 상세 조회 API를 구현했습니다. 또한, 기존 OpenAPI 데이터 수집 및 CSV 로딩 과정에서 사용되던 DTO를 별도의 LoadingDto로 분리하여 역할과 책임을 명확히 리팩토링했습니다.

🛠️ 작업 내용 (Key Changes)

1. 청약 공고 조회 API 구현 (SubscriptionController, Service)

  • 검색 API (GET /api/subscriptions):
  • SubscriptionSearchRequest DTO를 통해 검색 조건을 받습니다.
  • 지원 조건: 지역, 주택유형, 최소/최대 공급금액, 날짜 범위.
  • 날짜 기준 동적 처리: 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)

  • 동적 날짜 검색: 사용자가 “접수 기간”을 기준으로 검색할 수도 있고 “입주 예정월”을 기준으로 검색할 수도 있어, SubscriptionSearchRequestdateType 필드를 스위칭하여 쿼리를 분기 처리했습니다.
  • DTO 분리 이유: OpenAPI 응답 필드명(스네이크 케이스 등)과 내부 로직에서 사용하는 필드명이 달라질 수 있고, @JsonIgnoreProperties 등의 설정이 도메인 영역을 침범하지 않도록 LoadingDto를 분리했습니다.

✅ 테스트

  • CsvLoadTest를 통해 로딩용 DTO가 CSV 데이터를 정상적으로 파싱하는지 확인.
  • AptDataFetchTest를 통해 OpenAPI 데이터 수집 로직 정상 작동 확인.
  • 검색 API 호출 시 조건별 필터링 정상 작동 확인.

results matching ""

    No results matching ""