일정 정리를 하던 도중

오늘도 두번째 프로젝트 관련 질문을 받아서 먼저 답변했다.

 

기술 및 사례 공유가 있어서 확인했는데

세일즈포스 기본 개체들에 대한 정리가 되어있어서

한번에 필수 개체들에 대해 빠르게 알 수 있을 것 같았다.

 

자동화가 잘 돌아갔는지 확인했지만

오늘도 돌아가기만 하고 배치 실행은 되지 않았는데

원인 파악을 위해 데이터를 자세히 보니

해당 정보를 가져오는 시간보다 더 빨리 배치가 돌아가는 것으로 확인되어

관련 정보를 가져오는 시간보다 더 늦은 시간에 돌아가도록 스케줄들을 수정했다.

 

스케줄 미적용 사유 및 스케줄 변경 내용에 대해 정리하고

그사이에 추가된 데이터를 배치 처리한 다음

해당 내용을 메일로 전달했다.

 

오늘도 첫번째 프로젝트 운영 배포를 위해 테스트클래스를 만드는데

내가 작성하지 않은 인터페이스들도 테스트클래스가 없는게 많이 보였는데

그 중에 통합으로 인해 사용되지 않는 인터페이스들도 있어서 확인을 위해

예전에 작성된 인터페이스 정의서를 확인하며 사용할 인터페이스를 구분했다.

 

필수 인터페이스에서도 내가 작성한 인터페이스를 제외하면

모든 인터페이스의 테스트클래스가 없었는데

이 인터페이스들도 잦은 요청으로 변경이 계속되었기 때문에 어쩔 수 없는 부분이긴 했다.

 

빠르게 테스트클래스들을 전부 작성해주고

배포해야 할 클래스들의 리스트와 커버리지 %를 정리한 다음

11시에 진행될 네번쨰 프로젝트 미팅 준비를 하다가 미팅에 참여했다.

 

미팅은 한달도 넘게 전부터 얘기됐던 것과는 좀 달랐는데

기존에 사용하던 하이터치 사용을 할 수도 있고

아니면 REST API를 할수도 있다는 것이었는데

차라리 REST API를 바로 개발하는 편이 더 마음편하고 빠르게 할 수 있을 것 같지만

유지보수 등의 문제로 인해 기존 사용 방식이 더 유리하다는 것 같았다.

 

의외로 다른 문제가 발생했는데

우리가 전달받기만 하는 구조라고 생각했지만

세일즈포스에서 업데이트되는 일부 데이터를 받고 싶어했기 때문에

우리가 REST API를 만드는 것이 아니라

그쪽에서 REST API를 제공하고 우리가 보내고

기존 REST API 생성 부분은 하이터치로 대체될 것 같았다.

 

하지만 여러 문제점이 발생할 수 있다는 가정이 있어서

1~3안까지 준비된 상태로 회의가 마무리됐는데

결국 정의서도 없고 전송 방식에 대해서도 결정되지 않아서 뭔가 아쉽게 끝났다.

 

노트북 반납을 위해 선 정리 및 포맷상태를 재확인하고

기존에 사용하던 노트북을 반납했고

오후에 두번째 프로젝트 관련 회의가 예정되어 있기 때문에

그 전에 빠르게 첫번째 프로젝트의 개체 중 하나를 운영에 반영하고

인터페이스 부분들만 운영에 먼저 배포해두기로 했다.

 

인터페이스 배포를 진행하는데

이번에도 전체 인터페이스 배포에 실패해버려서 하나씩 진행할 수밖에 없었다.

 

각각 진행하니 드디어 에러의 원인을 볼 수 있었는데

RecordType을 Id값으로 넘겨줬기 때문에

org가 달라지면서 해당 Id가 달라져서 문제가 발생한 것이었다.

 

결국 아래와 같이 해당 레코드를 Select해서 Id를 매칭시켜주고 나서야

정상적으로 테스트가 진행되는 것을 확인할 수 있었다.

RecordType rt = [SELECT Id FROM RecordType WHERE Name = 'RecordName’];

 

테스트클래스가 통과한다고 하더라도

운영과 샌드박스의 환경이 달라지기 때문에

Id 등의 변경값의 입력이 필요한 경우

하드코딩이 아닌 Select를 사용해야 한다는 좋은 사실을 다시 한번 알 수 있었다.

 

도중에 실수로 테스트코드를 넣지 않고

배포를 눌러서 진행중인 배포가 생겨버렸는데

해당 배포를 다급하게 취소를 눌렀지만 한동안 먹통이 되어버렸다.

 

원인을 검색해보니 배포 취소는

기존에 진행된 배포를 역추적하며 롤백까지 진행하기 때문에

일반적으로 실패하는 것보다 훨씬 더 오래걸린다는 단점이 있기 때문에

취소를 해야 하는 치명적인 문제가 있지 않은 이상

취소가 아닌 에러 발생을 기다리는 것이 훨씬 빠른 처리가 가능하다.

 

인터페이스 배포를 완료하고

해당하는 전체 클래스들의 커버리지를 다시 정리하고

코파도를 통해 진행하려고 하는데 내가 건드리지 않은 이상한 클래스들이 작동했다.

 

원인은 사람들이 클래스를 마구 수정한 다음

배포를 한 것도 아니고 복구한 것도 아닌 상태로 방치해서

운영과 개발서버의 괴리가 생긴 것이었다.

 

급하게 두번째 프로젝트 진행 회의에 들어갔는데

두번째 프로젝트에서 일정이 급하니 추가 지원을 하라고 하셨는데

일정상 불가능하다고 팀장님이 말씀해주셨는데

오히려 언제까지 그걸 핑계로 안되냐고 하셔서 당황했다.

 

해당 프로젝트 회의 참여자는 6명이었고

코드로 기여가 있는 사람이 4명이었는데

계속 요청하는 사항을 처리하는 동안 방치되어서 아무도 손대지 않길래

이번주까지 끝내겠다고 고객사에 내가 답신하고

월요일에 당일까지 처리해달라는 내용이 생겨서

혼자 9시가 넘을 때까지 하다가 감기기운이 생겨서

점심시간에 약까지 먹었는데

요즘 일찍일찍 퇴근해서 할일 다 하고 그러는줄 알았는데

뭘 한거냐는 느낌으로 말씀하셨는데

굳이 일찍 와서 정시간에 가는 이유도 모르겠고

중간에 떠있는 작업들을 처리하지 않아서 내가 처리하는 것도 굳이 할 필요가 없다는 생각이 들었다.

 

하지만 받아들이는 입장에서는 4주째 해당 프로젝트의 진행이 거의 없는게 맞기도 하기 때문에

이런저런 이야기는 하지 않고 빨리 끝내기로 했다.

 

회의가 끝나고 다시 코파도로 배포를 시도하는데

기이하게 60여개의 오류가 발생했고

나는 관련도 없어보이는 수많은 오류들을 해결해야 했다.

 

중간에 좋은 점도 배울 수 있었는데

SFDC의 Id를 하드코딩으로 작성할 경우

운영서버에서는 레코드 타입 등 타 개체의 타입 Id 등을 사용할 때 문제가 발생하기 때문에

해당 값은 필수적으로 SELECT 또는 생성 방식으로 진행해야 한다는 것을 알 수 있었고

특정 값들에 에러가 발생할 경우

각 조회 필드의 필터를 확인해야 한다는 사실도 배울 수 있었다.

 

각 클래스들의 상호작용과 테스트클래스 작동도 빠른시간에 학습할 수 있었는데

단시간에 백여개의 테스트클래스들을 돌아다니다보니 구조적으로 익숙해진 느낌이다.

 

코파도로 고통받던 도중 팀장님도 배포할일이 생기셔서

팀장님에게 코파도를 알려드렸는데(주소 및 로그인정보)

팀장님이 바로 기존 배포방식은 전체 테스트클래스 작동으로

org에 있는 모든 문제를 다 잡는 방식이라 불가능하고

현재 클래스만 테스트하게 진행해야한다고 알려주셨고

덕분에 22년에 작성된 본적없는 사람의 코드 수정도 멈출 수 있었다.

 

일부 배치를 진행하는데 자꾸 0%가 출력되기 때문에 에러도 확인할 수 없었는데

원인을 알고보니 엔터로 구분을 하는게 아니라 ,로 구분을 해야 하는 방식이었다.

 

충격적이게도 일부 테스트로도 에러가 여럿 발생했는데

가장 큰 원인은 운영서버에는 멋대로 룰이 몇개가 더 존재했다.

 

개발에 적용 후 운영에 반영하는 절차를 거쳐야 하는데

누군가 운영에만 즉석으로 룰을 적용하고 넘어가서 개발당시에는 확인이 되지 않는 문제로

운영서버를 찾아가 룰과 필터를 확인하며 연관 트리거들까지 찾아서 수정 후 배포해야 했다.

 

또한 숫자류의 계산을 진행할 때는

어떤 값을 사용하던 변수로 가져올 경우 null 체크를 진행해야 한다는 것도 배울 수 있었다.

 

CANNOT_INSERT_UPDATE_ACTIVATE_ENTITY가 떠서 혼란스러웠지만

결국 문제들은 null Exception으로 변수들의 null 체크만 다 처리해주니 배포할 수 있었다.

 

배포에 시간이 오래 걸려서 오늘도 결국 9시가 다 되어서 퇴근했는데

월요일도 그렇고 12시간 넘게 회사에 있으니 감기기운이 심해지는 것 같다.

 

 

(1).백준 24768번 Left Beehind는 꿀통을 비교해서 문자열을 출력하는 문제로

간단하게 합이 13인지 아닌지 체크 후 같거나 크거나 작은 조건에 따라 문자를 출력했다.

const input = `17 3
13 14
8 5
44 44
0 0`.split('\n')

const result = []

for(let i = 0 ; i < input.length - 1 ; i++){
    const [x, y] = input[i].split(' ').map(Number)
    if(x + y == 13){
        result.push('Never speak again.')
    }
    else if(x > y){
        result.push('To the convention.')
    }
    else if(x < y){
        result.push('Left beehind.')
    }
    else{
        result.push('Undecided.')
    }
}

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

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

[개발일지] - 148(주말)  (2) 2023.11.25
[개발일지] - 147  (0) 2023.11.24
[개발일지] - 145  (0) 2023.11.22
[개발일지] - 144  (1) 2023.11.21
[개발일지] - 143  (1) 2023.11.20

+ Recent posts