본문 바로가기
Spring/Spring Data JPA

@AllArgsConstructor 지양 이유 및 대책

by Mecodata 2024. 2. 26.

@AllArgsConstructor의 문제점

- @AllArgsConstructor는 모든 필드를 파라미터로 받아 객체를 생성하기 때문에 일부 필드만 사용하는 경우에 불필요한 의존성을 발생 시킬 수 있음

- @AllArgsConstructor는 정의한 모든 필드를 가진 생성자를 생성해주는데 다음과 같이 같은 타입의 파라미터를 서로 바꿔 입력하였을 경우에도 에러가 발생하지 않는 문제가 발생함

@AllArgsConstructor
public class carDto {
    private String carId;
    private int carNum;
    private String carUser;
}

// new carDto("Tom", 4123, "n1309afc2")

 

대책 (@Builder)

- 원하는 필드를 설정할 생성자 메소드를 private로 정의한 뒤 @Builder를 적용

@AllArgsConstructor가 없는 상황에서 @Builder와 @NoArgsConstructor를 클래스 레벨에서 같이 적용할 경우 모든 필드를 파라미터로 갖는 생성자가 생성될 수 없어 build 시에 오류가 발생하기 때문에 @Builder를 클래스 레벨이 아닌 생성자 메소드 레벨에 적용해야 함

@NoArgsConstructor
public class carDto {
    private String carId;
    private int carNum;
    private String carUser;
    
    @Column(columnDefinition = "text", updatable = false)
    private String createDt = ServerInfoUtil.LocalDateTimeToString(LocalDateTime.now());
	
    @PrePersist
    protected void onCreate() {
        createDt = this.LocalDateTimeToString(LocalDateTime.now());
    }
    
    public static String LocalDateTimeToString(LocalDateTime localDateTime) {
        return localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
    }
    
    @Builder
    private carDto(String carId, int carNum, String carUser) {
    	this.carId = carId;
        this.carNum = carNum;
        this.carUser = carUser;
    }
    
}

 

 

'Spring > Spring Data JPA' 카테고리의 다른 글

JPQL(Java Persistence Query Language)  (1) 2024.04.05
spring.jpa.hibernate.ddl-auto  (0) 2024.03.19

댓글