반응형
✔️ 오늘 한 일
- 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. 문제 : 도로명 주소 형식 오류로 인해 가공 데이터가 저장되지 않음
- 해결 : 지번주소를 이용해 위도, 경도를 조회한 후, 이를 저장하도록 수정했다.
6. 문제 : 원본 데이터에 도로명 주소와 위도, 경도가 없으며, 지번 주소로도 조회되지 않는 경우
- 해결 : 해당 데이터를 가공 DB에 저장하지 않도록 수정했다.
💡 Today I Learned
- JobCompletionNotificationListener
를 사용하여 배치 작업의 소요 시간을 측정할 수 있다.
- 측정 방법
- 아래와 같이
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());
}
}
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
'TIL > 2024 원티드 프리온보딩 백엔드 인턴십' 카테고리의 다른 글
[TIL] 원티드 프리온보딩 백엔드 인턴십 Week3) 17일차, 0905 (0) | 2025.01.23 |
---|---|
[TIL] 원티드 프리온보딩 백엔드 인턴십 Week3) 16일차, 0904 (0) | 2025.01.23 |
[TIL] 원티드 프리온보딩 백엔드 인턴십 Week2) 14일차, 0902 (0) | 2025.01.23 |
[TIL] 원티드 프리온보딩 백엔드 인턴십 Week2) 13일차, 0901 (0) | 2025.01.22 |
[TIL] 원티드 프리온보딩 백엔드 인턴십 Week2) 12일차, 0831 (0) | 2025.01.22 |