본문 바로가기

Android

Jsoup Coroutine Warning: Inappropriate blocking method call - 안드로이드 이슈 12

반응형

안녕하세요~ 오늘은 마주친 찝찝한 에러, Inappropriate blocking method call과 해결법에 대해 글을 써보려고 합니다.

먼저 이전에 사용하던 Volley 대신 Jsoup을 사용하게 된 이유부터 말씀드릴게요. 이번 프로젝트를 진행하면서, Volley의 불편함과 한계를 느꼈습니다. 파싱이 안되는 건 정규 표현식을 이용해 어찌저찌 해결했지만, 307 에러를 해결하지 못하더라고요.

때문에 크롤링과 파싱을 간편하게 Jsoup을 이용해 해결했는데요. 처음 작성한 코드는 다음과 같습니다.

이때 get() 부분에 warning이 발생합니다. warinig의 내용은 Inappropriate blocking method call인데요. 이를 이해하기 위해선 먼저 blocking과 non-blocking에 대해 알아봐야 했습니다.

https://medium.com/@elizarov/blocking-threads-suspending-coroutines-d33e11bf4761

 

Blocking threads, suspending coroutines

On distinction between blocking a thread and suspending a coroutine

medium.com

block은 무엇을 막을까요? thread입니다. 쓰레드를 막는 데에는 두 가지 방법이 있습니다. CPU를 과도하게 소모하는 연산을 실행하거나, 원격 시스템의 응답을 기다리는, blocking IO를 사용하는 방법입니다. 두 경우 모두, 작업을 수행하기 전까지 thread가 다른 동작을 할 수 없으므로 thread가 block 되었다 말합니다. get()은 두 번째 상황에 속합니다.

Thread는 매우 효율적이기 때문에 Thread를 멈추는 건 반드시 피해야 합니다. CPU 집약적인 작업이라면 Thread를 멈추는 건 대체불가능하지만, 어떤 쓰레드를 멈춰야할 지 선택할 수 있습니다. 이때 메인 UI 쓰레드나 제한된 요청을 백그라운드에서 처리하는 쓰레드는 예외로 지정해야 합니다.

IO 작업의 경우에는 non-blocking (aka asynchronous) IO 라이브러리를 사용하는 게 제일 좋은 방법입니다. 아니면 아래와 같이 suspend를 이용할 수 있습니다. 단순히 함수 앞에 suspend 키워드를 붙인다고 non-blocking 함수가 되는 건 아닙니다.

위와 같이 어느 코루틴 스코프에서 실행할지 지정해주어야 합니다.

이상 kotlin에서 jsoup을 사용 시 발생할 수 있는 경고와, 대처 방안에 대해 알아봤습니다.

출처

https://medium.com/@elizarov/blocking-threads-suspending-coroutines-d33e11bf4761

 

Blocking threads, suspending coroutines

On distinction between blocking a thread and suspending a coroutine

medium.com

 

반응형