Skip to content

Commit

Permalink
긴급 수정: 사람인 API 오류 수정 완료
Browse files Browse the repository at this point in the history
  • Loading branch information
hanseu9839 committed Nov 6, 2024
1 parent 38b966d commit e569c30
Show file tree
Hide file tree
Showing 12 changed files with 79 additions and 19 deletions.
2 changes: 2 additions & 0 deletions src/main/java/darkoverload/itzip/ItzipApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@
@EnableScheduling
@SpringBootApplication
public class ItzipApplication {

public static void main(String[] args) {
SpringApplication.run(ItzipApplication.class, args);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
import org.springframework.web.bind.annotation.*;



@Slf4j
@RestController
@RequestMapping("/job-info")
Expand Down Expand Up @@ -54,5 +53,4 @@ public String scrapJobInfo(@SwaggerRequestBody(description = "채용정보 스
return jobInfoService.jobInfoScrap(request);
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,12 @@

import darkoverload.itzip.feature.job.entity.JobInfoScrapEntity;

import java.util.List;
import java.util.Optional;

public interface CustomJobInfoScrapRepository {
void bulkDeleteByPositionIds(List<Long> positionIds);

Optional<JobInfoScrapEntity> findByJobInfoId(Long id,String email);

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,32 +3,37 @@

import com.querydsl.jpa.impl.JPAQueryFactory;
import darkoverload.itzip.feature.job.entity.JobInfoScrapEntity;
import darkoverload.itzip.feature.job.entity.QJobInfoEntity;
import darkoverload.itzip.feature.job.entity.QJobInfoScrapEntity;
import darkoverload.itzip.feature.user.entity.QUserEntity;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Optional;

@Repository
@RequiredArgsConstructor
public class CustomJobInfoScrapRepositoryImpl implements CustomJobInfoScrapRepository{
public class CustomJobInfoScrapRepositoryImpl implements CustomJobInfoScrapRepository {

private final JPAQueryFactory queryFactory;
private final QJobInfoScrapEntity jobInfoScrapEntity = QJobInfoScrapEntity.jobInfoScrapEntity;


@Override
public void bulkDeleteByPositionIds(List<Long> positionIds) {
queryFactory.delete(jobInfoScrapEntity)
.where(jobInfoScrapEntity.jobInfo.positionId.in(positionIds))
.execute();
}

@Override
public Optional<JobInfoScrapEntity> findByJobInfoId(Long id, String email) {
JobInfoScrapEntity scrap = queryFactory.selectFrom(jobInfoScrapEntity)
.where(
(jobInfoScrapEntity.jobInfo.id.eq(id))
.and(jobInfoScrapEntity.user.email.eq(email))
JobInfoScrapEntity scrap = queryFactory.selectFrom(jobInfoScrapEntity)
.where(
(jobInfoScrapEntity.jobInfo.id.eq(id))
.and(jobInfoScrapEntity.user.email.eq(email))
).fetchOne();

return Optional.ofNullable(scrap);
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,10 @@
@Component
@RequiredArgsConstructor
public class JobInfoScheduler {
private static final String JOB_INFO_SCHEDULER_CON = "1 30 0 * * *";

private final JobInfoRepository jobInfoRepository;
private final JobInfoConnectService service;

/**
* Saramin API에서 최신 JobInfo 데이터를 가져와 데이터베이스와 비교하여
* 삭제, 업데이트, 삽입 작업을 수행하는 메서드입니다. 이 메서드는 매일 00:30에 실행됩니다.
Expand All @@ -28,8 +28,9 @@ public class JobInfoScheduler {
*
* @Scheduled(cron = "1 30 0 * * *") 크론 표현식을 사용하여 매일 01:30에 실행됩니다.
*/

@Transactional
@Scheduled(cron = "1 30 0 * * *")
@Scheduled(cron = JOB_INFO_SCHEDULER_CON)
public void jobInfoConnectApi() {
// 데이터베이스에서 모든 JobInfo 데이터를 조회하고, 도메인 객체 리스트로 변환
List<JobInfo> dbList = jobInfoRepository.findAll().stream().map(JobInfoEntity::convertToDomain).toList();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import darkoverload.itzip.feature.job.domain.JobInfo;
import darkoverload.itzip.feature.job.entity.JobInfoEntity;
import darkoverload.itzip.feature.job.repository.JobInfoRepository;
import darkoverload.itzip.feature.job.repository.JobInfoScrapRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
Expand All @@ -17,6 +18,7 @@
public class JobInfoConnectServiceImpl implements JobInfoConnectService {

private final JobInfoRepository jobInfoRepository;
private final JobInfoScrapRepository jobInfoScrapRepository;

@Value("${job.api-url}")
private String jobUrl;
Expand Down Expand Up @@ -63,14 +65,14 @@ public Long jobInfoDelete(List<JobInfo> apiDataList, List<JobInfo> dbList) {
// dbList가 비어있을 경우, 즉시 반환하여 추가 작업을 방지
if(dbList.isEmpty()) return 0L;


List<Long> deleteList = makeDeleteList(apiDataList, dbList);


long totalDeletedCount = 0L;
// batchSize를 설정하여 500개씩 나누어 삭제 작업을 수행 (대량 삭제 시 성능 최적화)
for(int i=0; i < deleteList.size(); i+= 500){
List<Long> batch = deleteList.subList(i, Math.min(i + 500, deleteList.size()));
jobInfoScrapRepository.bulkDeleteByPositionIds(batch);
totalDeletedCount += jobInfoRepository.bulkDeleteByPositionIds(batch);
}

Expand Down Expand Up @@ -169,8 +171,6 @@ private boolean checkNotEquals(JobInfo dbJobInfo, JobInfo apiJobInfo) {
|| !dbJobInfo.getIndustryName().equals(apiJobInfo.getIndustryName()) // 산업 이름 비교
|| !dbJobInfo.getLocationCode().equals(apiJobInfo.getLocationCode()) // 위치 코드 비교
|| !dbJobInfo.getLocationName().equals(apiJobInfo.getLocationName()) // 위치 이름 비교
|| !dbJobInfo.getJobTypeCode().equals(apiJobInfo.getJobTypeCode()) // 직무 유형 코드 비교
|| !dbJobInfo.getJobTypeName().equals(apiJobInfo.getJobTypeName()) // 직무 유형 이름 비교
|| !dbJobInfo.getJobMidCode().equals(apiJobInfo.getJobMidCode()) // 중간 직무 코드 비교
|| !dbJobInfo.getJobMidName().equals(apiJobInfo.getJobMidName()) // 중간 직무 이름 비교
|| !dbJobInfo.getJobName().equals(apiJobInfo.getJobName()) // 직무 이름 비교
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,6 @@ public UpdateResumeResponse updateResume(@SwaggerRequestBody(description = "이
schema = @Schema(implementation = UpdateResumeRequest.class)
)) @Valid @RequestBody UpdateResumeRequest request) {



return service.update(request);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@ public class AchievementEntity extends AuditingFields {

private String content;


public Achievement convertToDomain(){
return Achievement.builder()
.achievementId(this.id)
Expand All @@ -44,4 +43,5 @@ public Achievement convertToDomain(){
.content(this.content)
.build();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@

import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;


@Slf4j
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ public class SecurityConfig {

// 직업 정보 임시 허용
"/job-info",
"/job-info/scrap",
"/job-info/scrap"
};

// 비로그인 유저 허용 페이지
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package darkoverload.itzip.feature.job.service.connect;

import darkoverload.itzip.feature.job.domain.JobInfo;
import darkoverload.itzip.feature.job.entity.JobInfoEntity;
import darkoverload.itzip.feature.job.repository.JobInfoRepository;
import darkoverload.itzip.feature.job.service.JobInfoService;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;

import java.util.List;

@Slf4j
@SpringBootTest
@ActiveProfiles(profiles = "test")
public class JobInfoScheduleTest {

@Autowired
private JobInfoRepository jobInfoRepository;

@Autowired
private JobInfoConnectService service;

@Test
void 사람인_테스트() {
// 데이터베이스에서 모든 JobInfo 데이터를 조회하고, 도메인 객체 리스트로 변환
List<JobInfo> dbList = jobInfoRepository.findAll().stream().map(JobInfoEntity::convertToDomain).toList();

// Saramin API를 호출하여 최신 JobInfo 데이터를 가져옴
List<JobInfo> apiDataList = service.jobInfoConnect();

// 데이터베이스에 있는 JobInfo 데이터를 API 데이터와 비교하여 삭제 작업 수행
Long deletedCount = service.jobInfoDelete(apiDataList, dbList);

log.info("==== Saramin API Data deleteCount :: {} ====", deletedCount);

// 데이터베이스에 있는 JobInfo 데이터를 API 데이터와 비교하여 업데이트 작업 수행
Long updatedCount = service.jobInfoUpdate(apiDataList, dbList);

log.info("==== Saramin API Data updateCount :: {} ====", updatedCount);

// API 데이터 중에서 데이터베이스에 없는 데이터를 삽입하는 작업 수행
Long savedCount = service.jobInfoSave(apiDataList, dbList);

log.info("==== Saramin API Data updateCount :: {} ====", savedCount);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -80,4 +80,5 @@ private List<Long> getLanguageUpdateIds(List<Language> languages) {
private List<Long> getLanguageIds(Long resumeId) {
return findAllByResumeId(resumeId).stream().map(Language::getLanguageId).toList();
}

}

0 comments on commit e569c30

Please sign in to comment.