[개발일지] - 374
요청사항 중 T표기를 제외하고 해달라는 내용이 있었기 때문에
날짜 타입을 변경하려고 처리했지만 null값도 있고 여러모로 불편사항이 있어서
고민하다가 애초에 String으로 넘어왔었기 때문에 24-xx-xx 형태라고 할 때 8자만 잘라 쓰기로 했다.
버튼 생성으로 개체를 만들기 위해 Flow 내부 작업을 하는데
개체가 너무 복잡하게 연결되어 있는데 레코드를 가져온 것에서 조회필드를 가져올 수 없기 때문에
해당 레코드를 가져와서 연결 레코드의 아이디를 꺼낸 다음
또 관련 레코드를 조회하는 다단계식 레코드 가져오기를 해야 했다.
10시에 예정된 회의 전 히스토리를 다시 한번 확인하고
어제 일단 팀장님에게 말씀드리긴 헀지만 확실히 혼자서 회의 참여가 가능할 것 같았기 때문에
오늘 회의는 나 혼자 들어가기로 했다.
회의 전 세팅을 미리 하고 정시가 되기 전 참여할 수 있었는데
고객사의 협력사쪽은 이사분까지 오셔서 2:1이었기 때문에
고객사의 요구사항이라 추가 개발을 해야 하는 부분이라고 계속 언급했지만
기존에 존재하던 인터페이스로 진행할 수 없냐는 느낌으로 계속 방어당해버렸고
모든 내용을 파악한 것이 아니라 불가능할 것 같다고 몇번 하긴 헀지만 일단 추가 확인을 하기로 했다.
고객사에서 오신 부장님의 경우에는 개발쪽은 정확히 아시지 못했기 때문에
내가 거의 대변하는 느낌으로 말하게 되었지만
고객사가 말하는게 아니고 그쪽에서 보기에는 여기도 고객사의 협력사기 때문에
내 말에는 큰 힘이 실리지 않아서인지 일단 회의는 마무리되어버렸는데
확실히 팀장님이 계신거랑 계시지 않은 것의 차이가 느껴졌다.
얼마 뒤 내가 요청한 내용대로 인터페이스를 할 수밖에 없다는 것이 확인되었는지
협력사쪽에서 전화가 와서 post 방식으로 인터페이스를 SFDC에 쌓는 것으로 협의되었고
회의 전 요청받은 조회 페이지 관련 작업을 추가로 진행했다.
다른 내용들은 수월하게 할 수 있었지만 페이지 정렬 부분이 문제였는데
이것저것 시도한 끝에 예전에 혼자 페이지네이션을 연습했던 곳에서 가져온 코드로
리스트를 정렬된 내용으로 뿌려줄 수 있었다.
sorting(e){
const before = this.sortStr
this.sortStr = e.currentTarget.id.split('-')[0];
this.targetField = e.currentTarget.id.split('-')[1]
const row = this.sortStr.split('th')[1];
const classList = this.template.querySelectorAll('.arrow')
for(let i = 0 ; i < classList.length ; i++){
classList[i].classList.remove('hidden')
if(i == row){
continue;
}
classList[i].classList.add('hidden')
}
if(this.sortStr == before){
this.isUp = !this.isUp;
}
else{
this.isUp = true;
}
//정렬할 개체의 타입 확인
const targetType = this.itemList[0] == null ? 'No List' : typeof this.itemList[0][this.targetField]
const newItemList = [...this.itemList]
if (targetType == 'number') {
newItemList.sort((a, b) => {
const aValue = a[this.targetField];
const bValue = b[this.targetField];
if (aValue === null || aValue === undefined) return 1;
if (bValue === null || bValue === undefined) return -1;
return this.isUp ? aValue - bValue : bValue - aValue;
});
} else {
newItemList.sort((a, b) => {
const aValue = a[this.targetField];
const bValue = b[this.targetField];
if (aValue === null || aValue === undefined) return 1;
if (bValue === null || bValue === undefined) return -1;
return this.isUp ? aValue.localeCompare(bValue) : bValue.localeCompare(aValue);
});
}
this.itemList = [...newItemList]
}
도중에 여러 문제가 발생했는데
일단 target.Id로 가져오게 될 경우 그 하위의 Id를 추적해서 undefined가 출력되었기 때문에
currentTarget으로 변경한 다음 원하는 위치의 Id를 제대로 가져올 수 있었다.
그 외에 정렬의 경우에도 문자열은 sort(), 숫자는 sort((a,b) ⇒ (a-b))형식으로 했었기 때문에
개체도 편하게 a[x] - b[x] 형태로 할 수 있었지만
문자열의 경우에는 기존에 하던 방식대로 비교가 불가능해서 검색해본 결과
localeCompare를 통해서 개체 값을 비교하는 방식으로 진행해야 했다.
하지만 중간에 값이 없는 경우에는 정렬 자체가 터져버렸는데
결국 null 체크를 넣어서 정렬을 했지만 그래도 되다 안되다 문제가 있었는데
값을 조회해보니 undefined도 출력되었기 때문에 두가지 조건을 모두 체크해서 해결할 수 있었다.
하드코딩으로 분기처리를 수십개의 필드에 모두 할 수 없었기 때문에
Id의 규칙에 해당 필드값을 추가해서 targetField라는 느낌으로 바로 해당 값을 비교할 수 있게 했고
숫자와 문자열의 정렬 방식이 달랐는데 각자 분기처리를 하기 귀찮았기 때문에
개체에서 해당 값을 조회할 때 targetType으로 숫자 타입인지 저장하는 변수를 생성했다.
버튼을 게속 누르면 정렬은 잘 동작했지만
처음 누른 경우에는 값들이 바뀌지 않는 문제가 있었는데
배열의 참조가 값이 아닌 주소의 참조 형태로 내부 값만 바뀐 것이었기 때문에
구조분해할당을 통해 새로운 값을 재할당하는 방식으로 변경하니
처음 정렬을 클릭했을 때도 정상적으로 정렬이 되는 것을 확인할 수 있었다.
오후에는 갑작스럽게 2시간짜리 통합회의에 들어가게 되었는데
나는 그 프로젝트에 아직 참여한적이 없어서 내가 왜 들어가는지 의아했었는데
다행히 인터페이스팀 관련 내용을 먼저 빠르게 확인해주셨고
30분도 안된 시점에서 인터페이스팀은 먼저 종료시켜주셨다.
첫번째 프로젝트 추가 인터페이스 관련해서 협의된 내용 재확인 통화를 마쳤고
그 사이에 고객사에서 유지보수 문의가 날아온 내용을 확인하고
로그 내역을 확인한 다음 SAP으로 들어온 내용이 없다고 전달했는데
이번엔 드물게도 우리쪽 문제라서 급하게 수정을 진행해야 했다.
원인은 해당 개체의 자식 레코드를 7~80여개나 넣었기 때문에
여태 한번도 없었던 SFDC 쿼리 한도 문제로 인터페이스가 터져버렸고
인터페이스 로그 또한 DML을 사용하기 때문에
로그가 작성되지도 못하고 그대로 인터페이스가 종료되어 버린 것이었다.
한도초과 로직은 생각보다 빠르게 찾을 수 있었기 때문에
고객사에서 급하다고 하셔서 최대한 빠르게 한다고 하긴 했는데
답변 후 20분도 되지 않은 시점에 쿼리 로직 개선 및 운영 배포 후 테스트까지 마쳐서
예전보다 확실히 실력이 늘어난 것이 느껴졌고
이전에 왜 PMD에서 경고 표시가 뜨는지 의아했던 부분들이 이해가 됐다.
고객사 요청에 의한 추가인터페이스의 경우에는
SFDC에 테이블을 생성 후 회신을 달라는 메일을 추가로 받았는데
필드가 40여개 정도여서 테이블은 없지만 객체와 필드를 만드는데 시간이 오래 걸렸다.
단순히 필드 생성이면 간단할 수 있는데 필드 타입도 생소한 내용으로 적혀있고
LineNumber같은 무조건 숫자여야 비교가 가능한 값들도 문자열처럼 표기했기 때문에
정의서의 신뢰성 문제로 하나씩 확인하면서 값을 처리하다보니
날짜나 숫자 등 몇개가 더 문자열 필드처럼 적혀있거나
문자열 필드가 날짜 형태로 적혀있는 등의 문제를 수정할 수는 있었는데
이 부분들은 추후 인터페이스를 진행할 때도 문제가 될 수 있을 것 같다.
회의도 많이 참가하고 JS도 오랜만에 많이 만져보고
인터페이스 문제도 빠르게 해결하고 오늘도 보람찬 하루였다.
(1).백준 15873번 공백 없는 A+B는 두 숫자가 공백없이 문자열 형태로 붙어있었는데
두 값의 합을 구하라고 해서 조금 어이가 없었지만
둘 모두 1이상 10이하라는 조건이 있었기 때문에
둘 모두 10이라면 4글자, 둘 중 하나가 10이라면 3글자
그게 아니라면 무조건 2글자라고 생각되었기 때문에
4글자면 20, 3글자인 경우 가운데 글자가 0이면 10+x 형태
그 외에 3글자인 경우 x+10인 형태라서 10+ 나머지 값을 처리했고
마지막으로 두글자는 각자 Number Type으로 변경 후 합하는 방식으로 해결했다.
const input = `102`
if(input.length == 4){
console.log(20)
}
else if(input.length == 3 && input[1] == '0'){
console.log(10 + Number(input[2]))
}
else if(input.length == 3){
console.log(10 + Number(input[0]))
}
else{
console.log(Number(input[0]) + Number(input[1]))
}