Java

[어드민 페이지 만들기] JPA 추가기능 & @Builder, @Accessors(chain = true)

15호의 개발자 2022. 3. 10. 12:00
반응형

[어드민 페이지 만들기] JPA 추가기능 & @Builder, @Accessors(chain = true)

 


          

JPA 추가기능

 

private LocalDateTime createdAt;

private String createdBy;

private LocalDateTime updatedAt;

private String updatedBy;

createdAt, createdBy, updatedAt, updatedBy는 엔티티를 만들 때마다 공통으로 들어가는 컬럼이다. 자주 사용되는 만큼 이 부분을 따로 빼서 작업하면 더 좋을 것 같다. JPA에서는 객체가 생성되거나 데이터베이스에 들어갈 때 이러한 공통 부분이 자동으로 들어가게끔 설정할 수 있다.

 

 

import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

@Configuration  // 이 파일에는 설정파일이 들어간다고 알려줌
@EnableJpaAuditing  // JPA에 대해서 감시를 활성화시킴
public class JpaConfig {

}

config 패키지를 만들고 그 하위에 JpaConfig라는 클래스를 만든다. 여기에는 @Configuration과 @EnableJpaAuditing 애너테이션을 달아 놓는다. @Configuration 애너테이션은 해당 클래스가 설정파일임을 알려주는 역할이고, @EnableJpaAuditing 애터네이션은 JPA에 대해서 감시를 활성화시키는 역할을 한다.

 

 

import org.springframework.data.domain.AuditorAware;
import org.springframework.stereotype.Component;

import java.util.Optional;

@Component
public class LoginUserAuditorAware implements AuditorAware<String> {

    @Override
    public Optional<String> getCurrentAuditor() {
        return Optional.of("AdminServer");
    }

}

LoginUserAuditorAware 클래스는 로그인 한 사용자를 감시하는 역할로 사용할 예정이다.

 

 

@EntityListeners(AuditingEntityListener.class) // 해당 EntityListener는 AuditingEntityListner를 사용하겠다
public class AdminUser {

    ...생략...
    
    @CreatedDate // 따로 지정하지 않더라도 해당 객체가 수정되면 자동으로 값이 채워짐
    private LocalDateTime createdAt;

    @CreatedBy // LoginUserAuditorAware에서 리턴하는 AdminServer를 반영함
    private String createdBy;

    @LastModifiedDate // 따로 지정하지 않더라도 해당 객체가 수정되면 자동으로 값이 채워짐
    private LocalDateTime updatedAt;

    @LastModifiedBy // LoginUserAuditorAware에서 리턴하는 AdminServer를 반영함
    private String updatedBy;

}

이제 createdAt에는 @CreatedDate 어노테이션을 달고, createdBy에는 @CreatedBy 어노테이션을, updatedAt에는 @LastModifiedDate 어노테이션을, updatedBy에는 @LastModifiedBy 어노테이션을 달면 객체가 수정될 때마다 자동으로 값이 채워진다. 

 

AdminUser 외의 각 엔티티마다 위의 부분으로 다 변경해주면 JPA의 자동 추가기능을 활용한 훨씬 더 편리한 코드가 된다.

 

 


 

@Builder, @Accessors(chain = true)

 

 

public class UserRepositoryTest extends StudyApplicationTests {

    User user = new User(account, password, status, email, phoneNumber, registeredAt, unregisteredAt);
    
}

만약 User 객체를 생성한다고 가정해보자. 매개변수가 없는 생성자도 있지만 모든 매개변수를 가진 생성자도 있다. 이 경우 모든 매개변수를 가진 생성자에는 각 타입들이 정해져있고 이 순서에 맞춰서 작성해야 한다. 반드시 클래스에 선언된 멤버변수 순서대로 작성해야 한다는 것이다. 하지만 클래스 멤버변수 중간에 다른 멤버변수가 추가되는 경우, 모든 매개변수를 가진 생성자도 수정해줘야하는 번거로움이 있다.

 

 

// 4개의 매개변수를 가진 생성자
User user = new User(account, password, status, email);
public class User {

    // User 클래스에 생성자를 추가해줘야 한다.
    public User(String account, String password, String status, String email) { };

}

또한, 위와 같이 4개의 매개변수만 사용하는 생성자가 있는 경우에도 User 클래스에 생성자를 추가해줘야 한다. 사실상 롬복의 생성자 어노테이션을 사용하는 의미가 사라지는 것이다. 이를 보완하기 위해 요즘은 생성자 패턴에 빌더(Builder) 패턴을 많이 사용한다. 사용법은 간단하다.

 

 

@Builder // 빌더 생성자 패턴
@Accessors(chain = true) // chaining된 형태로 객체를 생성하거나 수정할 수 있음
public class User {

    ...생략...
    
}
User u = User.builder()
         .account(account)
         .password(password)
         .status(status)
         .email(email)
         .build();

빌더 패턴을 이용하기 위해서는 우선 User 클래스에 @Builder 어노테이션을 달아줘야 한다. @Accessors(chain = true) 어노테이션까지 달아주면, 체이닝된 형태로 객체를 생성하거나 수정할 수 있게 된다. 빌더 패턴은 객체를 생성할 때(Create) 유용한 패턴이고, 체인 패턴은 객체를 업데이트 할 때(Update) 유용한 패턴이다. 이 두 어노테이션은 매우 유용하므로 모든 엔티티에 추가해놓기로 하자.

 

빌더 패턴의 사용법은 다음과 같다. User 뒤에 builder() 메서드를 쓰고, 필요한 매개변수만큼 이어 붙인 다음에, 마지막에 build() 메서드로 닫아준다. 이렇게 빌더 패턴을 사용하면 User 클래스에 생성자를 추가해줄 필요가 없다.

 

 

 

<@Accessors(chain = true) 사용 전>

user.setAccount(account);
user.setPassword(password);
user.setStatus(status);
user.setEmail(email);

 

<@Accessors(chain = true) 사용 후>

user.setAccount(account)
    .setPassword(password)
    .setStatus(status)
    .setEmail(email);
    
    또는
    
User user = new User().setAccount(account)
                      .setPassword(password)
                      .setStatus(status)
                      .setEmail(email);

체인 어노테이션을 붙이면 생성자를 만들지 않고서도 바로 객체를 생성할 수 있다.

 

 

 

(출처: 패스트캠퍼스 Java & SpringBoot로 시작하는 웹 프로그래밍)

반응형