요건을 좀 단순화하면 이렇습니다.
1. machType 이 각기 다른 machId 2개 값 수신.
2. DB 검색.
3. 1과 2를 비교해서 다음과 같이 처리
3.1 동일한 machId 인 건은 pass
3.2 1의 수신 machId 가 2의 결과에 없는 경우, 신규 machId 는 insert, 그리고 2의 데이터 중 신규 mach와 machType 이 같은 건들의 플래그 값은 update.중복 for 문 쓰지 않고 좀 깔끔하게 구현하려 하다 보니 오버엔지니어링이 되어 버렸네요. 그래도 stream filter 이용하여 두 리스의 차집합 구하는 방법 공유할 겸 올려봅니다. 소스 보면 알겠지만 깔끔하긴 하지만 성능면에서는 좋지 않을겁니다. 좀 더 쌈박한 방법 없을까요?
import lombok.Data;
@Data
public class JobAlloc {
private String machId;
private String machTpCd;
}
// Test Method
@Test
public void testAlloc1() {
List<JobAlloc> jobStep = rcvMsg("C2", "T2");
List<JobAlloc> jobDB = getDataFromDB("C1", "T1");
Set<String> josMachIdSet = getMachIdSet(jobStep);
List<JobAlloc> matchMachs =
jobDB.stream()
.filter(jobAllocTimeHst -> josMachIdSet.contains(jobAllocTimeHst.getMachId()))
.collect(Collectors.toList());
if(!matchMachs.isEmpty() && matchMachs.size() == jobDB.size()) {
log.info("pass");
} else {
Set<String> matchMachIdSet = getMachIdSet(matchMachs);
List<JobAlloc> updJobAlloc = getDiffList(jobDB, matchMachIdSet);
log.info("update : {}", updJobAlloc.toString());
List<JobAlloc> insJobAlloc = getDiffList(jobStep, matchMachIdSet);
log.info("insert : {}", insJobAlloc.toString());
}
}
private List<JobAlloc> getDataFromDB(String c1, String t1) {
List<JobAlloc> jobDB = new ArrayList<>();
jobDB.add(setAllocObj(c1, "C"));
jobDB.add(setAllocObj(t1, "T"));
return jobDB;
}
private List<JobAlloc> rcvMsg(String crnId, String trkId) {
List<JobAlloc> jobStep = getDataFromDB(crnId, trkId);
return jobStep;
}
private JobAlloc setAllocObj(String machId, String machTp) {
JobAlloc ja = new JobAlloc();
ja.setMachId(machId);
ja.setMachTpCd(machTp);
return ja;
}
private List<JobAlloc> getDiffList(List<JobAlloc> job, Set<String> ids) {
return job.stream()
.filter(jobAlloc -> !ids.contains(jobAlloc.getMachId()))
.collect(Collectors.toList());
}
private Set<String> getMachIdSet(List<JobAlloc> job) {
return job.stream()
.map(JobAlloc::getMachId)
.collect(Collectors.toSet());
}
'Slack 채널 정리' 카테고리의 다른 글
JPA 에서 mariaDB point 타입 이용 방법 (0) | 2019.11.27 |
---|---|
회사 애자일 멘토 롤아웃에 대한 단상 (0) | 2019.11.27 |
python turtle 로 하트 그리는 소스 (0) | 2019.11.27 |
Native Query 사용 시 Space is not allowed after parameter prefix ':' 에러 처리 방법 (2) | 2019.11.27 |
sqlite 데이터, mariaDB로 이전 (0) | 2019.11.27 |