Team-NumberOne / Daepiro_Backend

3 stars 0 forks source link

[feat/2] 의존성 관리, kotlin lint 적용, 전역 예외처리 및 로깅, swagger 기본 설정, JPA Auditing 을 통한 베이스 엔티티 정의 #4

Closed versatile0010 closed 2 months ago

versatile0010 commented 2 months ago

작업 요약

  1. build.gradle.kts 에서 의존성 버전 관리를 용이하게 하기위해 versions 객체 이용

  2. 일관적인 코드 스타일을 유지하기 위해 kotlin lint 를 적용

    - ./gradlew ktlintCheck 실행 시, kotlin lint 검사 동작하여 코틀린 컨벤션에 맞지 않는 부분 확인 가능
    - commit, push 시 kotlin lint check 하여 fail 나면 commit/push 되지 않도록 제약을 걸어둠.
    - 이 부분은 이야기가 필요. 추후 빠른 개발이 필요해지면 잠시 disable 하는 것도 좋을 것 같음.
  3. 전역 예외처리

    - spring context 내에서 발생하는 예외를 일관적으로 핸들링하기 위해, 예외 공통 응답, 전역 예외 처리기 구현
    -   global/exception 내에 관련 코드 존재
  4. 로깅을 위해 kotlin-logging 라이브러리 사용

    - @slf4j 와 거의 유사하게 사용가능하므로, 메인 스택이 자바였던 우리가 익숙하게 사용가능 할 것이라 생각하여 채택
  5. swagger 기본 설정을 셋업

  6. jpa auditing 을 통해 base entity 정의

    @MappedSuperclass
    @EntityListeners(AuditingEntityListener::class)
    abstract class PrimaryKeyEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    val id: Long? = null
    
    @CreatedDate
    @Column(nullable = false, updatable = false)
    val createdAt: LocalDateTime = LocalDateTime.now()
    
    @LastModifiedDate
    @Column(nullable = false)
    var lastModifiedAt: LocalDateTime = LocalDateTime.now()
    
    @Column
    var deletedAt: LocalDateTime? = null
    
    fun isDeleted(): Boolean {
        return deletedAt != null
    }
    }
  7. 스프링, jpa 와 코틀린을 상호운용하기 위한 설정

    // build.gradle.kts
    ...
    kotlin("plugin.spring") version "1.9.25"
    kotlin("plugin.jpa") version "1.9.25"
    ...
    • 코틀린 클래스는 기본적으로 final 이기 때문에 상속이 불가능함에 따라, CGLIB을 이용하여 프록시 객체를 만들고, 해당 프록시 객체를 등록하는 Spring 의 동작 방식과 궁합이 잘 맞지 않음.
    • JPA 의 @Transactional 역시 프록시 객체를 만들어서 작동하는 방식이라 동일한 문제가 발생.

이를 해결하기 위해서는 필요한 클래스에 open 을 달아주어야 하는 번거로움이 존재함. 플러그인을 사용하여 자동으로 필요한 부분에 open 처리 되도록 함.


논의했던 내용

  1. 쿼리 빌더는 QueryDSL vs kotlin JDSL ?

    QueryDSL 은 오픈소스이지만 업데이트 빈도가 매우 적어서, 이슈 대응이 잘 되지 않음. 더불어 Q Class 생성 관련해서 설정이 다소 불편하여 사용성이 좋지 않음. kotlin JDSL 에서는 이와 같은 단점을 해결. 현업에서 QueryDSL 으로 구성된 프로젝트를 kotlin JDSL 으로 이관한 사례를 여럿 확인할 수 있음에 따라 kotlin JDSL 을 사용하기로 채택

공유할 내용


레퍼런스