Java 에서 비동기 프로그래밍은 어떻게 이용하세요?
근 몇 년 간 게임 쪽을 많이 하다보니, 비동기 프로그래밍이나 node.js 같은 주제를 접하곤 합니다. vert.x 가 혹은 netty + RxJava 등의 기술로도 node.js 를 대체하기에 충분하다고 역설도 하고 그러지만...여전히 여러 사람의 고정관념을 깨긴 쉽지 않습니다.
아직도 async/await 등의 주제로 검색을 해보면...많은 글에서 Java 는 9 에서조차 비동기 프로그래밍에 대한 지원을 생각하지 않는다느니, 구시대적 개발방법론에 익숙한 개발자들이 절자지향적 개발을 넘어서지 못한다느니...하는 글들을 볼 수 있습니다. 구글 검색을 해보면 임백준 님 책에도 비슷한 내용이 있는 것 같더라구요.
제가 최근에 만든 게임의 경우, 4명의 유닛(캐릭터)이 전투에 참여하고, 승리할 경우 4명의 유닛 모두에게 경험치를 더해주고, 경험치가 다 차면 다음 레벨로 올려주고...뭐 그런 동시성 작업이 필요합니다. 이것 외에도 몇 가지 더 있지만, 당장 딱 봐도 비동기 프로그래밍을 쓰면 유리하겠다...하는 부분이 보입니다.
저의 경우 RxJava 와 defer 을 이용한 구현을 하였습니다. 여기 내용을 검색해보시면, RxJava 로 처음 시도하면서 좌충우돌하던 저의 모습을 보실 수 있을 겁니다. @Async 도 존재하고 CompletableFuture 도 존재하며, 직접 Thread 을 써서 작업한 뒤 join() 으로 await 을 할 수도 있습니다.
없는게 아닌데...왜 자꾸 저런 말이 나오는지는 참 궁금합니다. HTTP 방식이라면 사용자의 요청을 비동기로 받는 node.js 처럼 netty 로 구현해서 경량 컨테이너로 비동기로 받던지, vert.x 로(netty 로 구현된) 비동기로 받고, DB 요청 등도 vert.x 의 기능을 이용해 비동기로 cluster 요청까지 할 수 있습니다. 아니면 netty 기반의 undertow 을 이용하도록 spring boot 설정을 조금 바꿔주고, 내부에는 CompletableFuture 로 구현하고 allof() 로 await 처리 해줘도 됩니다(물론 Java 8 입니다).
여러분들은 어떻게 구현하시나요? 그리고 정말 Java 에는 이런게 없다고 생각하신 건가요?
(물론 질문글은 아닙니다)