build.gradle.kts 에서 의존성 버전 관리를 용이하게 하기위해 versions 객체 이용
일관적인 코드 스타일을 유지하기 위해 kotlin lint 를 적용
- ./gradlew ktlintCheck 실행 시, kotlin lint 검사 동작하여 코틀린 컨벤션에 맞지 않는 부분 확인 가능
- commit, push 시 kotlin lint check 하여 fail 나면 commit/push 되지 않도록 제약을 걸어둠.
- 이 부분은 이야기가 필요. 추후 빠른 개발이 필요해지면 잠시 disable 하는 것도 좋을 것 같음.
전역 예외처리
- spring context 내에서 발생하는 예외를 일관적으로 핸들링하기 위해, 예외 공통 응답, 전역 예외 처리기 구현
- global/exception 내에 관련 코드 존재
로깅을 위해 kotlin-logging 라이브러리 사용
- @slf4j 와 거의 유사하게 사용가능하므로, 메인 스택이 자바였던 우리가 익숙하게 사용가능 할 것이라 생각하여 채택
swagger 기본 설정을 셋업
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
}
}
스프링, 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 처리 되도록 함.
논의했던 내용
쿼리 빌더는 QueryDSL vs kotlin JDSL ?
QueryDSL 은 오픈소스이지만 업데이트 빈도가 매우 적어서, 이슈 대응이 잘 되지 않음. 더불어 Q Class 생성 관련해서 설정이 다소 불편하여 사용성이 좋지 않음.
kotlin JDSL 에서는 이와 같은 단점을 해결. 현업에서 QueryDSL 으로 구성된 프로젝트를 kotlin JDSL 으로 이관한 사례를 여럿 확인할 수 있음에 따라 kotlin JDSL 을 사용하기로 채택
공유할 내용
kotlin JDSL 을 셋업하려고 했으나, 본 PR 이 너무 무거워질 것 같고, 쿼리 빌더가 필요해지는 시점에 해당 PR 에서 셋업하는 것이 더 자연스러울 것이라 생각하여 보류
회원 엔티티만 예시로 엔티티 코드 구현해두었는데, 필요에 따라 변경하여 작업해주시면 좋을 것 같습니다.
작업 요약
build.gradle.kts
에서 의존성 버전 관리를 용이하게 하기위해 versions 객체 이용일관적인 코드 스타일을 유지하기 위해 kotlin lint 를 적용
전역 예외처리
로깅을 위해
kotlin-logging
라이브러리 사용swagger 기본 설정을 셋업
jpa auditing 을 통해 base entity 정의
스프링, jpa 와 코틀린을 상호운용하기 위한 설정
@Transactional
역시 프록시 객체를 만들어서 작동하는 방식이라 동일한 문제가 발생.이를 해결하기 위해서는 필요한 클래스에 open 을 달아주어야 하는 번거로움이 존재함. 플러그인을 사용하여 자동으로 필요한 부분에 open 처리 되도록 함.
논의했던 내용
QueryDSL
vskotlin JDSL
?공유할 내용
레퍼런스