티스토리 뷰

JPA를 다루다보면 Entity를 생성할 때 반복적으로 해줘야 할 일들이 있습니다.

@Entity 애너테이션을 클래스 이름 위에 생성해줘야 하고, lombok을 같이 사용하는 경우 @Getter, @Setter 등을 경우에 따라 생성해줘야 합니다.

특히 IntelliJ Ultimate 버전을 사용하게 되면 DataSource와 자동으로 연동하여 JPA 관련된 속성들을 파악해 컴파일타임에 바로바로 에러나 경고를 표시해주기도 합니다.

그래서 계속 반복적인 작업을 하는게 귀찮기도 하고 바로바로 나타나는 빨간 줄들이 신경쓰이기도 해서 거의 기본 포맷처럼 사용하는 Entity 클래스를 Live Template 기능을 사용해 정의해봤습니다.

 

먼저 설정 탭에서 Live Template을 검색한 뒤 Java 항목을 찾아 우측에 + 버튼을 누른뒤 Live Template을 선택합니다.

(JPA 관련해서 여러 개의 Live Template을 만드실 경우 Template Group을 생성하셔도 됩니다.)

 

abbreviation 항목에 축약어로 사용할 단어를 입력합니다. 전 ent를 사용했습니다.

그리고 아래 Define을 클릭하면 어느 시점에 템플릿을 사용할지 정의할 수 있습니다.

전 선언(declaration) 시점에 사용하기 위해 Java - Declaration을 선택하였습니다.

 

Template text 부분을 아래 처럼 채워줍니다.

import lombok.Getter;
import lombok.Setter;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
@Getter
@Setter
public class $CLASS$ {
    @Id
    @GeneratedValue
    @Column(name = "$COLUMN_NAME$_id")
    private Long id;
}

그리고 Edit Variables를 클릭하여 변수를 세팅해줍니다.

 

CLASS 부분에는 사용자가 입력한 클래명이 들어가고 COLUMN_NAME 부분에는 CLASS명을 소문자로 바꾼 뒤 _id를 붙이는 방식을 사용했습니다.

제가 가장 많이 쓰는 Entity 클래스를 템플릿화 한 것인데, 테이블명을 그대로 사용하는 경우와 테이블을 따로 명시하는 경우를 나누어 사용하기위해 일단 이렇게 작성하였습니다.

 

 

실제 사용하는 장면은 아래와 같습니다.

그림이 그냥 깜빡일 경우 클릭해서 보세요 :)

 


이 글을 포스팅한 이후 도메인 모델 패턴에 대해 공부하게 되면서 Entity의 공통적인 템플릿에 대해 수정해야 할 필요성을 느꼈습니다. 물론 이 포스팅의 목적 자체는 IntelliJ의 Live Template에 대한 설명이 더 중요하지만, 혹시나 편의상 그냥 복붙해서 사용하실 분들을 위해 도메인 모델로서의 Entity를 생성할 수 있는 Live Template text를 추가합니다.

 

import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class $CLASS$ {
    @Id
    @GeneratedValue
    @Column(name = "$COLUMN_NAME$_id")
    private Long id;
}

 

  • 수정사항
    • @Setter 삭제
      • JPA 사용시 setter를 허용해줄 경우 side effect가 발생할 확률이 매우 높아지고, 발생했을 때 원인을 찾기가 매우 어려움
      • 특정 필드에 대한 수정이 필요한 경우에만 메서드 제공(setX 보단 기능을 표현할 수 있는 이름으로)
    • @NoArgsConstructor(access = AccessLevel.PROTECTED) 추가
      • 외부에서 객체를 생성하는 것이 아닌 static 메서드를 이용해 Entity 생성시 필요한 필수 항목을 입력받도록 유도
      • settter가 없기 때문에 static 메서드 필수(Live Template에는 존재하지 않으므로 직접 생성해야 함)
      • 모든 필드를 static 메서드를 통해 주입받아야 하는 경우 @AllArgsConstructor(staticName = "of") 등으로 간단히 표현 가능

 

 

댓글