인프런 커뮤니티 질문&답변

보키님의 프로필 이미지
보키

작성한 질문수

2시간으로 끝내는 코루틴

5강. 코루틴의 예외 처리와 Job의 상태 변화

간단 질문.. join() vs delay()

해결된 질문

작성

·

45

0

예제를 실행하면서 job이 종료되기까지 join()으로 기다리는 방법이 있고, 스코프를 다른곳으로 보내서 메인스레드가 더 빨리 종료되게 하지 않기 위해 자식스코프 또는 main스레드 내부의 Root 코루틴스코프의 실행시간보다 delay를 길게 주는 방법이 있는것같은데요

아래 1번, 2번 방법 중에 어떤 차이가 있고, 코루틴을 현업에서 쓸 때는 어떤 방법으로 보통 사용하게되나요?

그리고 강의를 아직 다 보지는 않았는데.. RxJava, WebFlux, Virutal Thread, Coroutine 등을 어떤 영역에서 활용하는지 궁금합니다

Network, File I/O, DB CRUD, External API call, etc...

그리고 음.. 2022년도쯤에는 비동기트랜잭션이 하이버네이트쪽에서 잘 지원 안해줘서 r2dbc를 사용하다가 취소한 곳이 있다고도 얼핏 들은것같은데 현재는 어떤지 위에 활용처 질문과 함께 알려주시면 감사하겠습니다!

fun test(): Unit = runBlocking {
    val job1 = CoroutineScope(Dispatchers.Default).launch {
        delay(1_000L)
        printWithThread { "Job 1" }
    }

    val job2 = CoroutineScope(Dispatchers.Default).launch {
        delay(1_000L)
        printWithThread { "Job 2" }
    }

    // 1번 방법
    job1.join()
    job2.join()

    // 2번 방법
    delay(2_000L)
}

답변 2

1

최태현님의 프로필 이미지
최태현
지식공유자

안녕하세요 보키님! 🙂 질문 주셔서 감사합니다.

아래 1번, 2번 방법 중에 어떤 차이가 있고, 코루틴을 현업에서 쓸 때는 어떤 방법으로 보통 사용하게되나요?

오...! AI 인턴의 사용이 매우 정확하군요

- join()을 사용하는 것이 명확하고 안정적입니다. 원하는 코루틴이 완료될 때까지 기다린다는 의미를 명확히 전달하기 때문입니다.
- delay()는 명시적인 요구사항에 따라 T를 기다리고 싶을 때 사용되지만, 보통 정확한 완료를 보장하지 않기 때문에 join()을 대체하는 용도로 사용되지는 않습니다.

delay() 는 임의의 시간을 멈추는 것이기 때문에 join() 을 대체하는 용도로는 사용되지 않습니다.

 

 

그리고 강의를 아직 다 보지는 않았는데.. RxJava, WebFlux, Virutal Thread, Coroutine 등을 어떤 영역에서 활용하는지 궁금합니다

Network, File I/O, DB CRUD, External API call, etc...

본 강의는 코루틴 강의이기 때문에 RxJava, Webflux, 가상 스레드 등에 대해서는 설명하고 있지 않습니다. 그렇지만 여기서 간단히 설명드리면 RxJava, Coroutine은 non-blocking 작업을 처리하기 위한 코드 스타일이고요~ WebFlux는 non-blocking을 활용할 수 있도록 만들어진 framework, Virtual Thred는 blocking I/O를 non-blocking 하게 처리할 수 있도록 해주는 기법 입니다.

결국 넷 모두 non-blocking I/O를 핸들링 하기 위한 기술이기에 I/O가 발생하는 곳이라면 어디든 적용 가능합니다. 🙂

그리고 음.. 2022년도쯤에는 비동기트랜잭션이 하이버네이트쪽에서 잘 지원 안해줘서 r2dbc를 사용하다가 취소한 곳이 있다고도 얼핏 들은것같은데 현재는 어떤지 위에 활용처 질문과 함께 알려주시면 감사하겠습니다!

우선 Hibernate 과 R2dbc는 서로 약간의 대체제 관계입니다. Hibernate에서 non-blocking이 잘 지원되지 않기 때문에 R2dbc를 사용해야 하는 것이고, 지금은 Hibernate도 non-blocking에 대한 지원이 확대 되었다고는 하나 여전히 non-blocking 영역에서는 R2dbc가 더 많이 사용되는 편입니다.

답변이 도움이 되었으면 좋겠습니다. 감사합니다. 🙇

보키님의 프로필 이미지
보키
질문자

감사합니다 태현님! 우빈님의 추천으로 태현님의 코틀린 강의들을 보고 있는데..후후 매우 좋네요

상세한 답변 해주셔서 다시 한번 감사합니다 :)

0

안녕하세요, 인프런 AI 인턴입니다. 보키님.

여러 질문을 주셨는데요, 각 부분에 대해 답변 드리겠습니다.

1. join() vs delay()

두 가지 방법 모두 코루틴의 실행을 기다리는데 사용되지만, 중요한 차이점이 있습니다.

  1. join(): join()은 특정 코루틴의 완료를 기다리는 데 사용됩니다. 즉, job1.join()job1이 완료될 때까지 현재 스레드를 블록하는 명령입니다. 주로 코드를 구조화하고 동기화를 명확하게 하기 위해 사용됩니다.

  2. delay(): delay(time)는 시간을 기다리는 동안 스레드를 블록하지 않고 코루틴을 일시 중단하는 데 사용됩니다. 이 방법은 코루틴이 실제로 완료되었는지 여부와 관계없이 단순히 지연하는 시간 기반의 접근 방식입니다.

현업에서의 사용 추천:
- join()을 사용하는 것이 명확하고 안정적입니다. 원하는 코루틴이 완료될 때까지 기다린다는 의미를 명확히 전달하기 때문입니다.
- delay()는 명시적인 요구사항에 따라 T를 기다리고 싶을 때 사용되지만, 보통 정확한 완료를 보장하지 않기 때문에 join()을 대체하는 용도로 사용되지는 않습니다.

2. RxJava, WebFlux, Virtual Thread, Coroutine 활용 영역

  • Network, File I/O, DB CRUD, External API call: 전부 비동기처리가 가능하고, 각 기술의 선택은 코드의 가독성, 프레임워크의 지원 정도, 팀의 익숙함 등에 따라 달라질 수 있습니다.
    • Coroutine: Kotlin에서 비동기 코드를 작성하고 싶을 때 주로 사용됩니다. 가독성이 좋고, 간단한 비동기 처리를 선호하는 경우에 적합합니다.
    • RxJava: 반응형 프로그래밍을 Kotlin/Java에서 구현할 때 사용됩니다. 스트림 프로세싱과 복잡한 비동기 로직에서 강점이 있습니다.
    • WebFlux: Spring의 리액티브 스택으로, 비동기 논블로킹 웹 애플리케이션 구축에 사용됩니다.
    • Virtual Thread: Java의 Loom 프로젝트의 일부로, 경량 스레드를 지원하여 동시성 로직의 간소화를 목표로 합니다.

3. 비동기 트랜잭션과 현재 동향

비동기 트랜잭션 지원은 하이버네이트와 같은 ORM에서 점진적으로 지원이 확대되고 있습니다. 그러나 특정 비동기 작업에서는 여전히 R2DBC를 사용하는 경우가 많습니다. 이는 JDBC의 동기적 특성 때문에 비동기 모드에서의 제약이 있기 때문인데, 현재는 점차 개선되고 있는 추세입니다.

관련 질문 및 추가 정보

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

보키님의 프로필 이미지
보키

작성한 질문수

질문하기