Channel Talk
안녕하세요! 채널톡 백엔드팀의 라임입니다 🍋
채널톡의 백엔드 팀은 다양한 언어로 서버를 운영하고 있어요. 이 중, 메인이 되는 API서버는 Dropwizard라는 JAVA 기반의 프레임워크를 사용하고 있습니다. 많은 분들께서 Dropwizard를 처음 들어봤을 거에요. 저도 채널팀에서 Dropwizard를 처음 접했고, 제가 잘 사용할 수 있을지 불안했어요. 아무래도 JAVA 혹은 Kotlin을 기반으로 서버를 운영하는 경우에는 Dropwizard보다는 Spring를 사용하는 경우가 흔하니까요.
하지만, 채널팀에서 반 년간 사용해 보니 프레임워크는 그저 하나의 도구일 뿐 개발 방법 자체가 바뀌지 않는다는 사실을 깨달았어요. Spring을 사용하면서 익숙해졌던 DI, AOP와 같은 부분은 그저 하나의 개발 방법일 뿐 Dropwizard에서도 유사하게 사용되고 있더라구요. 하지만 그래도 Dropwizard는 조금 낯설 것 같은데요. 그래서 이번 글을 통하여 Dropwizard에 대하여 알아보고, 채널이 어떻게 사용하고 있는지 이야기해보겠습니다.
Dropwizard(이하 DW)는 빠른 웹 어플리케이션의 개발을 도와주는 웹 프레임워크입니다. 빠르고 유연성 있는 개발을 돕기 위하여 JAVA 기반의 웹 어플리케이션 개발에서 많이 사용되는 Jetty, Jersey, Jackson등을 재사용 가능하도록 내장하고 있습니다. 그리고 다양한 툴들을 자유롭게 사용할 수 있도록 잘 모듈화가 되어있습니다. 이런 모듈화를 기반으로 한 유연성을 통하여 더욱 알맞은 형태로 점진적인 개선도 가능한 프레임워크입니다. 국내에서는 아직 생소하나, 위에서 설명한 장점들로 인하여 해외에서는 AirBnb, Uber등 다양한 기업들이 사용하고 있어요.
채널팀은 이러한 특징을 잘 살려서 사용하기 위하여 많은 고민과 다양한 시도를 했습니다. 그리고 이를 기반으로 현재 채널만의 API 서버를 사용하고 있는데, 이번 글에서 함께 쓰고 있는 툴(Guice, Jersey, Jooq)과 함께 가볍게 소개해보겠습니다.
의존성 주입(Dependency Injection, 이하 DI)은 확장성 있는 개발을 위하여 많이 채용되는 개발론입니다. 그렇기에 많은 백엔드 프레임워크는 효율적인 개발을 위하여 다양한 DI 툴들을 미리 제공합니다. 하지만 DW에는 기본적으로 DI가 내장되지는 않았습니다. 대신 이미 잘 만들어진 다양한 DI 툴들 중 개발하려는 비즈니스 로직에 더 어울리는 툴을 보다 편하게 붙여서 사용할 수 있습니다. 위에서 설명한 유연성의 이점을 받는 부분 중 하나라고 볼 수 있습니다.
저희는 Guice라는 Google에서 만든 DI 툴을 사용하고 있습니다. Guice는 매지컬하지 않게 DI을 편리하고 효율적으로 사용할 수 있는 다양한 기능들을 제공합니다. 대표적인 기능으로는 아래의 기능들을 꼽을 수 있을 것 같습니다.
@Inject annotation을 이용한 DI
Singleton / Factory 등 주입 객체의 관리
PostConstuct와 같은 생명주기 단위 로직 관리
이외에도 다양한 편리한 기능을 제공하고 있으니, Guice에 관심이 생기셨다면 공식 문서를 통하여 어떤 기능을 제공하고 있는지 확인해보세요.
DW는 다양한 모듈로 이루어져있습니다. 이 중 dropwizard-core 모듈은 웹 어플리케이션을 위한 대부분의 툴들이 포함되어 있는데, 위에서 언급했던 Jackson, Jetty, Jersey 등이 해당됩니다. 이 중 Jersey는 DW의 간편한 RESTful API 서버 개발에 큰 도움을 줍니다. Jersey는 JAX-RS 기반의 여러 annotation들을 지원하며, 더욱 생산적인 개발을 위한 다양한 도구 및 추상화를 지원합니다.
또한 요청이 리소스에 도달하기 이전에 다뤄주고 싶을 경우에는 Jersey에서 제공하는 API를 이용하여 HTTP Request Container에 필터 혹은 인터셉터를 잘 구현하여 이용할 수 있습니다. 이런 기능을 통하여 집중하지 않아도 되는 로직들을 격리시킬 수 있으며, 이후 개발자가 격리된 로직이 내부적으로 어떻게 동작하는지 혹은 어떻게 구현되어있는지를 신경쓰지 않고 비즈니스 로직 개발에 집중할 수 있습니다.
이외에도 유효성 검증, 보안 등을 쉽게 구현할 수 있도록 인터페이스를 제공하며, MVC 템플릿, 비동기 API서버 지원 등 서버 구현에 난해하고 시간이 드는 부분들을 편하게 사용할 수 있도록 구현되어 있습니다. Jersey에 대하여 더 알아보고 싶다면 공식 문서를 참조해주세요.
Jooq는 JAVA에서 안전한 sql을 작성할 수 있는 JAVA 데이터베이스 라이브러리입니다. Jooq는 코드 내의 model을 따라가는 것이 아닌, 실제 사용되는 데이터베이스의 테이블과 컬럼을 기반으로 동작합니다. 이를 기반으로 생성된 코드를 사용하여 SQL 쿼리를 작성하는데요. 이로 인하여 개발자는 SQL의 구문 오류 등을 컴파일 타임 내에서 충분히 확인할 수 있게 되며, 책임을 Code Generator에 위임하는 등 작업 시간 및 안정성에 큰 이점을 가지게 됩니다.
이런 특징들을 보고 QueryDSL과 같은 ORM이 떠오르시는 분들이 많으시리라 생각이 드는데요. 비즈니스 로직의 니즈에 따라서 SQL과 ORM을 취사선택하여 사용할 수 있을 것 같아요. 해당 부분이 궁금하신 분들이라면 링크에서 차이점을 한번 확인해보세요!
다른 프레임워크들이 이러한 기능들을 기본적으로 제공하여 신경 쓰지 않고 사용할 수 있게 만들어두었다면, DW는 이런 부분을 기본 제공하지 않는 대신, 비즈니스에 더 어울리는 툴을 잘 붙일 수 있도록 해두었습니다. 결국 같은 기능을 지향하나, 방법만 다른 것이 아니었나 생각합니다.
채널팀은 좋은 제품을 만들기 위하여 다양한 고민을 해요. 이번 글에서는 API서버 자체를 만들면서 했던 고민들을 간단히 녹여보았는데요. 다음엔 채널팀에서 좋은 유저 경험을 위하여 어떻게 데이터를 다루고 있는지, 그리고 어떠한 고민을 했었는지 이야기해보려 해요.
더 좋은 제품을 위한 고민을 함께하고 싶으시다면, 아래 버튼을 통해 지원해주세요!
We Make a Future Classic Product
채널팀과 함께 성장하고 싶은 분을 기다립니다