본문 바로가기
잡담시간

[잡담시간]iOS webView 개발할 때 노가다 썰

by 임간디 2022. 7. 1.

필자는 현재 iOS로 webView를 개발하고 있다.

우리부서는 조금 특이하다.우리 상품인 App개발을 사내 개발부서에서 전적으로 개발하고 있으며

iOS만 사람이 없어서 내가 개발 중이다. (전사적으로 iOS개발자 쌉가뭄이다.)

누구 가르쳐주는 사람 한명 없이... 나홀로 Step by Step으로 개발 중이다 :(

같잖은 하소연은 이쯤에서 각설하고!

 

webView를 개발하면서 노가다한 썰을 풀어보려한다.

우리 App은 Javascript로 개발된 Web(근데 이제 Vue.js를 곁들인...)

web화면을 iOS와 Android에서 보여주는 Hybrid App이다.

Native App vs Hybrid App vs Web App ?
-Native App : 처음부터 끝까지 각 OS(iOS/Android)에 맞게 개발한 App으로 App에서 device의 기능을 마음껏 갖다 쓸 수 있다. 각 OS를 타겟으로 만들었기 때문에 사용성이 셋 중 제일 좋아 보인다.
-Hybrid App : Native App과 Web App의 하모니 view는 web으로 만들고 App은 view를 가져다 보여준다. iOS나 Android나 App단에서 web view를 가져다 보여주는 부분만 구현하면 되기 때문에 유지보수는 조오오오금 더 수월하다. 또한 Hybrid App도 device의 기능을 사용할 수 있어 Native App과 같은 효과를 볼 수 있다. 최근엔 Web view 기술이 많이 올라와서 Native App과 구분하기 어려울 정도라 한다.
(사실 필자도 개발하면서 헷갈렸음;;)
-Web App : 엄밀히 말하면 App이 아닌 web site로 보면 된다. 설치가 필요없고 브라우져를 통해 접근할 수 있다. 다만 device의 기능 사용에 제약이 있다. 그런데 WWDC22에서 이제 iOS에서도 web을 통해 push가 가능하도록 열어줬다는데 이건 추추추추추추후에 확인해봐야겠다.

 

문제는 필자는 web소스를 로컬로 돌려볼 수가 없다.

(CORS 이슈였던가..? Mac 로컬에 web개발환경 구축을 시도해봤는데 수포로 돌아갔다...

그런데 필자가 알기로 이렇게 개발 영역이 나뉘어져있으면 서로의 소스는 신경 안 쓰는게 국룰로 배웠는데 社룰인건가?)

따라서 위 그림처럼 Web에서 어느 시점에 어떤 함수를 호출했고 어떤 값을 받고 있는지 알 수가 없었다.

 

전쟁같았던 QA날 문제가 발생했다.

이거 뭐 로또도 아니고 운이 좋아야 제 기능을 하고 있는게 아닌가...

웹 개발자 분에게 확인해보니 tokenID를 받아야할 게 당치도 않는 "Success"를 받고 있단다.

iOS는 미리 성공할 걸 알고 신나서 저 문자를 보냈던걸까??

 

아무튼 필자는 황급히 iOS쪽 소스를 확인했고 이상이 없었기 때문에

청렴결백의 마음으로 웹 개발자 분에게 책임을 토스했다.

그런데 그 쪽에서도 디펜스를 철저히 하시는게 아닌가...

자강두천을 이행하기엔 필자의 내공이 부족해서 근거를 모으는 방법으로 꼬리를 내렸다.

 

필자가 할 수 있는 방법은 Javascript에서 호출하는 함수에 로그를 남기는 것이다.

거진 모든 호출이 비동기 호출이기 때문에 어디서 꼬여서 callback으로 넘어가는지 찾을 심산이었다.

 

그런데 말이 쉽지 수 많은 함수중에 어떤게 어느 순서로 호출되는지 알 리 없었고

그 때 그 순간만큼은 나비효과를 흠뻑 체감했는 순간이지 않을까 싶다.

Git에서 웹 개발자가 말해준 javascript 소스를 보며 최대한 scope을 줄여봤지만

위 그림 처럼 혹시나 내부적으로 값이 변하는 부분이 있을까봐 중첩된 함수도 모두 로그를 남겨야 했다.

정말 학부 때 C 이중 포인터 디버깅했던 기억이 오버랩되면서 PTSD가 왔던 것 같다.

 

결론적으로는 웹쪽 잘못이 맞았다.

간단히 설명하자면 web단에서 callback ID를 임의로 정해서 iOS로 넘겨주고

iOS는 해당 ID로 callback을 주는 로직인데 독립적이어야할 callback ID가

중복되어 넘어와서 callback이 엇갈렸던 것이다.

참고로 web에서는 callback ID로 비동기 호출하는 그 시점의 시간(마이크로세컨드 단위)을 저장하여 넘겼는데

iOS로 넘어올 때 정확히 마이크로세컨드까지 동일한 시점에 비동기 호출이 됐던 것이었다.

그래서 운 좋으면 제 기능을 했었나보다.

 

이렇게 근거를 긁어모아 웹 개발자분께 전달해드리니...

이상하네요~ 안드는 안 그러던데 iOS는 마이크로세컨드까지 겹치나봐요 ㅎㅎ
시간뒤에 난수로직 넣어서 넘겨드릴게요!

 

필자 : (ㅁ..무...뭐지? 웹스라이팅인가?!)

 

상처를 치료해줄 사람 어디없나... 가만히 놔두다간 끊임없이 덧나...

댓글