본문 바로가기
TIL/2024 원티드 프리온보딩 백엔드 인턴십

[TIL] 원티드 프리온보딩 백엔드 인턴십 Week3) 15일차, 0903

by ryuneng 2025. 1. 23.
반응형

✔️ 오늘 한 일

  • 5차 오프라인 세션 참여
  • Spring Batch 리팩토링


👀 오늘의 이슈

⚠️ 원본 데이터를 가공 데이터에 저장하는 과정에서 발생한 6가지 주소 관련 문제

1. 문제 : 원본 데이터에 위도, 경도가 없어 가공 데이터가 저장되지 않음

  • 해결 : 원본 데이터의 지번 주소를 사용해 위도, 경도를 조회한 후, 이를 가공 데이터에 저장하도록 수정했다.

2. 문제 : 지번 주소의 형식 오류로 인해 위도, 경도 조회 불가

  • 해결 : 지번 주소에 정제되지 않은 데이터가 많아 도로명 주소로 위도와 경도를 조회해 가공 데이터에 저장하도록 수정했다.

3. 문제 : 지역 CSV 파일과 공공데이터 API의 좌표계 타입이 달라 지역 데이터와 원본 맛집 데이터의 위도, 경도 값에 충돌 발생

  • 상황 :
    • 지역 csv의 WGS84 좌표계 형식) lon : 128.8784972 / lat : 37.74913611
    • 공공데이터 API의 중부원점TM 좌표계 형식) lon : 451667.793301393 / lat : 200614.497822789
  • 해결 : 공공데이터 API의 응답 데이터를 원본 데이터에 저장하는 과정에서 주소 검색 openAPI를 활용해 WGS84 좌표계의 위도, 경도 데이터를 저장하도록 수정했다.

4. 문제 : 원본 데이터에 도로명 주소가 없는 경우

  • 해결 : 지번주소를 이용해 위도, 경도를 조회한 후, 이를 저장하도록 수정했다.

5. 문제 : 도로명 주소 형식 오류로 인해 가공 데이터가 저장되지 않음

  • 해결 : 지번주소를 이용해 위도, 경도를 조회한 후, 이를 저장하도록 수정했다.
    0904_1_119번째 타키

6. 문제 : 원본 데이터에 도로명 주소와 위도, 경도가 없으며, 지번 주소로도 조회되지 않는 경우

  • 해결 : 해당 데이터를 가공 DB에 저장하지 않도록 수정했다.
    0904_2_432번째 품청국장


💡 Today I Learned

- JobCompletionNotificationListener 를 사용하여 배치 작업의 소요 시간을 측정할 수 있다.

  • 측정 방법
  1. 아래와 같이 JobCompletionNotificationListener 클래스를 작성한다.
@Slf4j
@Component
public class JobCompletionNotificationListener implements JobExecutionListener {

    private LocalDateTime jobStartTime;
    private LocalDateTime jobEndTime;

    @Override
    public void beforeJob(JobExecution jobExecution) {

        jobStartTime = LocalDateTime.now();
        log.info("배치 작업 '{}' 시작 시간: {}", jobExecution.getJobInstance().getJobName(), jobStartTime);
    }

    @Override
    public void afterJob(JobExecution jobExecution) {

        jobEndTime = LocalDateTime.now();
        log.info("배치 작업 '{}' 종료 시간: {}", jobExecution.getJobInstance().getJobName(), jobEndTime);
        log.info("배치 작업 '{}' 소요 시간: {} seconds", jobExecution.getJobInstance().getJobName(),
                java.time.Duration.between(jobStartTime, jobEndTime).getSeconds());
    }

}

  1. JobCompletionNotificationListener 를 배치 작업에 등록한다.
  • BatchConfig 파일에 JobCompletionNotificationListener 의존성을 주입하고,
    JobBuilder에 .listener(jobCompletionNotificationListener)를 추가한다.
@Slf4j
@Configuration
@EnableBatchProcessing
@RequiredArgsConstructor
public class BatchConfig {

    // 의존성 주입
    private final JobCompletionNotificationListener jobCompletionNotificationListener;
    
    @Bean
    public Job fetchJob() {
        return new JobBuilder("fetchJob", jobRepository)
                .start(fetchAndSaveStep())
                .next(processDataStep())
                .listener(jobCompletionNotificationListener) // 추가
                .build();
    }
  • 결과

 


< 해당 글은 velog에서 이전하며 옮겨온 글로, 가독성이 좋지 않을 수 있는 점 양해 부탁드립니다. >

🔗 velog 버전 보기 : https://velog.io/@ryuneng2/TIL-원티드-프리온보딩-백엔드-인턴십-Week3-15일차-0903