ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring Boot] Entity builder 설정하기
    개발/Spring Boot 2024. 1. 15. 03:05

    Spring Boot에서 Entity를 만들면 id와 다른 여러 필드로 구성한다. repository에 save 할 때 Entity의 instance를 만들어야 하는데 Lombok의 @AllArgsConstructor를 통해서 객체를 만들 수 있지만 필드의 순서나 변경이 생기면 관련 로직이 모두 망가지는 문제가 있다. 또, id같이 직접 지정하지 않아도 되는 필드에 임의로 값을 넣어야 하는 불편함도 있다. JPA에 의해서 자동으로 id값이 변경되어 저장되긴 하지만 의도하지 않은 동작을 일으킬 우려가 있다. Lombok에서 제공하는 @Builder를 사용하면 이런 문제를 해결할 수 있다.

     

    User 엔티티

    필자의 프로젝트인 portpolent의 user 엔티티의 스키마는 다음과 같다.

    이름 타입 비고
    id int PRIMARY KEY
    email String  
    handle String  
    username String  
    password String  
    accountType AccountType enum

     

    Builder 생성자 만들기

    builder에 포함시키고 싶은 필드를 초기화하는 생성자를 만들고 @Builder를 붙여주면 된다.

    @Builder
    public User(String email, String handle, String username, String password, AccountType type) {
        this.email = email;
        this.handle = handle;
        this.username = username;
        this.password = password;
        this.accountType = type;
    }

     

    그러면 아래와 같이 사용할 수 있다.

    User user = User.builder()
        .email("test1@mail.com")
        .handle("handle")
        .username("User1")
        .password("password")
        .build();

     

    기본값 지정하기

    위의 코드를 보면 accountType를 지정하지 않은 것을 볼 수 있다. 미리 기본값을 지정해놓았기 때문인데, builder를 위한 기본값은 아래 조건을 만족하면 지정할 수 있다.

    • 모든 필드를 포함하는 생성자를 가질 것 (AllArgsConstructor)
    • 엔티티 클래스에 Builder 어노테이션이 있을 것
    • 대상 필드에 Builder.Default 어노테이션과 기본값(초기값)이 있을 것

    코드로 보면 다음과 같다.

    // ...
    @AllArgsConstructor
    @Builder
    public class User extends TimeEntity {
        // ...
        @Column(nullable = false)
        @Enumerated(EnumType.STRING)
        @Builder.Default
        private AccountType accountType = AccountType.OWN;
        // ...
    }

     

    참고

    잘못된 엔티티 객체를 만들 수 있는 AllArgsContructor나 NoArgsConstructor는 가능하면 노출하지 않는 것이 좋다. lombok에서는 생성자들의 visibility를 직접 설정할 수 있는데 protected 정도로 두면 필요에 따라 내부에서는 사용하면서도 외부에는 노출하지 않을 수 있다.

    @AllArgsConstructor(access = AccessLevel.PROTECTED)
    @NoArgsConstructor(access = AccessLevel.PROTECTED)

     

    '개발 > Spring Boot' 카테고리의 다른 글

    @NotNull, @NotEmpty, @NotBlank 차이  (0) 2023.12.14
YEAHx4