주 프로젝트의 발송 중 하나에 불필요 필드를 제외하고 주석 내용들을 삭제 처리했다.

 

중간에 다시 추가 지시가 와서 지원 프로젝트를 운영 배포하고

아직 테스트서버에도 정확하게 발송되지 않은 것 같지만 고객사에서 했다고 하니 운영 발송을 요청했다.

 

주 프로젝트 중 두번째 양방향 발송 부분의 관계 필드들을 정리했는데

확인 도중 이상한 부분들이 있어서 문의를 발송하고

일단 Item 부분의 관계 필드를 생성했다.

 

도중 인터페이스 관련 질문이 들어와서 credential 관련 질문에 답변헀는데

확실히 뭔가 새로운 방식이 생기면 바로 적용해서 기술 발전 전파 속도가 빠른 것 같다.

 

Item 부분의 관계 필드를 연결하고 나니 두번째 개체의 답변이 왔는데

대부분 추측했던 것과 같은 내용이었고 pickList들의 api, label 값을 받아서 생성 후 연결해줬다.

 

바쁘지만 그래도 요즘 유지보수는 잠잠해서 간신히 할만하다 싶었는데

생각하기가 무섭게 갑작스럽게 유지보수 문의들이 들어와버렸고

처음 들어온 내용은 다행히 timeout쪽이었기 때문에 SAP에 전달 후 넘어갔지만

그 뒤로 메인 개체 관련 인터페이스 오류가 발생해서 추가 시간을 많이 소모해야 했다.

 

확인 결과 SAP에서 필수 필드 중 하나를 빼고 발송해서 발생한 문제로 추측됐고

그게 아닌 경우 SAP에서 에러가 발생해서 발송조차 하지 않았을 가능성도 있었는데

문제의 원인으로 추측되는 것들을 정리해서 SAP으로 전달했다.

 

고객사에서 주 프로젝트에서 처음 했던 인터페이스는 언제 사용 가능하냐는 문의를 하셨는데

PM이 있는 것도 아니고 나 혼자 전체 프로젝트를 진행하고 있는 상황이고

딱히 기한이나 정확한 요구사항도 듣지 못했기 때문에 전체 완료가 되면 배포한다고 생각했는데

그래도 테스트클래스를 미리 만들어둬서 바로 배포 후 SAP에 발송 요청을 전달했다.

 

요청을 위해서 token, 정의서 등 여러가지가 필요할 것 같지만

기존에도 인터페이스를 진행하고 있는 회사라 token을 별도로 보낼 필요는 없어보였고

정의서 또한 그쪽에서 요청한 내용대로 만들고 개발서버에서 테스트까지 했기 때문에

그냥 발송 요청만 보냈는데 과연 잘 올지 긴장된다.

 

양방향 관련 추가 확인을 위해 요청받지 않은 type 관련 필드를 추가했고

두번째 양방향 발송 부분을 생성하는데

첫번째 양방향은 10시간 이상 걸려서 간신히 조각을 맞췄던 것 같은데

두번째는 이미 했던 틀이 어느정도 있어서 그런지 1시간이 좀 넘은 시점에 얼추 틀을 잡았고

한두시간이면 세부 필드 조율까지 마칠 수 있을 것 같았다.

 

다음에는 틀이 없다고 해도 정의서만 제대로 작성된 상태라면 몇시간 안걸릴 것 같은데

확실히 처음 해보는 인터페이스는 조금 어렵지만

한번 해보고 나면 그 다음부터는 속도가 붙어서 보람있는 것 같다.

 

 

 

(1).백준 30655번 Pique Esconde는 참여자들의 인원수와 술래가 주어질 때

숨어있는 마지막 한명을 찾아야 하는 문제였다.

 

일단 테스트케이스가 난잡했기 때문에 for문 내부에서 인원수를 x로 받아오고

x-2만큼을 i에 더해서 테스트케이스 단위로 잘라지게 만들었고

쓸대없는 '0  0'이 마지막에 붙어있었기 때문에 0 체크를 해서 for문을 종료시켰다.

 

테스트케이스 내부 for문을 순회하면서 map에 사람을 담아주고

최종적으로 순회를 통해 없었던 사람을 찾아서 출력했다.

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

const result = []

for(let i = 0 ; i < input.length ; i++){
    const [x, n] = input[i].split(' ').map(Number)
    if(x == 0){break}
    const map = {}
    for(let j = 1 ; j <= x ; j++){
        map[j] = 1
    }
    map[n] = 0
    for(let j = i+1 ; j < i + x - 1 ; j++){
        map[input[j]] = 0 
    }

    for(let key in map){
        if(map[key]){
            result.push(key)
            break
        }
    }
    i += x-2
}

console.log(result.join('\n'))

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

[개발일지] - 319(석가탄신일)  (0) 2024.05.15
[개발일지] - 319  (0) 2024.05.14
[개발일지] - 318  (0) 2024.05.13
[개발일지] - 317(주말)  (0) 2024.05.12
[개발일지] - 316(주말)  (0) 2024.05.11

(1).백준 24830번 Broken Calculator는 계산기가 특이한 규칙으로 변경되었을 때

입력된 값을 처리하면 어떻게 출력되는지를 구해야 하는 문제였다.

 

각 기호에 맞는 조건에 따라 이전 값 처리 또는 현재 값 등록 등의 처리를 진행했고

최대 10의 18승인 100경까지 갈 수 있다는 조건이 있기 때문에 BigInt 처리했다.

const input = `5
4 * 5
2 + 5
3 - 1
20 / 3
13 / 24`.split('\n')

let before = 1n
const result = []

for(let i = 1 ; i < input.length ; i++){
    const [a, x, b] = input[i].split(' ')
    if(x == '*'){
        let resultB = BigInt(a) * BigInt(b) * BigInt(a) * BigInt(b)
        before = resultB
        result.push(resultB)
    }
    else if(x == '/'){
        let resultB = (BigInt(a) + 1n)/ 2n
        before = resultB
        result.push(resultB)
    }
    else if(x == '+'){
        let resultB = BigInt(a) + BigInt(b) -  before
        before = resultB
        result.push(resultB)
    }
    else if(x == '-'){
        let resultB = (BigInt(a) - BigInt(b)) * before
        before = resultB
        result.push(resultB)
    }
}

console.log(result.join('\n'))

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

[개발일지] - 320  (0) 2024.05.16
[개발일지] - 319  (0) 2024.05.14
[개발일지] - 318  (0) 2024.05.13
[개발일지] - 317(주말)  (0) 2024.05.12
[개발일지] - 316(주말)  (0) 2024.05.11

 

오자마자 바로 방화벽 관련 문의를 양쪽에 전달해야 했는데

둘의 에러 메세지가 차이가 나긴 했지만

일단 SFDC에서 제공하는 APNIC IP 리스트와 회사 IP를 정리해서 전달했다.

 

지원요청받은 프로젝트에서는 빠르게 완성은 했었지만 테스트값을 못받고 있었는데

계속 전화를 시도했지만 받지 않아서 테스트를 할 수 없었다.

방화벽 관련 통화 후 변경된 인터페이스를 수정했고 아래와 같은 에러코드를 해결할 수 있었다.

the remote host or network may be down or blocking requests from publicproxy. Please verify acls on the destination side 111.222.333.444

 

중간에 timeout 유지보수 문의가 들어왔지만

해당 문제는 ERP에서 서버 문제가 발생했기 때문에 발생하는 문제라 ERP로 전달해서 해결했고

두번째 프로젝트에서 조건에 따라 상태값을 분기처리해서 보내는 로직을 처리했다.

 

인터페이스에서 ERP로 보내는 경우 대부분 프로젝트들이 공통적으로 1회만 보내길 원하는데

그로 인해서 IsInterface같은 필드를 생성 후 1회 발송 이후에는 발송을 막는 로직을 설정해줬고

다시 첫번째 프로젝트로 돌아가 결과값을 받은 경우 ERP에서 받은 값을 없데이트해서 연결이 가능하게 했다.

 

첫번째 프로젝트의 경우 화이트리스트 추가로 인한 방화벽 해제로 문제가 해결되었지만

두번째 프로젝트에서는 PKIX 문제로 방화벽과는 관련이 없었는지 해결되지 않았고

검색을 통해서 해당 문제는 SSL에서 발생했다는 사실을 알아낼 수 있었다.

 

해당 문제가 발생한 가장 큰 원인은 https를 사용했기 때문에

SSL 인증서를 사용해서 인증을 진행해야 했지만 인증이 제대로 되지 않았기 때문이고

SSL 인증이 되지 않는 이유는 https에서 생성된 인증서가 만료되었거나

아니면 SFDC에서 확인할 수 있는 CA(공급자)에서 발급받은 인증서가 아니라 발생한 문제였다.

 

결국 https를 사용하는 고객사측에서 HTTPS 정의서를 정상 인증이 가능하게 변경하거나

http로 변경해서 사용하는 방법밖에 없었고

어차피 개발서버에서 인터페이스를 테스트하기 위한 목적이었기 때문에

고객사에서 https에서 http로 주소값을 바꿔서 인터페이스를 하기로 했고

원격 사이트 설정 및 사용자 정의 설정으로 주소값을 바꾸고 테스트하니 정상 처리되는 것을 볼 수 있었다.

 

지원요청받은 프로젝트에서 인터페이스 테스트 발송 요청을 하려고 했는데

오전부터 6번의 연락을 했지만 두번의 통화는 연결되지 않았고

세번째 통화의 경우 다른 사람 자리라고 해서 통화가 불발되었고

네번쨰 통화의 경우 본인이 담당자가 아니고 다른 직원을 배정했다고 안내를 받았고

다섯번째와 여섯번째 통화의 경우 전화를 받지 않아 진행할 수 없었다.

 

마지막 여섯번째 통화 끝에 문의사항은 문자로 달라는 문자를 받았고

저번주에 보낸 메일 확인 요청을 드디어 할 수 있었다.

 

첫번째 프로젝트에서 발송 오류가 나서 확인해보니

샘플 데이터들로 받았던 값들을 그대로 보내면 필수 필드가 없는데

결국 필수 필드에 맞는 값이 없는 경우 기본값을 하나 추가해 인터페이스 테스트를 진행했다.

 

여섯번째 통화와 문자 발송 끝에 전화가 온 지원 프로젝트에서

인터페이스 변경사항에 대한 정보를 들을 수 있었고

데이터의 경우에는 사이즈가 한도를 초과할 수 있을 것 같았기 때문에

1일 1회 인터페이스가 되는 대량 인터페이스의 경우에 잘라서 배치로 발송 요청으로 합의됐다.

 

두번째 프로젝트에서는 요청사항이 추가되었는데

특정 조건이 달성된 내용들만 인터페이스를 진행하기를 요청했고

해당 내용의 경우 여러가지 선택지를 전달한 끝에

선택 가능한 Item이 없는 경우 Object 자체 인터체이스를 하지 않고

에러메세지를 출력하는 방식으로 최종 결정이 났다.

 

저녁을 먹고 해당 조건에 따른 Flow 내부 처리를 진행했고

Class 내부에서도 Select 내부에 Where AND 조건을 추가해 특정 대상만 발송했다.

 

첫번째 프로젝트 중 두번쨰 양방향 인터페이스를 위해서

SFDC에서도 발송하는 버튼을 추가해야 했기 때문에

여기는 Flow가 아닌 페이지라 LWC 페이지와 JS 메서드들을 확인 및 수정했다.

 

첫번째 프로젝트 중 세번째 인터페이스에 대해서

SFDC 내부 연결을 위한 추가적인 필드 조건들에 대해 정리하고

해당 내용들에 대한 문의사항을 수신자를 나눠 발송한 다음

지원 프로젝트에서 테스트를 제대로 하지 않은건지 잘못 이해하고 토큰만 확인한건지

인터페이스 로그에는 아무 값도 찍혀있지 않았기 때문에 재발송 요청 메일을 작성했고

양방향으로 작성해야 하기 때문에 세번쨰 양방향 인터페이스의 틀이 될 클래스를 확인했다.

 

결국 10시가 넘어서 퇴근하게 되었지만 마감일에 비해 해야 할 일들이 아직도 많은 편인데

이번주에 어느정도 해결이 됐으면 좋겠다.

 

 

(1).백준 16427번 Time Limits는 시간제한이라는 내용과 다르게 가장 오래 걸린 시간과

주어진 값을 곱한 시간에 가장 가까운 정수를 구해야 하는 문제였다.

 

다만 시간 이전이 아닌 이후 시간 중 가장 가까운 시간을 구해야 했기 때문에 Math.ceil을 사용했고

밀리초였기 때문에 /1000을 사용해 초로 변환했다.

const input = `3 4
47 1032 1107`.split('\n').map(el => el.split(' ').map(Number))

console.log(Math.ceil(Math.max(...input[1]) * input[0][1] / 1000))

 

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

[개발일지] - 320  (0) 2024.05.16
[개발일지] - 319(석가탄신일)  (0) 2024.05.15
[개발일지] - 318  (0) 2024.05.13
[개발일지] - 317(주말)  (0) 2024.05.12
[개발일지] - 316(주말)  (0) 2024.05.11

출근 후 일정을 정리한 다음 부로 메인 프로젝트 필드 추가 및 문의사항을 정리했다.

 

이전에 인터페이스 발송 후 갑작스럽게 필수 필드라고 8개 정도가 추가로 더 들어왔는데

해당 문제가 아니라 postman 발송 자체가 제대로 오지 않았는데

Response 값 자체가 특이 형태인건지 postman이 받지를 못해서 시간이 더 걸릴 것 같았다.

 

해당 내용에 대해 문의 전화가 와서 확인 후

처리되고 다른 문의사항까지 같이 정리되면 알려주신다고 하고 넘어갔고

추가로 유지보수 문의가 들어온 내용이 있어서 해당 필드 전수조사를 시작했다.

 

20년도에 xx1, xx2~ xx40 같은 형태로 주석도 없이 생성된 필드들 정보를 내가 어떻게 아는지 의문이었지만

최선을 다해서 클래스, 필드, 개체 등 여러가지 내용들을 보다 보니

class들 중 일부 주석에서 필드 관련 기능에 대해 작성된 부분도 볼 수 있었고

미궁에 빠진 대부분의 필드의 경우 전체 레코드를 조회해보니 null값만 있는 경우가 많았다.

 

정리 후 해당사항을 전달했고

그 다음에는 다시 필수 필드라는 것들을 정리 후 추가했는데

어느정도 정리가 된건지 발송 시도는 됐지만 아래의 에러가 발생했고

해당 내용을 처리하려고 하다가 갑작스럽게 다른 프로젝트 문의가 와서 보류하고 넘어가기로 했다.

PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

 

담당하고 있는 다른 프로젝트의 경우 마감일에 대해 제대로 공지받지 못했고

정의서도 부실하게 임시라고 붙어서 왔기 때문에 미뤄둔 상태였는데

오늘 추가 필드들까지 붙여두고서 해당 인터페이스를 테스트 가능한지 문의가 들어왔다.

 

애초에 아직도 정의가 부족한 상황에서 인터페이스 테스트를 당장 어떻게 한다는건지 황당했지만

영업팀에서 해당 인터페이스 우선순위가 다른 것들보다 높다고 하셔서 일단 이걸 먼저 처리하기로 했다.

 

안본지 2주 가까이 지났기 때문에 정의서, 개체, 요구사항, 이전 메일 등 전체 내용을 확인했고

정의서 내용에 따라 postman 발송 시도를 해서 일단 전송이 되는 것 같은 느낌은 받을 수 있었다.

 

인터페이스 진행을 class와 flow를 섞어서 하길 원했는데

특이한 flow만 링크 하나 보내주고 참고해서 해달라고 하셨고

해당 내용에 불필요해보이는 것도 많고 class 대체 등 문제가 많아서 해당 내용 파악도 50여분 걸렸다.

 

카운팅 하는 부분이 있었는데 이걸로 기준 ID를 삼으려는 것 같았고

해당 사항을 이용하기 위해 처리 로직을 추가하고 해당 로직에 이용할 수 있는 필드도 추가해줬지만

더 자세히 확인하니 인터페이스 정의서 자체가 완전히 달라서 굳이 필요가 없었다.

 

같은 회사에서 운영하고 있지만 받는 url 자체가 달랐기 때문에

기존에 있던 인터페이스들과 상호작용은 거의 다 할 수 없었고

새로 만드는 클래스 내부에서 대부분의 작업을 처리해야만 했다.

 

다시 전화가 와서 메인프로젝트내용을 재확인하고

발송 시도를 했지만 실패해버렸는데 아무래도 방화벽 문제로 추정되지만

해당 사항과 IP 목록을 정리해서 보내기에는 두번째 메인프로젝트 시간이 너무 촉박했다.

 

두번째 메인의 정의서 필드들 중 수정사항들을 정리한 다음 개발에 추가했고

Custom Setting을 생성해서 url, token 등을 설정했다.

 

조금 순조롭게 클래스를 만들어가고 있었는데 다시 또 유지보수에서 문의사항이 들어왔고

해당 내용을 무시하고 두번쨰 프로젝트만 끝내기에는 수요일이 쉬는 날이기 때문에 애매해서

결국 어쩔 수 없이 유지보수를 다시 먼저 처리해야 했다.

 

자꾸 들어오는 필드 문의사항을 답변해주고

SFDC가 아닌 홈페이지 개발쪽에서나 알 수 있는 정보를 자꾸 물어봐서

현재 사용하고 있는 고객사에게 문의하라고 직접 고객사를 태그해서 전달했다.

 

중간에 Error authenticating with the refresh token due to: expired access/refresh token 에러가 발생했는데

해당 내용은 간단하게 vscode에서 재인증을 받고 재접속을 하면 됐지만

재접속을 하라는 내용이 없어서 인증만 한 상태로 이런저런 시도를 하다가

인터넷 검색을 통해 vscode 재접속을 하면 된다는 사실을 알고 복구할 수 있었다.

 

예전에는 이런 문제가 발생해서 vscode를 삭제 후 했었던 것 같은데

물론 그것도 껐다 키는 것과 같아서 해결은 됐었지만 좀 무식한 해결 방법이었던 것 같다.

개발자 중 한분이 Run All Test가 보이지 않아서 테스트를 할 수 없다고 하셨고

원인을 파악하려고 sfdc can not show isRunning test로 검색해보니

Salesforcedx-vscode-apex › Java: Memory에서 메모리 한도를 키워줘야 하는 문제였다.

 

저녁식사 후 인터페이스 클래스를 완료할 수는 있었지만

발송 후 아까와 같은 에러가 다시 발행해서 결과값을 받을 수 없었다.

(PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target)

 

flow 내부에서 작동할 수 있게 class와 flow를 연결해주고

해당 내용이 정상 작동되지만 인터페이스 발송 부분에서만 에러가 터지는걸 확인하고

나머지는 내일 방화벽 해제 요청을 해서 해결하기로 하고 9시 40분쯤 마무리했다.

 

 

(1).백준 11466번 Alex Origami Squares는 주어진 직사각형에서 정사각형 3개를 만들어야 할 때

가장 크게 만들 수 있는 정사각형 한 변의 길이를 구해야 하는 문제였다.

 

정사각형은 긴쪽으로 3개를 만들거나 2개, 1개가 삼각형 모양인 형태밖에 없기 때문에

긴 쪽을 기준으로 3개, 2개를 만들 수 있는 변의 길이를 구한 다음 Math.max로 비교해 출력했다.

const [min, max] = `250 100`.split(' ').map(Number).sort((a,b) => a-b)

console.log(Math.max(Math.min(min, max/3), Math.min(min / 2, max / 2)))

 

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

[개발일지] - 319(석가탄신일)  (0) 2024.05.15
[개발일지] - 319  (0) 2024.05.14
[개발일지] - 317(주말)  (0) 2024.05.12
[개발일지] - 316(주말)  (0) 2024.05.11
[개발일지] - 315  (0) 2024.05.10

(1).백준 30216번 Increasing Sublist는 

연속해서 오름차순으로 올라가는 가장 긴 배열의 길이를 구해야 하는 문제였다.

 

현재 값을 now에 저장한 다음

for문으로 index를 증가시켜가며 다음 값과 저장된 값을 비교하고

연속된 값인 경우 count를 증가시킨 후 maxCount와 비교 해 갱신해주고

연속되지 않은 경우 count를 1로 초기화시키고 now를 현재 값으로 변경시킨 다음

최종 maxCount를 출력하는 방식으로 해결했다.

const input = `15
10 70 80 5 5 5 15 20 30 40 60 9 8 70 80`.split('\n')[1].split(' ').map(Number)

let maxCount = 1
let count = 1
let now = input[0]

for(let i = 1 ; i < input.length ; i++){
    if(now < input[i]){
        count++
        now = input[i]
        maxCount = Math.max(maxCount, count)
    }
    else{
        count = 1
        now = input[i]
    }
}

console.log(maxCount)

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

[개발일지] - 319  (0) 2024.05.14
[개발일지] - 318  (0) 2024.05.13
[개발일지] - 316(주말)  (0) 2024.05.11
[개발일지] - 315  (0) 2024.05.10
[개발일지] - 314  (0) 2024.05.09

(1).백준 26594번 ZOAC 5는 키보드가 에러가 생겨서 계속 눌리는 상황이 발생했을 때

중복해서 같은 키를 누르지 않는 상황에서 한번의 키가 몇번씩 눌리는지를 구해야 하는 문제였다.

 

주어지는 값은 100만까지 사이즈가 컸지만

사실 중복이 없기 때문에 첫번째 나온 글자가 몇번 연속해서 나오는지만 카운팅하면 되는 문제로

for문으로 카운팅해서 해당 값을 출력했다.

const input = `ZZZOOOAAACCC`
let count = 1

for(let i = 1 ; i < input.length ; i++){
    if(input[i] == input[0]){
        count++
    }
}

console.log(count)

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

[개발일지] - 318  (0) 2024.05.13
[개발일지] - 317(주말)  (0) 2024.05.12
[개발일지] - 315  (0) 2024.05.10
[개발일지] - 314  (0) 2024.05.09
[개발일지] - 313  (0) 2024.05.08

프로젝트 인터페이스를 하는데 황당하게도 문의 결과 아직 인터페이스 대상 객체가 존재하지 않았다.

정확히는 A, B 인터페이스를 양방향으로 생성하고 있는데

A의 근거가 되는 a객체에서 A 객체를 생성하고 그걸 인터페이스를 보내는데

B의 경우에는 b객체가 생성되지도 않은 상태인데

SAP에만 존재하는 B 객체의 레코드를 가져오는 인터페이스를 진행한 다음

b가 존재하지 않지만 b에서 B를 생성했다는 가정하게

B의 레코드를 SAP으로 전송하는 인터페이스를 상상코딩해야헀다.

 

실제로 요구하는 필드들을 b에서 가져올 수 있는지도 의문이지만

아직 설계되지도 않은 기능들까지 인터페이스를 해야 한다는게 상당히 당황스러웠다.

 

일단 B 인터페이스를 받아오는 부분은 필수적으로 진행되야 하기 때문에 해당 부분의 관계 연결을 정리하고 있었는데

갑작스럽게 인터페이스팀에서 진행하는 프로젝트 관련 회의에 초대받아버렸다.

 

잠깐 도와달라는 작업만 하고 한번도 회의에 참여한 적이 없었는데

해당 부분 관련해서 잠깐 듣기 위해서 90분 가까이 회의에 참여한건 시간이 많이 아까웠는데

그 사이에 메일 및 문의사항만 3개나 들어와서 더 마음이 복잡해졌다.

 

결국 메인 프로젝트 관련은 포기해야 했고

회의 중 들어온 문의사항 처리를 한 다음 회의 중에 언급된 내용들을 처리하기 시작했다.

 

key값 변경, 인터페이스 동작 재확인, 테스트클래스 재확인 등을 진행한 다음

새로 토큰을 발급받아서 정의서를 작성했는데 인터페이스를 하나의 User로 진행할 경우 로그인 Limit에 걸린다던지

로그를 확인할 때 작성자가 모두 동일해서 확인하기 어려운 문제 등 어려가지 애로사항이 있었는데

팀장님이 App Manager에서 만들어주신 client_credentials를 통해서 간단하게 해결할 수 있었다.

 

Salesforce 라이센스가 아니라 Org마다 5개씩 주어지는 Intergration 라이센스로 가능했기 때문에

고객사에서 추가 라이센스를 구매할 필요도 없는 효율적인 인터페이스 방법이었는데

스탠다드 개체에 대한 권한이 부여되지 않아 사용되지 않았었는데

Class 내부에서 Without Sharing을 사용할 경우 스탠다드 클래스도 변경이 가능한 것이 확인되었다.

 

다시 담당하는 메인프로젝트로 돌아와서 필드추가를 위한 문의사항을 정리하고 있었는데

또 유지보수 관련 문의사항이 들어왔다.

 

Account Engagement에서 자동으로 값이 들어왔을 때 Flow Trigger를 통해서 해당 시간을 기입하는 문제였는데

분명 Flow는 작동했고 중간 필드도 변경되었는데 시간 필드만 기입되지 않은 경우가 종종 발견되었다.

 

가능한 문제점이라면 AE의 불안정성이라던지

아니면 Flow 내부에서 ({!$Flow.CurrentDateTime}를 사용할 때 가끔 null값이 넘어간다는 의심이 생겼고

테스트를 위해 해당 Flow로 Update가 되었다는 것을 확인하기 위한 체크박스 필드와

해당 Flow 내부에서 시간이 정상 기입되었는지 확인할 DateTime 필드를 추가한 다음

Flow 내부에서 두 필드도 같이 업데이트하게 수정 후 추가 확인이 필요하다는 메일로 답변했다.

 

해당 내용을 처리한 다음 인터페이스 부분을 또 보려고 했는데

팀장님이 퇴근하자고 하시기도 하고 다시 시작하면 또 한두시간은 집중해서 해야 했기 때문에

그냥 한 단계가 마무리된 김에 퇴근하기로 했다.

 

 

(1).백준 29684번 Which Team Should Receive the Sponsor Prize?는

각 테스트케이스마다 2023초에 가장 가깝게 문제를 해결한 우승팀을 출력해야 하는 문제였다.

 

for문으로 각각의 테스트케이스를 분리해서 순회한 다음

승리 팀을 기록할 win, 현재 최저 차이를 담을 min을 생성하고

비교를 통해 최종 우승자를 result에 담아 한번에 출력하는 방식으로 해결했다.

const input = `2
123 4567
3
2024 2020 2023
5
2020 2020 2021 2024 2026
3
1599 2222 1599
8
2 2 3 3 4 4 5 1
4
7777 6666 8888 9999
0`.split('\n')

const result = []
for(let i = 1 ; i < input.length ; i+=2){
    const arr = input[i].split(' ').map(Number)
    let win = 0
    let min = 10000
    for(let j = 0 ; j < arr.length ; j++){
        const abs = Math.abs(2023 - arr[j])
        if(min > abs){
            min = abs
            win = j+1
        }
    }
    result.push(win)
}

console.log(result.join('\n'))

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

[개발일지] - 317(주말)  (0) 2024.05.12
[개발일지] - 316(주말)  (0) 2024.05.11
[개발일지] - 314  (0) 2024.05.09
[개발일지] - 313  (0) 2024.05.08
[개발일지] - 312  (0) 2024.05.07

어제 수정한 클래스 3개 뭉치의 테스트클래스를 작성하는데

첫번째 테스트클래스도 생각보다 무난하게 처리했고

두번쨰와 세번째는 첫번째를 참고해서 2개를 하는데 첫번째의 반도 걸리지 않아서

3개의 테스트클래스를 다 만드는데 50분밖에 걸리지 않았다.

 

문제는 빨리 끝냈다고 업무 총량이 줄어드는게 아니라는 부분이기 때문에

어제 추가된 부분의 정의서를 보며 요청사항에 해당하는 부분들을 추가 확인했고

2중연결을 통해 서브쿼리로 추후 작업에 필요한 필드를 바로 사용 가능하게 만든 다음

다시 기존에 담당하는 복잡한 인터페이스 프로젝트로 돌아왔다.

 

1500줄짜리 코드를 확인하는 것도 복잡했지만

사실 코드 자체의 난이도보다는 정의되지 않은 너무 많은 필드들을

기존에 몇년간 보충되면서 작업된 인터페이스 퀄리티를 요구하는게 문제 같았다.

 

게다가 다른 인터페이스는 생성되는 부분에 대한 정보가 하나도 없는데

만약 없다면 애초에 SFDC에서 SAP로 생성해서 보낼 수 없는 데이터가 되어버린다.

 

갑자기 또 들어와버린 이상한 유지보수같은 프로젝트 관련 내용을 처리하는데

그 와중에 그제 추가되어버린 2시간짜리 인터페이스 회의에 참여해야 했고

막상 참여했는데 인터페이스 이야기는 하지도 않고 어드민이 할만한 권한 이야기만 주구장창 했다.

 

메인 프로젝트는 커녕 요청받은 내용도 진행하지 못하고 회의에 참여했기 때문에

오늘도 어쩔 수 없이 저녁을 먹게 되었고 7시 30분쯤 요청내용은 처리할 수 있었지만

프로젝트 진전이 거의 없기 때문에 추가로 프로젝트 작업에 들어갔다.

 

마무리 부분을 겨우 끝내고 하나의 SFDC → SAP 발송을 할 수 있었는데

기존 SAP → SFDC 코드와 키 등을 고려해야 했고

사용자에게 보여주는 필드와 ERP 필드가 다르기 때문에

전송되는 코드는 유저가 생성할 수 있는 근거가 있어야 해서 근원을 찾아야 했는데

해당 부분을 같이 정리하면서 쿼리를 확인하느라 시간이 오래 걸렸다.

 

먼저 발송하기는 애매하기 때문에

해당 내용의 테스트클래스도 같이 작성해줘야 했는데

테스트클래스로 정상 작동을 확인한 다음 인터페이스를 발송했지만 안타깝게도 에러가 발생했고

다행히 postman으로 발송해도 동일한 에러가 발생했기 때문에

ERP쪽 서버가 닫혀있는걸로 인식하고 9시 50분쯤 마무리 후 퇴근했다.

 

 

(1).백준 30329번 Kick은 글자에 있는 kick을 찾아야 하는 문제로

다른 찾기 문제와 다르게 kickickick의 경우 3개가 되는 방식이기 때문에

list에 담아준 다음 4글자인 경우 앞글자를 하나씩 제거하고

kick이 된 경우 앞글자 3개를 제거하는 방식으로 해결했다.

const input = 'kickkickkickkick'
const arr = []
let count = 0
for(let i = 0 ; i < input.length ; i++){
    arr.push(input[i])
    if(arr.length == 4){
        if(arr.join('') == 'kick'){
            count++
            arr.shift()
            arr.shift()
            arr.shift()
        }
        else{
            arr.shift()
        }
    }
}

console.log(count)

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

[개발일지] - 316(주말)  (0) 2024.05.11
[개발일지] - 315  (0) 2024.05.10
[개발일지] - 313  (0) 2024.05.08
[개발일지] - 312  (0) 2024.05.07
[개발일지] - 311(어린이날 대체휴일)  (0) 2024.05.06

오늘은 아래와 같은 업무를 처리했는데(보안 상 식별 가능 내용 제외)

8시 30분에 출근해서 22시 25분까지 점심, 저녁시간 제외 12시간 가량 근무했다.

 

하나하나 설명하기에는 시간이 너무 늦기도 헀고

어느정도는 이제 숙달되었기 때문에 타이틀만 보고도 업무를 대충 알 수 있기 때문에 오늘 정리는 넘어가기로 했다.

 

리밋 관련 답변, PickList 추가 관련 인터페이스 처리

ERP 전송 시 담당자 코드 Order에서 당겨오기

상태값 추가 및 인터페이스 처리

발송 버튼 관련 클래스(1500줄짜리) 확인

발송 관련 LWC 확인

Flow History 관련 문의사항 답변

Report 관련 미연결 문의사항 답변

발송 관련 인터페이스 정의 문의 발송

히스토리 관련 문의 답변

인터페이스 수정 및 운영 배포

전체 데이터 Account 연결

마스터 관련 인터페이스

운영 마스터 데이터 마이그레이션

PickList 추가 및 기본값 설정 후 기존 레코드 기본값에 맞게 변경

마스터 탭 추가 및 리스트뷰 편집

xx, yy 인터페이스 Key 추가 및 upsert로 인터페이스 변경

마스터에 특정 인터페이스 관리용 레코드 추가

시리얼 넘버를 통한 조회 관계 연동

code를 통한 조회 관계 연동

3개 인터페이스 진행 시 마스터에서 관리되는 필드를 통한 진행여부 확인 후 저장

 

 

(1).백준 29308번 Закат는 Russia 국적을 가진 선수 중 가장 연봉이 높은 선수를 찾아야 하는 문제였는데

russia 국적인 경우 max로 연봉을 비교해가며 연봉이 더 높을 경우 기록된 이름을 바꾸는 방식으로 찾아냈다.

const input = `5
5000000 Banner Brazil
1000000 Malafeev Russia
3000000 Denisov Russia
2000000 Kerzhakov Russia
4000000 Criscito Italy`.split('\n')

let max = 0
let person = ''

for(let i = 1 ; i < input.length ; i++){
    const[salary, name, contry] = input[i].split(' ')
    if(contry == 'Russia' && Number(salary) > max){
        max = Number(salary)
        person = name
    }
}
console.log(person)

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

[개발일지] - 315  (0) 2024.05.10
[개발일지] - 314  (0) 2024.05.09
[개발일지] - 312  (0) 2024.05.07
[개발일지] - 311(어린이날 대체휴일)  (0) 2024.05.06
[개발일지] - 310(주말)  (0) 2024.05.05

오자마자 긴 연휴로 인해 밀려있던 일들을 처리해야 했다.

 

유지보수 중 간단해 보이는 인터페이스 연결 부분을 먼저 처리했는데

인터페이스 부분이라고는 하지만 내부 필드 연결만 해주면 추가 처리가 가능했기 때문에

복잡해 보이는 요구사항과 달리 30분도 되지 않아서 해결할 수 있었다.

 

회사 내부적으로 사진을 다 프로필에 등록해야 하게 변했기 때문에

메일을 확인해 12년전에 찍었던 사진을 등록한 다음

flow 관련 작업을 진행하고 있는데 다른 프로젝트에서 정의서가 들어왔다.

 

사실 저번주인가 저저번주에 들어오기로 헀던 정의서라 시간이 많이 밀렸지만

놀랍게도 마감 기간은 동일하게 이번달까지라고 하는 것 같았다.

 

정의서 내부에서 부족한 부분과 필요한 부분 들을 정리하고

해당 내용들을 중간에서 전달해주시는 영업팀장님에게 전달드렸고

그 사이에 추가 업무지시를 받아서 해당 부분의 정의서를 확인하다 점심을 먹으러 갔다.

 

오후에는 또 문의가 들어와서 flow 처리를 한 다음

업무지시로 들어온 프로젝트 관련 인터페이스를 확인하는데

개체, 필드를 직접 다 만들고 정의서도 부실한 상태라 일부는 추측해서 만들어야 했다.

 

인터페이스 3개를 해야 한다고 넉넉하게 일주일을 준다고 하셨는데

해당하는 객체는 하나고 다른 타입으로 3개를 따로 인터페이스를 만들어야 했기 때문에

셋 중 하나는 스케줄 리스트 형태라고는 하지만 처음 하나를 만들고나니 금방 나머지 두개도 처리했다.

 

저녁을 먹고 중간에 무슨 무슨 회사에서 유지보수 문의가 들어왔는데

여섯개의 회사를 하루에 돌아가면서 답변하고 처리하자니 머리가 점점 아파왔다.

 

세개 인터페이스를 모두 마무리하고 postman 발송으로 테스트를 완료한 다음

인터페이스 로그 정상 생성까지 확인하고 페이지 레이아웃 정리로 넘어갔다.

 

해당 부분들은 생각보다 빠르고 깔끔하게 마무리할 수 있었지만

일부 부분들이 많이 비어있었기 때문에 답변이 오면 추가 수정작업을 한 다음

확정이 거의 된 상태에서 테스트클래스를 작성할 예정이다.

 

오후쯤 처리했던 회사에서 또 유지보수 문의가 3개나 날아왔는데

2개는 해당사항이 있어 flow 관련 처리를 다시 진행했고

하나는 이쪽에서 flow 내부 이메일 발송 부분에서 related ID를 넣지 않아서

이메일 발송 히스토리가 쌓이고 있지 않은 부분이라 빠르게 수정했다.

 

8시 40분이 넘어서 퇴근했는데

회사 여러개를 정신없이 바꿔가면서 하는 문제만 아니면 체력적으로는 큰 문제는 없는 것 같다.

 

 

(1).백준 30032번 알파벳 뒤집기는 주어진 방향에 맞춰서 알파벳들을 뒤집어야 하는 문제였다.

 

방향 지시는 1 또는 2로 고정이고 글자 또한 d, b, q, p 4가지였기 때문에

for문 등을 통해 만드는 것이 아니라 간단하게 직접 map에 담아서 처리했다.

 

for문으로 각자 글자를 순회해서 map에 담긴 글자로 변경한 다음 result에 담아 출력하는 방식으로 해결했다.

const input = `3 2
bdb
dbd
bdb`.split('\n')
const [n, d] = input.shift().split(' ').map(Number)
const result = []
const checker = {d1 : 'q', d2 : 'b', b1 : 'p', b2 : 'd', q1 : 'd', q2 : 'p', p1: 'b', p2 : 'q'}

for(let i = 0 ; i < n ; i++){
    let str = ''
    for(let j = 0 ; j < n ; j++){
        str += checker[input[i][j] + d]
    }
    result.push(str)
}

console.log(result.join('\n'))

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

[개발일지] - 314  (0) 2024.05.09
[개발일지] - 313  (0) 2024.05.08
[개발일지] - 311(어린이날 대체휴일)  (0) 2024.05.06
[개발일지] - 310(주말)  (0) 2024.05.05
[개발일지] - 309(주말)  (0) 2024.05.04

(1).백준 29029번 Фигурки는 4가지 방향으로 흩어져 있는 인형들의 방향을 일치시키려고 할 때

제일 빠르게 정렬 가능한 시간을 묻는 문제였다.

 

특이점이라면 방향을 한 방위씩 움직일때마다 1초가 아니라 어떤 방향으로 바꾸던 1초였기 때문에

제일 많이 모여있는 방향을 제외한 인형들을 움직이면 되기 때문에 map에 담아서 카운팅해준 다음

Math.max로 제일 많은 수치를 구해줬다.

 

map에 담긴 값을 꺼내서 사용할 때는 분명 values를 썼던 것 같은데

new Map으로 생성한게 아니라 그냥 객체에 담아버린 경우에는 map 취급을 안해줬고

object.values를 통해 value List를 꺼내거나 object.keys를 통해 key List를 꺼낼 수 있었다.

const input = `7
NSNEWNN`.split('\n')[1]

const countMap = {}

for(let i = 0 ; i < input.length ; i++){
    if(countMap[input[i]] != null){
        countMap[input[i]]++
    }
    else{
        countMap[input[i]] = 1
    }
}

console.log(input.length - Math.max(...Object.values(countMap)))

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

[개발일지] - 313  (0) 2024.05.08
[개발일지] - 312  (0) 2024.05.07
[개발일지] - 310(주말)  (0) 2024.05.05
[개발일지] - 309(주말)  (0) 2024.05.04
[개발일지] - 308(연차)  (0) 2024.05.03

(1).백준 26863번 Absolutely Flat는 평평한 탁자를 만들 수 있는지 묻는 문제였는데

왜 탁자 다리를 자를 생각은 안하고 보조다리를 붙일것만 준비했는지는 모르겠지만

조건상 보조다리는 하나밖에 없고 붙이기만 가능한 구조였기 때문에 

일치하는 사이즈가 4개 또는 3개이면서 보조다리와 나머지 다리의 합이 3개짜리와 길이가 같아야 했다.

 

일단 순회하며 map에 담아주고 최대 중복개수를 찾아준 다음

해당 길이를 저장해서 다른 길이 비교에 사용하고 다를 경우 해당 길이와 보조다리의 길이의 합이

저장된 3개의 다리 숫자와 같은 경우 1 출력 아닌 경우 0출력을 하는 방식으로 해결했다.

const input = `10
10
10
10
5`.split('\n').map(Number)

const addLength = input.pop()
const check = {}
let maxCount = 0
let maxLength = 0

for(let i = 0 ; i < input.length ; i++){
    if(check[input[i]]){
        check[input[i]]++
    }
    else{
        check[input[i]] = 1
    }
}

for(let key in check){
    maxCount = Math.max(check[key])
    maxLength = key
}

const newArr = new Array(...(new Set(input))).sort((a,b) => a-b)

if(maxCount == 4){
    console.log(1)
}
else if(maxCount == 3 && newArr[1] == maxLength && newArr[0] + addLength == newArr[1]){
    console.log(1)
}
else{
    console.log(0)
}

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

[개발일지] - 312  (0) 2024.05.07
[개발일지] - 311(어린이날 대체휴일)  (0) 2024.05.06
[개발일지] - 309(주말)  (0) 2024.05.04
[개발일지] - 308(연차)  (0) 2024.05.03
[개발일지] - 307(연차)  (1) 2024.05.02

+ Recent posts