1. 앱에서 모호한 부분 밝히기
이장의 주요 내용은 다음과 같다.
- 코드 조사 기법
- 자바 앱을 이해하기 위한 코드 조사 기법
개발자는 코드의 작동 방식을 분석하는 다양한 목적으로 디버깅을 수행한다.
예시로는 프레임워크 분석, 문제 찾기등이 있다.
1.1 앱을 더 쉽게 이해하는 방법
현재 디버깅은 문제를 콕 집어 조사하는 것뿐만 아니라, 코드가 어떻게 작동하는지 정확하게 이해하는 행위라고 말할 수 있다.
개발자(특히 초심자)는 디버거 도구를 사용하는 일과 디버깅을 동일시하는 착각을 많이 한다.
디버거는 코드를 더 쉽게 이해할 수 있게 도와주는 도구이지, 디버깅 기법이 이것만 있는 것은 아니다.
책에서는 아래와 같은 코드 조사 기법을 배울 것이다.
- 코드 읽기
- 디버깅
- 로그 분석
- 프로파일링
- 스레드 상태 분석
- 메모리 상태 분석
- 모킹 및 스터빙
1.2 일반적인 코드 조사 시나리오
이제 몇 가지 예시를 들어가면서 예시에 적절한 코드 조사 기법을 알아보자.
예상과 다른 아웃풋의 원인을 밝힌다.
어떤 로직의 아웃풋(결과)이 예상과 다르게 나올 수 있다.
이런 경우에는 어떤 코드 조사 기법을 사용해야할까?
시나리오 1. 단순 케이스
- DB에 레코드를 삽입하는 앱이 있다고 가정
- 예상한 레코드보다 더 적은 레코드가 DB에 들어감
- 디버거 도구를 사용해 코드 실행을 따라가보는 것이 제일 간단한 조사 기법
- 브레이크 포인트를 추가하고, 코드를 따라가며 변숫값이 변하는 모습을 추적
시나리오 2. 어디서부터 디버깅을 시작해야할까?
- 앱의 코드가 수천 라인인 경우 어느 부분을 디버깅해야 할지도 모를 수 있음
- 이런 경우에는 프로파일러로 브레이크 포인트를 추가할 만한 코드 라인의 스코프를 좁혀가는 것이 현명한 방법
- 프로파일러란 앱이 실행되는 동안 어떤 코드가 실행되는지 식별하는 도구
시나리오 3. 멀티스레드 앱
- 멀티스레드 아키텍처를 기반으로 . 한로직을 처리할 때는 디버거 사용이 까다로움
- 이러한 특성을 하이젠버그 실행, 하이젠버그라고 한다.
- 프로파일러가 좋을 수 있고, 앱에서 로깅을 하거나, 스레드 수를 1개로 줄이는 방식이 있다.
시나리오 4. 주어진 서비스에 잘못된 호출 보내기
- 외부 시스템과 올바르게 통신하지 못하는 시나리오도 있다.
- 이것은 잘못된 아웃풋의 일례로, 먼저 디버거를 사용해 외부 시스템에 어떻게 요청을 하는지 확인해야 한다.
- 코드가 너무 길어 앱의 어느 코드가 전송을 하는지 모르면 프로파일러를 사용해서 찾을 수 있다.
- 앱이 요청을 주고 받는 위치를 특정하기 곤란한 복자한 경우라면 다른 앱을 스텁으로 바꿔버리는 것이다.
- 스텁은 문제를 식별하기 위한 방향으로 제어할 수 있는 가짜 앱이다.
- 예를 들어 스텁으로 요청을 차단시켜 앱이 응답을 무한 대기하도록 만들면 코드의 어느 부분이 요청을 보냈는지 알 수 있다.
- 이후에 프로파일러로 어느 코드가 스텁 때문에 막혀 있는지 찾아보면 된다.
특정 기술을 습득한다.
코드 분석 조사 기법의 또 다른 용도는 특정 기술의 작동 원리를 배우는 것이다.
어떤 기술은 너무 어려워 책이나 스펙을 읽는 것만으로 힘드므로, 직접 파헤쳐보면서 이해하는 것이 중요하다.
항상 프레임워크의 코드를 더 자세히 살펴보고 디버깅하려는 노력을 기울여야 한다.
이 과정을 반복하면 더 훌륭한 개발자가 될 수 있다.
속도 저하 이유를 알아낸다.
- 성능 문제의 원인을 파악하기 위해 다양한 디버깅 기법의 올바른 사용법을 배울 필요가 있다.
- 보통 성능 문제는 앱의 응답 속도와 관련이 있다.
- 책의 사례에서는 좀비 스레드로 인해 겪은 성능 문제를 언급하며, 좀비 스레드 파악은 무척 어렵다고 말한다.
- 많은 경우 DB I/O, Network I/O로 인해 속도 저하를 경험한다.
- I/O 호출에 집중해도 문제 영역의 스코프를 줄이는데 도움이 되지만, 정확한 위치를 파악할 수 있는 도구도 필요하다.
앱 크래시가 발생하는 이유를 이해한다.
- 보통 앱 크래시는 사실상 거의 재현이 불가능하다고 한다.
- 크게 두가지 경우가 있는데 앱이 멈추거나 실행하지만 요청에 응답하지 않는다.
- 앱이 멈춘 것은 복구 불가능한 에러이며, 대부분 메모리 에러로 인해 발생한다. (OutOfMemory, OOM 에러)
- 힙 메모리 문제를 조사하려면 특정 시점에 힙 메모리에 어떤 데이터가 포함되어 있는지 스냅숏에 해당하는 힙 덤프를 사용한다.
- 힙 덤프는 메모리 지도 같은 것으로 값은 물론 인스턴스 간의 관계 등 많은 세부 정보를 나타낸다.
- 앱은 계속 실행되고 있지만 요청을 해도 응답이 없는 경우, 스레드 덤프는 안에서 무슨 일이 일어나고 있는지 분석하는 최상의 도구다.
이제 위에서 언급한 조사 기법에 대해 알아보고 실습해보자.
이상으로 포스팅을 마칩니다.
참고 자료
https://product.kyobobook.co.kr/detail/S000213029114
댓글