카카오톡 연동 심플리챗 시연 영상을 봤는데

예전에 했던 omni?같은 것과 유사한 것을 커스텀해서 만든 것 같았다.

 

저것도 뭔가 과제로 나오면 재미있을 것 같다는 생각이 들었지만

현재 과제가 진행중이기 때문에 개인 학습 시간이 있으면 시도해봐야겠다.

 

동기분들과 API 통합으로 서로의 상품들을 받는 모습도 연출해볼까 했지만

서로 규격이 다른 부분도 있고 기준으로 잡은 키가 다른 문제도 있어서

일단 보류하기로 했다.

 

스케쥴러에 어제 만들었던 메서드를 집어넣으려고 진행해봤지만

메서드가 자꾸 터지면서 작동하지 않았다.

 

처음에는 []형태로 값이 들어가서 없는 내용을 형변환하려고 해서 안된다고 생각하고

해당 값을 잡으려고 1시간 가까이 null, .length, .size, isNull, isEmpty등을 적용해보고

직접 값을 보고 [], ‘[]’ 등으로 잡았더니 최종적으로 ‘”[]”’로 잡을 수 있었다.

 

예외처리로 A에서 받아온 값이 ‘”[]”’인 경우 업데이트해야할 정보가 없고

보유 데이터를 모두 지워야 한다는 작업을 진행하게 했고

성공적으로 모든 데이터가 지워지는 것을 보며 만족할 수 있었다.

 

하지만 다시 전체 데이터 생성 후 동기화를 시도하니

배열 내부에 객체가 담겨져 있음에도 터져버리는 것을 볼 수 있었고

이건 내부에 값이 있고, 없고의 문제가 아니라 기존 데이터를 사용할 수 없는 문제라는 것을 알 수 있었다.

FATAL_ERROR System.TypeException: Invalid conversion from runtime type String to List<ANY>

 

이 에러가 끊임없이나타나며 괴롭혔는데 생각해보면 그 이전에도 같은 문제였다.

 

이 문제를 검색해서 형변환을 여러번 거치기도 하고

이름을 바꾸거나 vscode 재접속 등의 작업을 진행해도 되지 않았고

2시간 30분동안 진행하면서 String으로 나온다는 것은 직렬화가 되지 않았다는 결론을 얻게 되었다.

 

검색으로 100개 이상의 페이지를 확인하고 공식문서나 JSON까지 모두 봤지만

직렬화 두번에 관련된 내용은 찾아볼 수 없었고

future? 또는 callout 상태의 스케쥴 처리인 경우 어떻게 지 멋대로 직렬화를 걸어줘서

역직렬화를 두번 걸어야 정상 데이터를 받을 수 있다는 이야기를 볼 수 있었다.

 

하지만 역직렬화를 두번 걸어주고 싶어도 한번 건 상태에서 또 시도하면 배포가 되지 않았는데

당연히 String이 아닌 객체를 역직렬화 하려고 해도 할 수가 없는 것이었다.

 

10시쯤부터 2시까지 막힌 상태로 여기저기 도움을 구하러 다녔지만

더블직렬화라는 이상한 주제에 대해 아는 사람은 존재하지 않았다.

 

deserialize(response.getBody(), List<Object>.class)등의 타입 지정도 직렬화가 두번이라 해결할 수 없었고

최종적으로 블레이크에게 도움을 요청하니 더블직렬화가 뭔지는 모르겠지만

그걸 확신하고 있으면 try catch로 시도해볼 수는 있다고 하셨고

실제로 try catch를 사용하니 처리가 되는 것을 볼 수 있었기 때문에 문제는 해결했고

catch에 들어갈 타입을 지정해둬야 해당 에러일 경우에만 더블 역직렬화로 처리된다는 말을 듣고

열심히 타입을 찾아봤지만 해당 타입이 정리된 내용도 볼 수 없었고

에러메시지를 잘 보고 설마 이건 아닐 것 같은데 싶은 System.TypeException을 넣으니 적용되는 것을 볼 수 있었다.

try { //최종적으로 적용된 역역직렬화 코드
        results = (List<Object>)JSON.deserializeUntyped(response.getBody());
    } catch (System.TypeException e) {
        results = (List<Object>)JSON.deserializeUntyped((String)JSON.deserializeUntyped(response.getBody()));
    }

점심 먹고 와서 시도해서 실패한 내용들

평소에 자꾸 배포하겠냐는 질문이 저장할 때마다 출력되서

그 사이에 다른 명령을 할 경우 무시되는 일이 많았는데

드디어 원인을 찾을 수 있었다.

 

범인은 바로 아래의 악독한 놈으로

멍청하게 실제 배포는 하지도 못하면서

시도만 계속 날리고 에러메세지를 출력하느라

명령을 바로 진행할 수 없게 만드는 주범이었다.

Dx-code-companion › Autosave: Enabled

 

제로에게 완성된 부분에 대해서 시연하며

일부 특정 데이터만 불러오는 것도 된다고 보여주던 중

JSON.serialize(products); 방식으로 api 응답을 할 필요가 없다는 충격적인 사실을 알려줬고

그제서야 왜 가끔 이중 직렬화가 되는지를 이해할 수 있었다.

 

힘들게 해결했던 코드였지만 안타깝게도 보내줘야 할 것 같아서

블레이크와 함께 해결한 try catch는 보내줬고

모든 코드를 정상화할 수 있었다.

 

그 이후 postman으로 id값들을 params로 넘겨주니

해당되는 값들만 받아올 수 있었기 때문에

해당 작업을 처리하는 메서드를 만들기로 했다.

 

이번 메서드는 굳이 callout을 쓸 필요가 없기 때문에

조금 더 편안하게 할 수 있을 것 같았다.

 

메서드를 작성하던 도중 자꾸 에러가 발생해 원인을 찾았는데

하나만 넣었을 때는 List인데 되고 두개를 넣었을 때는 터져서 자세히 보니

[’a’,’b’]가 아닌 [’a,b’]로 넣어서 터졌던 것을 확인할 수 있었다.

 

터진 부분에서 원인을 찾다보니 이상한 짓들을 많이 해봤는데

디버그 도중 코드가 이상한 것을 확인하고 겨우 발견할 수 있었다.

 

문제는 where in의 동작을 확신할 수 없어서

그 부분을 또 검색하게 되고 split, join등도 모르는 내용이라 추가로 조회하다 보니

시간을 생각보다 많이 사용했다.

 

내일은 진짜 lwc를 진행하고

그 뒤에 테스트케이스, pmd를 잡은 다음

여유가 될 경우 하드코딩된 부분들을 처리하고

그 뒤에 org들을 추가로 생성하던지 할 예정이다.

 

 

 

 

 

(1).백준 17094번 Serious Problem는

e와 2의 갯수 중 더 많은 것을 출력하고 같을 경우 'yee'를 출력하는 문제였는데

e의 갯수만 카운팅 한 다음 2배를 곱해서 총 갯수와 같으면 yee를 출력하고

e의 합 *2가 총 합보다 클 경우 e, 아니면 2를 출력했다.

const input = `3
e2e`.split('\n')

const total = Number(input[0])
let sumE = 0

for(let i = 0 ; i < input[1].length ; i++){
    if(input[1][i] === 'e'){
        sumE++
    }
}
sumE *= 2

if(sumE === total){
    console.log('yee')
}
else if(sumE < total){
    console.log(2)
}
else{
    console.log('e')
}

'회고' 카테고리의 다른 글

[수습일지] - 47  (0) 2023.05.12
[수습일지] - 46  (0) 2023.05.11
[수습일지] - 44  (0) 2023.05.09
[수습일지] - 43  (0) 2023.05.08
[수습일지] - 42(주말)  (0) 2023.05.07

+ Recent posts