인프런 커뮤니티 질문&답변

김상형님의 프로필 이미지

작성한 질문수

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

엔티티 클래스 개발2

값 타입의 필드들에 final

작성

·

82

0

1. 강의 내용과 관련된 질문인가요? 예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예

[질문 내용]
값 타입의 클래스에 setter를 제공하지 않아도 변경 불가능하도록 할 수 있지만, 필드들에 final을 붙이는 것 또한 괜찮지 않을까요?
대신 기본생성자도 만들 기 위해서 @NoArgsConstructor 옵션을 사용 할 수 있을 것 같습니다.
최종 형태입니다

@Embeddable @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED, force = true) @RequiredArgsConstructor public class Address { private final String city; private final String street; private final String zipCode; }

이런식으로 만들어도 될까요? 또 force 옵션을 쓰게 되면 리플랙션/프록시 기술에 영향을 주어서 쓰면 안되는 형태일지 궁금합니다

답변 2

0

안녕하세요. ideal0427 김상형님, 공식 서포터즈 코즈위버입니다.

혹시 위와같이 코드를 작성하신 후에 컴파일을 진행해보셨을까요?

@NoArgsConstrucotr 는 파라미터가 없는 기본생성자를 클래스에 추가하게 되는데요.

필드에 final 멤버변수가 있는 상태로 초기화를 진행하지 않을 경우 문법오류가 됩니다.

 

그래서 Address 클래스에 기본생성자가 추가되는 순간 문법오류가 되어 문제가 발생할 것같습니다.

감사합니다.

김상형님의 프로필 이미지
김상형
질문자

force = true 옵션을 사용하였기 때문에 컴파일 오류가 나지 않습니다

0

안녕하세요, 인프런 AI 인턴입니다. ideal0427 김상형님.

값 타입의 필드들에 final을 사용하는 것과 관련하여 질문을 주셨네요. 이는 주로 불변 객체를 만들기 위한 방법 중 하나로 많이 사용됩니다. 김상형님께서 작성하신 코드 형태는 불변 객체를 만드는 좋은 접근 방식입니다. 다만, @NoArgsConstructor(access = AccessLevel.PROTECTED, force = true) 옵션 사용에 대해 다소 우려가 될 수 있는 부분이 있습니다. 이 옵션은 Lombok이 불변 필드들을 초기화하기 위해 사용되며, 이는 리플렉션을 사용합니다.

이와 관련된 기존 답변을 확인해보시기 바랍니다:

다음은 Address 클래스의 최종 코드 예제로, final 키워드와 Lombok@RequiredArgsConstructor를 사용하는 방식이며, 불변 객체를 쉽게 생성할 수 있습니다:

@Embeddable
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED, force = true)
@RequiredArgsConstructor
public class Address {
    private final String city;
    private final String street;
    private final String zipCode;
}

이러한 방식은 JPA 프록시가 동작하는 데 영향을 줄 수 있으며, 특히 이와 관련된 예외 상황에 대한 관리가 필요할 수 있습니다. JPA에서 프록시 객체가 생성될 때 기존 필드가 접근 가능한 상태여야 하기 때문입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

김상형님의 프로필 이미지
김상형
질문자

이번 링크들은 주요 고민사항과 전혀 관련이 없는 답변들이네요 ㅜ

"이러한 방식은 JPA 프록시가 동작하는 데 영향을 줄 수 있으며, 특히 이와 관련된 예외 상황에 대한 관리가 필요할 수 있습니다. JPA에서 프록시 객체가 생성될 때 기존 필드가 접근 가능한 상태여야 하기 때문입니다."
이 말도 이해가 잘 가지 않습니다.
프록시에 동작하는데 영향을 어떻게 왜 주는걸까요.. 그리고 기존 필드는 getter가 있다면 접근 가능하다고 생각되는데요

테스트코드로 확인해본 결과 기본생성자로도 생성 가능했고, 필드들을 전부 초기화 해서 생성하는 것도 가능해서 문제가 없을 것 같습니다..