본문 바로가기

맨땅에 헤딩하기/개발공부

(8)
[삽질일기] AppCenter 가 iOS 빌드만 실패할 때 Netlify build 로 속썩은 바로 다음날 본격적으로 내업무좀 해보려는데 이번엔 AppCenter가 또 문제다. 나에게 AppCenter는 미지의 세계라 손대고싶지 않았으나 하필이면 내가 배포하는 날 이 사단이 나니 어쩌겠는가. 하다하다 안돼 사수에게 도움을 청했으나 자기도 모르겠다고 한다(바빠서 뻥치는거 다티남). 꾸역꾸역 로그를 읽어보니 처음엔 hermes-engine 버전이 안맞는다고 해서 hermes가 뭘 하나 보니 얜 그냥 앱 빌드 할 때 스피드에 관여하는 애란다. 로그를 더 위로 거슬러올라가보니 이번엔 cocoapods이 문제란다. pod은 인스톨만 해봤지 이걸로 뭘 해본적이 없어서 전혀 감도 안왔다. 에러메세지 긁어서 구글링부터 시작했다. 비슷한 사례들이 많았는데 내 프로젝트에서 쓰는 ..
[삽질일기] netlify에서 빌드한 앱이 internal server error를 띄울 때 어느날 웹앱을 배포한지 한시간 남짓 지나 에러를 발견해, 이전버전으로 급히 롤백하게 되었다. 모든 테스트를 통과한 버전이었는데 하필이면 Stakeholder가 업데이트 된 페이지를 구경하다 오류가 나버렸다. 외부에서 보고받은 오류여서 (코딱지만한)회사 인력의 절반이 이 문제를 해결하는데 투입되었다. 배포버전에 내 업무가 차지하는 비중은 크지 않았으나 배포한 당사자가 나여서 괜히 더 쫄렸다. 에러내용인 즉슨 해당페이지에서 새로고침을 하면 흰 화면에 Internal server error 라고 뜨는것이었다. 이건 프론트에서 관장할 내용이 아닐 뿐더러 여기서 Internal server라면 우리서버가 아니라 앱을 빌드 한 netlify 일건데 그렇다면 디버깅은 점점 미궁으로 빠지게 된다. 결국 이전 버전부터 ..
[ESLint disable] 검열을 거두어주십쇼 회사 프로젝트에 //eslint-disable 로 시작하는 코멘트가 자주보인다. 특히 useEffect dependency에 거의 매번 쓰이는데 이 코멘트를 지우고 프로젝트를 돌려봐도 별 문제가 없다. 그런데도 매번 동료의 코드리뷰에 올라와있는게 의아해 이게 꼭 필요하냐고 물어보면 아니라면서 지운다. 내가 입사하기 전에 쓰였던 규칙 같은거 였나본데 코드를 그대로 긁어쓰는 경우에 이걸 미처 못지운 것 같다. 반면 사수는 지금도 새로쓰는 코드에 종종 이 코멘트를 더한다. 올 한 해 동안 시도때도 없이 마주친 eslint-disable이 무엇을 의미하는지 진작 알아봤어야 했는데 너무 귀찮았던 나머지(+크리티컬하지 않아서) 대충 감으로 때려맞추고 지나갔다(이러면 안됌 진짜 안됌). 그래놓고 왜 이제와서 포스팅하..
[개발일기] Static HTML과 Implicit ARIA role 몇 주 전, 작업중인 페이지에 드롭박스를 추가했는데 유닛테스트를 돌릴 때 마다 경고메세지가 떴다. 대강 리액트 컴포넌트가 랜더링 될 때 state를 업데이트 할 수 없을 수도 있다는 소리였는데 차라리 에러메세지 였으면 덜 애매했을 것이 경고메세지는 프로젝트는 멀쩡히 돌아가는데 잠재적인 문제를 품고있다는 의미여서 그냥 지나칠 수 없는 골치아픈 상황에 직면해 버렸다. 처음엔 내 코드에 문제가 있는 줄 알고 이리저리 디버깅 해봤지만 결론은 회사에서 쓰고있는 UI 라이브러리와 리액트 버전이 안맞아 일어나는 충돌이었다. UI 라이브러리 개발자들은 라이브러리를 최신버전으로 업데이트 하면 더이상 존재하지 않는 이슈라고 했지만 이거 하나 고치자고 라이브러리를 업데이트 했다가는 프로젝트 전체를 뒤집어 엎어야 해 파장이 ..
[git] 문제의 시초를 잡는 조력자 git bisect 어느날 사수가 링크 하나를 보내왔다. 현생 살이가 바쁘다는 핑계로 따로 시간을 내어 공부하지 않는 나같은 게으름뱅이에게는 이런 정보 하나하나가 꿀이므로 바로 흡수에 들어간다. 사수 본인이 버그픽스를 위해 깃 히스토리를 거슬러 올라갈 때 요긴하게 사용한다며 칭찬에 마지않았던 그 기술 git bisect. 잊지 않기위해 여기에 기록 해본다. git bisect, 언제 필요할까? 내 상황을 예로 들어보자면, 우리회사는 네 개의 프로젝트를 팀원들이 돌아가며 작업하는데(딱히 룰은 없고 하고싶은거 골라잡으면 됨) 어느날 오랜만에 넘겨받은 프로젝트에서 오류가 발견될 때가 있다. 왜 하필 내가 손을 대야하는 순간에 버그가 출현하는걸까? 이유야 어찌되었건 원인을 찾아내야 하는 사람은 나다. 커밋이 서너개 정도 되면 해쉬..
[JavaScript] generator 와 yield 정리 보통의 함수는 하나의 값만 리턴하거나 아무것도 리턴하지 않지만 제네레이터는 필요에 따라 다수의 값을 리턴(yield)한다. 반복문이나 데이터스트림을 만드는데 용이함. 제네레이터 함수를 만들기 위해서는 특별한 문법을 써줘야 하는데 바로 function 옆에 * 기호를 붙어 function* 이라고 써주는 것이다. function* generateSequence(){ yield 1; yield 2; return 3; } 요렇게 생겼음. 제네레이터 함수는 보통의 함수와는 다르게 작동한다. 제네레이터 함수가 호출되면 코드를 바로 실행시키는 대신 특별한 오브젝트를 반환하는데 이를 generator object 라고 부른다. function* generateSequence(){ yield 1; yield 2; re..
[git] Rebase 정리 깃을 이용한 프로젝트를 진행할 때 이미 구현되어진 기능들을 보호하기 위해 내 브랜치를 따로 파서 작업을 한다. 작업마다 브랜치를 하나씩 파다 보면 마스터를 중심으로 서로 다른 업데이트들을 만들어내는데 나중에 작업이 끝나면 얘네들을 안전하게 합쳐주는게 관건이다. 깃의 특성상 어설프게 합쳤다가는 누군가의 작업물이 날아가던가 마스터가 돌아올 수 없는 강을 건너버리는 수가 있다. 깃에서 브랜치들을 합치는 방법들은 크게 Merge 와 Rebase 로 나뉜다. 처음엔 되고말고 구글링해서 Merge로 합쳐버렸는데 그게 딱히 좋은 방법이 아니라고 해서 Rebase를 따로 공부해 보았다. Rebase는 내가 작업중인 브랜치에 다른 브랜치의 최신 커밋내용을 끌어오고 싶을 때 새로운 커밋을 만들어 이 두개의 브랜치를 합쳐준..
[TypeScript 타입스크립트 ] Utility Type 정리 - 1 타입스크립트는 내가 정의한 타입을 필요에 따라 부분만 혹은 전부 가져다 쓰는 등 다양한 방법으로 변형시킬 수 있게 한다. Partial 얘는 Type에 지정한 내용을 전부 가져다 쓸 수 있는데 옵셔널이다. 옵셔널로 쓸 수 있다는 말은 타입을 지정은 해주되 일부분의 데이터만 리턴되어도 상관이 없다는 뜻이다. interface Todo { title: string; description: string; } function updateTodo(todo: Todo, fieldsToUpdate: Partial) { return { ...todo, ...fieldsToUpdate }; } const todo1 = { title: "organize desk", description: "clear clutter", }..