회고

[개발일지] - 38

Happy Programmer 2023. 8. 7. 23:42

메일을 확인한 뒤 회의내용 및 일정을 정리했다.

 

목, 금에 회의가 우르르 잡혀있었기 때문에 상당히 할 일 목록이 길게 늘어져버렸다.

 

undelete 트리거의 작동을 다시 한번 확인한 다음

해당 기능에 넣기 위해 다시 하위 레코드(Detail)로 돌아갔다.

 

Detail 트리거에서 삭제 및 삽입 부분의 트리거를 작동시킬 때

글로벌 변수로 사용하는 컨벤션 대신

파라미터를 넣어 값을 사용하게 만들어 외부에서도 트리거에 사용할 함수를 같이 사용할 수 있게 했고

Master에서 Detail들을 쿼리해온 다음 해당 값들을 모아 트리거에 사용하던 함수를 작동시켰다.

 

undelete가 정상 처리되는 것을 보고 delete 또한 해당 방식으로 처리해줬고

삭제를 진행하다보니 정상적인 작업을 할 때는 문제가 없는 코드였지만

delete, update 등을 진행할 때 동일한 fake Master를 가지고 있는 경우(relate)

Mapping을 할 때 문제가 발생하는 것을 확인했다.

 

해당 문제를 해결하기 위해 List로 관리하던 Id들은 Set으로 변경했고

Map으로 대응해 값들을 가져오던 것들은 Map<Id, Object>형태가 아닌

Map<Id, List<Object>>형태로 만들어 내부에서 순회한 다음 해당 값들을 한번에 처리해 

update 등의 처리를 더 효율적이고 에러가 발생할 여지가 없게 만들었다.

 

예를 들어 기존에는 xMap.put(item.Id, item); 형태였다면

아래의 형태처럼 리스트 존재 여부를 판단한 다음 값을 추가했다.

if(xMap.get(item.Id) != null){
  xMap.get(item.Id).add(item);
}
else{
  List<Object> xList = new List<Object>();
  xList.add(item);
  xMap.put(item.Id, xList);
}

 

빌더를 사용하다 자꾸 에러가 나던 부분이 뭔지 몰랐는데

해당 부분은 빌더의 문제가 아닌 http request의 타임아웃 세팅 문제였다.

 

timeout을 널널하게 잡아주니 에러가 발생하지 않았고

테스트용으로 timeout을 짧게 잡으니 해당 에러를 확인할 수 있었다.

 

flow, builder 등의 조회 기준들을 전부 바꾼 다음

필드 정리까지 진행했고

Validation 추가를 통해 안전하게 사용할 수 있는 구조를 만들 수 있었다.

 

Validation 부분도 변경을 하려면 유효성검사에 걸려서 변경이 안되는 문제가 발생했는데

예를 들어 수량이 10개고 4개를 사용했다면 잔여 수량은 6개가 남아버리게 되는데

여기서 4개에서 7개로 변경하게 되면 정상적으로 생각할 때 3개가 남아야 하지만

Validation에서는 6개가 남았는데 7개를 요청한다고 보고 에러가 발생해버렸다.

 

해당 문제를 곰곰히 생각해보니 이전 값 또한 비교 대상에 추가해야 처리가 가능할 것 같았고

현재 값을 저장할 수 있는 fm 필드를 하나 생성해 자연스럽게 최신 현재값만을 가지고 있게 만든 다음

해당 값과 잔여 재고를 더한 값과 바꾸고 싶은 값을 비교해 에러가 발생하지 않게 수정했다.

 

 

 

(1).백준 7782번 Alien은 우주선이 내려올 때 주어진 위치를 포함하는지를 묻는 문제였다.

 

각 우주선들의 모서리 좌표를 받을 수 있는데

x축의 좌표가 x1, x2의 사이에 있고

y축의 좌표가 y1, y2의 사이에 있는지 체크하는 함수를 만든 다음

해당 조건이 만족할 경우 result 값을 true로 변경하고 break로 추가 연산을 멈추는 방식으로 해결했다.

const input = `2
2 2
1 1 4 4
5 5 7 7`.split('\n')

let result = "No"
const [x, y] = input[1].split(' ').map(Number)
const checker = (a1, b1, a2, b2) => {
    if(a1 <= x && x <= a2 && b1 <= y && y <= b2){
        return true
    }
    return false
}

for(let i = 2 ; i < input.length ; i++){
    const [a,b,c,d] = input[i].split(' ').map(Number)
    if(checker(a,b,c,d)){
        result = 'Yes'
        break
    }
}


console.log(result)