Backend

kotlin으로 java springboot 프로젝트 리팩토링 하기

!쪼렙조햄 2020. 4. 11. 00:36
반응형

spring boot + java로 만들어진 API 제공 서비스를 kotlin으로 리팩토링 하기

👩🏻‍🍳 intelliJ gradle 프로젝트 불러오기

spring boot maven으로 빌드하는법을 배운지 얼마되지 않아 갑자기 이번 프로젝트는 gradle으로 빌드 해야 했다. dependency를 선언하는데에 있어서, 프로젝트를 불러올때 작은 차이가 있었다

프로젝트 불러오는법

  • gradle.build 파일로 import
  • gradle에 필요한 external library가 자동으로 불러지지 않는 경우

🙅🏻‍♀️ 기존 프로젝트의 버전을 그대로 사용?

기존 프로젝트의 버전은 아래와 같았다

  • gradle : 4.3
  • spring boot : 1.5.3.RELEASE
  • java : 1.8
    위 버전을 그대로 유지하면서 java만 kotlin으로 변경하여 프로젝트를 만드려고 시도했다. spring initializr에 가서 spring boot 프로젝트 초기 세팅을 하는데 여기서 문제점 발생

spring boot 2.x.x대만 제공중이고 다시한번 살펴보니 기존 프로젝트는 1.대.. 그치만 일단 spring boot 2.2.6 버전을 선택하고 강제집행 해보았다

그후로 생긴 문제점들

  • build.gradle.kts (kotlin 프로젝트는 kts 가 뒤에 붙는다) 에서 spring boot의 버전을 변경해 주었을 때 에러 발생
  • kotlin은 가장 최신버전인 1.3.71로 자동 설정되었는데, gradle 4.3버전과 호환이 되지 않는 문제

결정적으로 spring boot가 1점대 버전인것이 다른 버전들과 함께 사용하는데 문제가 생겨서 하루종일 프로젝트 시작을 못했다.

💁🏻‍♀️ 이왕 리팩토링 하는거 신규 버전 라이브러리 사용하자

결국 버전 업도 함께 진행하기로 하고, 아래와 같이 버전을 결정했다

  • gradle : 4.10.3
  • spring boot : 2.2.6
  • kotlin : 1.3.71
  • java : 1.8
    gradle은 기존과 같은 4점대 버전에서, kotlin과 호환되는 4.10.3 버전으로 업그레이드 하기로 하고, spring boot는 화끈하게 2.2.6으로 변경하기로 했다. kotlin도 build시에 java가 필요하고, 해당 jvm 버전은 1.8로 설정했다.

<img width="1214" alt="DBA09FB5-F1B3-442F-AFAA-EF4DF8161499" src="https://media.oss.navercorp.com/user/17135/files/9adacb00-7a94-11ea-9853-cbbdeda6134e”>

  • dependency
    • spring web
    • spring boot devtools
    • spring configuration processor
      위와 같이 3개의 의존성 추가를 한 상태로 새 프로젝트를 생성하였고, intelliJ에 import 했다.

🧞‍♂️ 여기까지에서 알게된 java와 kotlin의 차이점

  • dependency 설정
    • java : group, name, version = 이렇게 나눠서 표기
    • kotlin : group:name:version 으로 표기
    • 소소하지만 kotlin의 표기방식이 더 짧고 간결했다.

🧤 갑자기 공부한 Spring Web MVC

  • MVC : Model View Controller
  • 도메인 모델 (Model), 프레젠테이션을 표현하는 View 분리
  • 양측 사이에 컨트롤러를 배치하도록 설계한 디자인 패턴
  • Servlet
    • spring은 MVC 패턴을 구현하기 위해 Front Controller 패턴을 사용
    • 프레임워크의 여러가지 기능을 제공하는 servlet 중심으로 설계
    • DispatcherServlet
      • 스프링에서 front controller 역할을 하는 것
      • 스프링 IoC 컨테이너와 통합되어 스프링이 가진 모든 기능을 사용할 수 있게 한다

👛 갑자기 공부한 gradle wrapper

  • gradlew
    • 새로운 환경에서 프로젝트를 설정할때 kotlin, gradle 설치 없이 빌드 가능하도록
    • 쉘 스크립트
  • 초기 gradle init으로 gradlew 생성 가능
  • terminal에서 gradle 버전 변경하기
    • gradle 버전 변경
    • ./gradlew wrapper --gradle-version 4.10.3
      • 위 명령어로 gradle 버전을 4.10.3으로 맞췄다
  • gradle/wrapper/gradle-wrapper.properties 에서도 변경 가능

😦 자 이제 본격적인 리팩토링 시작!

드디어 프로젝트를 무사 실행시키고 첫 컨트롤러를 만들었다. 그런데 첫줄부터 어떻게 리팩토링 해야할지 이해 안되는 코드 발견.

또 갑자기 공부한 Interface Comparable..

  • 정렬 수행시 기본적으로 적용되는 정렬 기준 메소드를 정의하는 인터페이스
  • 정렬할 객체에 Comparable interface를 implement한 후, compareTo() 메서드를 override 하여 구현
  • 반환 값이 음수 또는 0이면 객체의 자리 그대로 유지
  • 양수인 경우에는 두 객체의 자리 바뀜
  • comparable
    • 객체간의 일반적인 정렬이 필요할때, comparable 인터페이스를 확장해서 정렬의 기준을 정의하는 compareTo() 메서드 구현
  • comparator
    • 객체간의 특정한 정렬이 필요할 때, Comparator 인터페이스를 확장해서 compare() 메서드 구현

Reference

반응형