본문 바로가기

프로그래밍 언어 노트/JAVA | Kotlin

[Spring Boot] + Kotlin 에서 Route + Beans DSL 을 사용해보자

전통적인 Spring 의 방식 (MVC) 는 컨트롤러 + 서비스 + 레포를 어노테이션으로 등록하고, Spring 이 Bean으로 등록해서 슈슈슉 뜨는 방식인데,

나도 Spring 쓸때는 이렇게 작성하긴 하는데 개인적으로 선호하는 방식은 아니다.

개인적으로는 route data (혹은 function) 으로 조합가능하게 짜는 방식이 더 우아하다고 생각한다.

ktor 방식의 route function
Reitit (clojure) 의 route data

 

다만 Webflux 의 경우 (Java 에서도) Route Function (Functional Endpoints) 방식을 사용할수있는데. MVC 는 딱히 없는걸로 알고있었다. 근데 JAVA 라 DSL 그렇게 이쁘지는 않다.

LinkedIn post 를 보다가, JetBrains 에서 발표한 자료에서 Kotlin Beans DSL 이 있는것을 보고 좀 찾아보니까.

이게 왠걸  Spring 5.2 (아마?) 이후부터 MVC 도 이런식으로 라우팅이 가능하다. (예전에는 reactive package 만,, 그러니까 Webflux 에만 route function dsl 이 있던것 같은데)

 

따라서 다음과 같은 2가지 DSL 이 존재한다.

  • Route 용 DSL, 그리고 Kotlin 을쓰면 Java 보다 좀더 이쁘다
  • Beans 용 DSL

 

위 DSL 을 이용하면, 좀더 우아한 방식으로 Spring 코드를 작성할수 있을것 같아서 아주아주 간단한 count 서버를 짜봤다.

 

간단히 보면

1. 아래처럼 route dsl 을 제공해준다. (MVC 의 경우 서블렛)

reactive 가 아니다.

(Reative 용 route 와 코루틴용 coRoute 도 있다)

다만, 이건 그냥, router dsl 로 RouterFunction을 정의한것 뿐 이고 Spring 에서 관리하는 Beans 는 아직 아니다.

어찌됫든, Spring 에서 사용하려면 Bean 으로 맹글어줘야한다.

 

2. Route를 Bean DSL 로 등록할 수 있다.

beans DSL 을 사용할수 있다.

 

위와 같이 beans + bean DSL 을 이용하여 Spring 이 관리하는 Beans 를 작성할수있다.

ref 함수는 applicationContext.getBean() 의 숏컷, 대충 autowired 마냥 넣을넘 알아서 넣어주는 역할 

 

이러면 beans DSL 로 bean을 구축하고, 이걸 main 에서 사용하므로, 우리가 원하던

route를 DSL 로 생성하고, spring 에서 사용 (bean화) 하는것 이 가능하다.

물론 beans DSL 내에서 route 를 넣어도 되고, if문과 같은 프로그래밍적 작업도 먹는다.

 

아마... 어노테이션이랑 섞어쓰는것도 가능할듯.

 

간단해서 별 내용 없긴한데, 까먹었을때 나중에 보기위한 용도로 repo 에도 올려놨다

Lee-WonJun/kotlin-spring-bean-dsl-test: Test repo that spring boot kotlin Beans dsl for routing (github.com)

참고

728x90