개발 스토리

[코프링 걸음마] 코프링에서 필요한 플러그인

타칸 2025. 2. 10. 14:34

프로젝트 시작 전 필요한 플러그인

배경

이번에 디프만에서 팀 프로젝트를 진행하게 되는데 기존에 해왔던 자바 스프링이 아닌 코틀린 스프링으로 진행하게 되었다.

나는 코틀린을 처음 접하기에 새롭게 배우는 부분이 많은데 이러한 내용들을 정리해볼까 한다.

 

[스프링]

plugins {
  ...
  kotlin("plugin.spring") version "1.9.22"
	...
}

스프링에서는 AOP 처리를 위해 상속을 내부적으로 한다. 하지만 코틀린에서 선언하는 클래스는 기본적으로 final 클래스이기에 open 키워드를 붙여줘야 상속이 가능하다. 매번 open을 적어주는 것은 귀찮은 작업이기에 자동으로 open을 붙여주기 위한 스프링 플러그인을 추가해줘야 한다.

 

 

[JPA]

@Entity
class User(
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    val id: Long? = null,
    var name: String,
    var email: String
)

JPA를 사용하면 @Entity를 사용해서 도메인 객체를 선언한다. 하지만 코틀린에서 위와 같이 이쁘게 도메인 객체를 만들어두어도 에러가 발생한다.

이유는 기본 생성자가 없기 때문이다. JPA에서는 프록시 객체를 통한 Lazy 로딩을 지원한다. 이를 위해서는 Entity 객체로 프록시 객체를 생성해야 하고 이 과정에서 기본 생성자가 필요하다.

 

해당 오류를 해결하기 위해 기본 생성자를 호출할 수 있게 디폴트 값들을 넣어주는 방법이 있다.

 

디폴트 값이 있기에 생성자에서 생략할 수 있고 User()와 같이 호출할 수 있다. 하지만 매번 디폴트 값을 정의해줘야 하는 것이 여간 귀찮은 작업이 아니다.

 

그래서 스프링에서는 플러그인을 활용하는 방법을 제공한다.

plugins {
  ...
  kotlin("plugin.jpa") version "1.9.22"
	...
}
It generates no-arg constructors for any class annotated with @Entity, @MappedSuperclass or @Embeddable.(ref)

 

위와 같이 플러그인을 추가해 주면 기본 생성자를 자동으로 생성해 주기에 디폴트 값을 따로 정의해주지 않아도 된다.

더 이상 에러가 발생하지 않는 것을 확인할 수 있다.