2023년 회사에서 코틀린을 썼지만, 쓰자마자 코루틴을 바로 사용하지는 않았었다
2024년쯤 코루틴을 공부하고 백엔드 코드에 조금씩 사용하는 영역을 넓혀갔다
간단하게 코루틴 기본 개념과 활용까지 블로깅을 조금씩 해보려고 한다
로니콜먼도 아마 코루틴을 사용해본 경험이 있는 것 같다. 왜냐하면 "Light Weight Baby!!"라고 외치며 헬스를 했으니 말이다
코루틴(Coroutine)이란?
코루틴이란 Light-Weight Thread(경랑스레드)라고도 불리며, 스레드와는 독립적으로 실행되는 비동기 작업의 단위이다
내부적으로는 Continuation이라는 객체에 현재 작업(Job)의 진행 상태를 저장하고, suspend와 resume을 통해 작업을 일시 중단하거나 재개할 수 있다
이 특성 때문에 코루틴은 스레드 간에도 작업을 안전하게 이동할 수 있다
이러한 동작 방식은 CPS(Continuation Passing Style)와 유사한데, 작업의 상태를 Continuation 객체로 전달하고 이를 통해 작업의 재개와 중단을 구현하는 것이다
장점
- 기존의 콜백 기반 비동기 처리보다 코드가 간결하고 가독성이 좋음
- 스레드풀을 효율적으로 활용해 시스템 리소스를 절약 가능
- 멀티스레드 환경에서도 안전하게 동작하며, 비동기 코드의 테스트가 용이
디버깅하는 방법
세밀한 제어가 필요할때에는 1번 방식을 사용하면 되고 단순히 어떤 디스패처(스레드)에서 어떤 코루틴이 실행되는지 구분하면서 보려면 2번 방법을 사용하면 된다
1. Debug Mode with break point
- IntelliJ IDEA의 디버그 모드를 사용
- 코루틴 전용 디버거를 통해 suspend 지점과 실행 흐름을 추적 가능
- 각 코루틴의 상태와 콜스택을 자세히 확인 가능
- Coroutines 탭을 통해 현재 실행 중인 모든 코루틴의 상태를 시각적으로 확인
2. Print coroutine with VM option
- 실행 시 VM 옵션에 다음을 추가: -Dkotlinx.coroutines.debug
- 코루틴이 실행되는 스레드 정보가 로그에 포함됨
1, 2번 예시를 코드와 함께 알아보자
- 예제 코드
- 예제 출력
현재는 쓰레드 이름만 나오는 것을 볼 수 있다
- 1번방법
코루틴을 디버깅하려면 Layout을 설정해줘야 한다
기본값으로는 Frames, Variables, Console만 체크되어 있다
추가로 Coroutines(코루틴)을 체크하고, 추가로 메모리나 스레드, 오버헤드 등도 보고 싶으면 다른것도 체크해도 좋다
우측에 Jobs Dropdown 메뉴가 생긴 것을 볼 수 있다
클릭하면 아래처럼 코루틴이 나온다
현재 RUNNING중인 코루틴은 1번인 것을 알 수 있다
이 방법은 코루틴 내부를 좀 더 자세히 볼 수 있다는 장점이 있지만, 디버그 모드에 익숙치 않거나 단순히 코루틴 번호만 출력해보고 싶다면 아래 2번 방법을 쓰면 된다
- 2번방법
내부적으로 같은 메뉴로 들어갈 수 있는 2가지 방법이 있다
2-1. main을 실행하는 play 버튼을 클릭하고 Modify Run Configuration... 클릭
2-2. 우측 상단의 Run/Debug 버튼 왼쪽의 파일모양 아이콘 클릭 후 Edit Configuration... 클릭
둘 다 모양은 다르지만 비슷한 모양의 설정창이 나온다
다만 2-1번은 현재 실행되는 파일의 환경설정하는 화면만을 볼 수 있고, 2-2번은 Docker, Springboot 등 다양한 환경설정하는 화면을 볼 수 있다는 차이점이 있다
나는 대체로 2-2번을 사용하는 편이다
그럼, 이제 두번째 VM Options: 부분에 -Dkotlinx.coroutines.debug를 추가하고 Apply 또는 OK 버튼을 눌러서 나오자
이번에는 Debug모드가 아닌 Run을 클릭해서 실행해보자
마지막으로, 새로운 코틀린 파일을 만들어서 코루틴 정보를 출력하려고 해보자
아니 뭐야..!? 기껏 설정해놓은 VM 옵션이 날라갔나..?
들어가보니 없다...
그럼 앞으로 .kt 파일을 만들때마다 한땀한땀 VM Options를 추가해줘야 하는걸까?
NoNo~~ 방법이 다 있G
현재 파일 말고, Dropdown 메뉴의 최상위 Kotlin을 선택 후 Edit configuration templates...를 클릭하자
비어있는 VM options에 아까 그 옵션 -Dkotlinx.coroutines.debug을 추가하고 Apply, OK를 클릭하자
그리고 새로운 코틀린 파일을 만들어서 똑같은 코드를 실행해봤다
결국 맨 마지막 TIP을 알려주려고 이렇게 Stack을 쌓은거긴한데...
강의를 듣거나 책을 보거나 혼자 공부하거나 할때 코틀린 파일 하나하나 계속 VM Option 추가하지 말고, 최상위 Template의 configuration에 추가하면 앞으로 똑같은 파일을 계속 만들어도 적용이 된다
.java, .js등 다른 실행환경도 이와 비슷하게 만들 수 있다
- 추가예시
코틀린(.kt) 프로그램이 실행될(main) 때 인자값(args)으로 저런 값들을 넘겨줬다
"boki is handsome and cute"(나는 존잘레스다)ㅋ
새로운 패키지를 만들어서 새로운 코틀린 파일을 만들고 코드를 작성했다
이번에는 단순히 main이 아닌 maina 키워드를 통해 args를 받는 메인메서드를 만들엇다
앞으로 만드는 모든 코틀린 파일은 Kotlin 최상위 Template의 환경설정들을 상속받아서 실행된다
또 다른 예시로 Run되기 전에 Dokerfile을 먼저 실행되게 한다던지, 종료 직후 Shell Script를 실행되게 한다던지 그런 부분도 추가할 수 있다
개발하다가 귀찮아져서 "이런게 없을까..?" 생각이 들 때 직접 찾아보면 웬만한건 다 있다ㅎㅎ
게으른 개발자가 IntelliJ를 조금 더 잘 알아서 자동화를 활용해 디버깅을 더 편리하게 할 수 있게 됐다!
'Program Language > Kotlin' 카테고리의 다른 글
Kotlin에서 기존 객체를 다른 객체로 변환하는 다양한 방법 (0) | 2024.11.27 |
---|
댓글