[수습일지] - 61
업데이트 기능을 위해 고민했지만
어제 열심히 생각한 부분대로 새로운 필드를 생성하는 것 보다는
dml 처리를 조금 더 하는 것이 더 효율적일 수 있다고 한다.
애초에 dml을 더 하는 것이 복잡도도 낮아지고 테스트 작성도 쉬워지지만
내부 작업 처리량을 최대한 줄여보려고 통합하려고 했던 것인데
커스텀필드 자체가 생성되는 것부터 디메리트가 들어가서
결론적으로 성능 저하는 전체 부분으로 들어가기 때문에
어차피 지역 변경을 하는 경우 이전 기록을 지우는 경우가
부분만 변경되는 것 보다 많기 때문에
그냥 기존 해당 유저 관련 권한을 제거하고
새로 등록된 내용을 부여하는 방식으로 진행했다.
이렇게 진행하면 insert delete의 구분도 크게 없어지고
등급의 변경에도 더 유연하게 대처할 수 있다는 장점이 있다.
user update는 처리할 수 있었지만 insert는 기존 로직으로 불가능했는데
이걸 해결하려고 if문을 걸어버리면 복잡도가 터져버리는 문제가 발생했다.
일단 if문을 걸고 작성했지만 생성이 제대로 되지 않는 문제가 발생해 확인해보니
before insert로 할 경우 insert가 되지 않았기 때문에 아직 유저가 생성되지 않아서
유저의 Id가 존재하지 않는 상태라 해당 유저의 Id를 GroupMember에 매칭시킬 수 없었다.
잠깐 고민해보니 update는 before update로 처리하고
insert는 after update로 진행하면 될 것 같아서 작성해보니 제대로 되는 것을 볼 수 있었고
유저의 생성, 업데이트로 인한 권한 설정이 자동으로 잘 돌아가는 것을 볼 수 있었다.
메서드를 분리한 다음 테스트케이스를 작성하려고 했으나
테스트케이스의 앞에 수많은 데이터 생성이 필요해 퇴근 하기로 했다.
(1).백준 11795번 Donation Packaging은 기부 물품을 세트로 포장해서 보내야 하는데
최소 각 30 이상이 모였을 때만 발송을 할 수 있고
한번 보낼 때 최대한(보유 최소치 만큼)으로 보낸다고 가정할 때
각 테스트케이스만큼의 값들이 누적될 때
각 테스트 케이스 상태에서 발송 가능한 양을 출력하는 문제로
출력이 불가능할 경우 'NO'를 출력해야 했다.
a, b, c를 각자 xAmount에 넣고 처리한 다음
최소값이 30이 넘을 경우 해당 최소값을 a,b,c Amount에서 제거한 다음
해당 값을 출력했고 30이 되지 않을 경우 'NO'를 출력하고 넘어갔다.
const input = `5
20 30 60
20 30 60
50 40 60
50 10 10
0 50 50`.split('\n').map(el => el.split(' ').map(Number))
const result = []
let [aAmount, bAmount, cAmount] = [0, 0, 0]
for(let i = 1 ; i < input.length ; i++){
let [a, b, c] = input[i]
aAmount += a
bAmount += b
cAmount += c
let min = Math.min(aAmount,bAmount,cAmount)
if(min >= 40){
aAmount -= min
bAmount -= min
cAmount -= min
result.push(min)
}
else{
result.push('NO')
}
}
console.log(result.join('\n'))