본문 바로가기

Slack 채널 정리

제목 붙이기 애매한 자바 코딩 얘기

요건을 좀 단순화하면 이렇습니다.

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());
}