@AllArgsConstructor 사용의 문제점
@AllArgsConstructor는 모든 필드를 가진 생성자를 만들어줍니다
@AllArgsConstructor
public class BuildMe {
private String name;
private int age;
private String keyword;
}
-------------------------------------------------------------------------------------
public class BuildMe {
private String name;
private int age;
private String keyword;
public BuildMe(final String name, final int age, final String keyword) {
this.name = name;
this.age = age;
this.keyword = keyword;
}
}
- 그러나 이 경우에는 생성자 사용의 문제점인 같은 타입의 매개변수를 서로 바꿔 입력했을 때 발생하는 문제입니다.
- new BuildMe(”keyword”, 10, “name”) 이렇게 생성을 해도 컴파일 단계는 물론 런타임 단계에서도 에러가 발생하지 않지만 프로그램 상으로는 말이 안되는 코드이기 때문에 Builder사용이 권장됩니다.
@AllArgsConstructor지양에 따른 문제점
- 보통은 @AllArgsConstructor와 @NoArgsConstructor를 같이 사용하지만 매개변수를 받는 생성자 사용시 발생하는 위와 같은 문제점이 여럿 존재 → @AllArgsConstructor제거
- 그러면 이제 @Builder + @NoArgsContructor를 사용해야 하지만 이 둘을 클래스단에서 같이 사용할 시에는 모든 필드를 매개변수로 갖는 생성자가 생성되지 않기 때문에 build시 오류가 발생합니다. -> @NoArgsConstructor제거
- 그런데 기본생성자가 없을 경우 스프링이 객체를 컨테이너로 등록 관리하는 과정 혹은 프록시 객체를 생성하는 중 해당 객체 자체를 생성할 수 없어 문제가 생깁니다.→ @NoArgsConstructor사용
해결 방법
@NoArgsContructor는 반드시 사용해야 하는데 @Builder를 같이 사용하면 문제가 생기죠??
제가 해결한 방법은 다음과 같습니다.
- 원하는 필드를 설정할 생성자를 만들되 private으로 막고 생성자 레벨에 @Builder를 사용한다
- 클래스 레벨에 @NoArgsConstructor를 사용한다.
리팩토링
@NoArgsConstructor
public class BuildMe {
private String name;
private int age;
private String keyword;
@Builder
private BuildMe(String name, int age, String keyword) {
this.name = name;
this.age = age;
this.keyword = keyword;
}
}
'Spring' 카테고리의 다른 글
JWT인증 설정 시 SpringBootTest (0) | 2023.05.06 |
---|---|
@preAuthorize() 로그인 페이지 매핑 (0) | 2023.04.28 |
테스트 단 @Transactinal 롤백 (5) | 2023.03.30 |
SpringBoot3.0 Entity생성오류 (0) | 2023.03.30 |
SpringBoot 트랜잭션 직접 다루기 (0) | 2023.03.29 |