발표 구성 안내
코루틴으로 논블로킹 API를 만들기 전에 먼저 논블로킹이 무엇인지, 코틀린 코루틴이 어떻게 동작하는지를 살펴본 뒤 간단한 REST를 만들어 보겠다고 발표 구성을 안내한다. 20분 세션 한계상 실습에 필요한 핵심 지식만 간단히 전달한다는 점도 미리 양해를 구한다.
블로킹과 논블로킹을 가르는 기준을 설명한다. DB·캐시·외부 API·메시지 브로커처럼 직접 제어할 수 없는 IO 대상을 처리할 때, 스레드 같은 리소스를 요청 시작부터 끝까지 점유하면 블로킹, 점유하지 않으면 논블로킹으로 동작한다는 핵심 차이를 짚는다.
1초 걸리는 API를 10번 호출하는 예시 코드로 두 방식을 비교한다. RestTemplate(블로킹)은 약 10초, WebClient(논블로킹)는 약 1초가 걸린다. 외부 IO 응답이 느리고 동시 호출이 많을수록 효과가 크며, 적은 리소스로 더 많은 요청을 처리해 운영 비용을 낮추는 강점을 설명한다.
코루틴을 코틀린 1.3에 포함된, 비동기·논블로킹을 위한 경량 스레드로 소개한다. 협력을 뜻하는 '코'와 함수를 뜻하는 '루틴'의 합성어로, 메인 루틴과 서브루틴 개념을 설명한다. 일반 서브루틴은 리턴까지 블로킹으로 동작하지만 코루틴은 이와 다르게 동작함을 예고한다.
출근 준비 일정을 그리는 플랜 스케줄 함수로 코루틴 동작을 설명한다. `launch` 코루틴 블록 안에서 `suspend` 함수를 만나면 그 처리 동안 스레드를 점유하지 않고 호출한 곳과 공유한다. 샤워를 하면서 블록 밖 유튜브 보기가 동시에 실행되는 비유로 동시성 프로그래밍을 보여준다.
실습 기능을 안내하고 구현을 시작한다. 논블로킹을 지원하는 r2dbc·리액티브 카프카·WebClient를 써서, 상품 아이디로 DB에서 상품 정보를 조회하고 외부 재고·전시 서버에 상세 정보를 요청하며 조회수 증가용 카프카 메시지를 발행하는 조회 API를 만든다. r2dbc 레포지토리부터 구현한다.
앞서 만든 논블로킹 구현체로 REST API를 정리한다. MVC 컨트롤러가 아니라 웹플럭스의 엔드포인트 방식 라우터 펑션을 코루틴 스코프(`coRouter`)로 작성한다. 상품 조회→재고·전시 정보 취득→카프카 메시지 발행→응답 객체 생성 흐름을 코루틴으로 블로킹 코드처럼 구현하고 실제 호출로 검증한다.
발표 내용을 정리한다. 외부 IO 응답이 느리고 동시 호출이 많을수록 논블로킹이 리소스를 더 효율적으로 쓰며, 코루틴을 이용하면 익숙한 블로킹 코드처럼 논블로킹을 구현할 수 있다는 것이 결론이다. MSA 환경에서 늘어나는 IO 문제를 효율적으로 풀기 위해 코틀린 코루틴을 적극 추천하며 마무리한다.