Just Do IT!

[Spring] @Builder will ignore the initializing expression entirely. 해결 본문

개발 공부/Error

[Spring] @Builder will ignore the initializing expression entirely. 해결

MOON달 2024. 9. 11. 16:28
728x90
@Builder will ignore the initializing expression entirely. 
If you want the initializing expression to serve as default, add @Builder.Default. 
If it is not supposed to be settable during building, make the field final.

 

실습을 하면서 User entity를 생성하는데, 이러한 warning이 뜨고 있었다.

생성자를 사용하여 초기화하는 방법 대신에 lombok 어노테이션 중 하나인 @Builder를 사용했는데 이것 때문에 오류가 난 것이었다.

 

그렇지만 아래 if문을 읽으면 해결방법을 알 수 있다.

☞ @Build.Default를 사용하거나 final을 붙이면 해결 된다.

 

 

 

내가 작성한 코드는

@Entity
@EntityListeners(AuditingEntityListener.class)
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class User implements UserDetails {
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(updatable = false)
	private Long id;

	@Column(nullable = false, unique = true)
	private String email;

	@Column(nullable = false)
	private String name;

	@Column(nullable = false)
	private String password;

	@CreatedDate
	@Column(name = "created_at")
	private LocalDateTime createdAt;

	@LastModifiedDate
	@Column(name = "updated_at")
	private LocalDateTime updatedAt;

	@Column(nullable = false)
	@Enumerated(EnumType.STRING)
	private RoleEnum role = RoleEnum.ROLE_USER;

	@Column(name = "refresh_token")
	private String refreshToken;

	@Override
	public Collection<? extends GrantedAuthority> getAuthorities() {
		// 권한 목록 반환
		return List.of(new SimpleGrantedAuthority(role.name()));
	}

	@Override
	public String getUsername() {
		// 로그인할 사용자 명시
		return email;
	}
}

 

이런 형식이었는데 role의 default를 user로 지정하자 생긴 에러였다.

그래서 초기화를 원하는 필드에다 @Builder.Default를 붙여주었다.

 

	@Column(nullable = false)
	@Enumerated(EnumType.STRING)
	@Builder.Default
	private RoleEnum role = RoleEnum.ROLE_USER;

 

이렇게 수정하고 나니 경고문은 사라졌다.

 

@Default 애노테이션을 가진 필드는

반드시 초기화 식을 가져야 하고, building 과정 시에 초기화되지 않으면 식대로 초기화된다는 뜻이다.

 

@Builder는 해당 클래스의 별도의 static 내부 클래스를 만들어서 빌더 패턴을 구현하는데,

이 내부 클래스는 원래 클래스의 필드 초기화식에 접근할 수 없기 때문에 생기는 경고문이었다.

 

 

간단히 구글링으로 해결했는데, 나중에 똑같은 경고문을 만날까봐 작성해둔다.