작성
·
93
1
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!
먼저 유사한 질문이 있었는지 검색해 보세요.
서로 예의를 지키며 존중하는 문화를 만들어가요.
Entity 객체에
@RequiredArgsConstructor(access = AccessLevel.PROTECTED)
로 설정해주는 이유가 외부에서 객체의 생성을 제한하려는 의도인것 같은데요
final 키워드를 가진 instance가 없는데도 RequiredArgsConstructor 를 사용한 의도가 있는지 궁금합니다.
아직 강의 후반까지는 보지않은 상태이긴하지만
final 키워드가 없으면 결국 NoArgsConstructor랑 같은 동작을 하는것이 아닌가해서요
답변 2
0
안녕하세요, 김동민 님!
네, 지금은 final 키워드를 가진 필드가 없더라도, 추후에 final 필드가 추가되는 등의 변화가 있을 수 있으니, @RequiredArgsConstructor
로 일괄 적용했다고 보시면 됩니다.
만약 final 키워드가 없어서 @NoArgsConstructor
를 사용했다면, 추후 객체 변경이 일어났을 때 이 부분도 잊지 않고 수정해주어야 하니까요.
도움이 되셨기를 바랍니다.
감사합니다. 🙂
0
안녕하세요, 인프런 AI 인턴입니다. 김동민님 질문에 대한 답변을 드리겠습니다.
@RequiredArgsConstructor(access = AccessLevel.PROTECTED)
어노테이션을 사용하여 엔티티 객체의 생성을 제한하는 경우는 주로 객체 지향 설계의 원칙 중 하나인 캡슐화(encapsulation) 를 유지하기 위한 목적이 있습니다. 이는 다음과 같은 이유에서 사용됩니다:
엔티티 외부에서의 불필요한 인스턴스 생성 방지: 외부에서 엔티티 객체를 직접 생성하지 못하게 하고, Spring의 관리 하에서만 생성되도록 제한하여 엔티티의 일관성을 보호할 수 있습니다.
객체의 불변성(immutability) 강화: 객체의 상태가 불변이 될 수 있도록 특정 필드만 초기화되고 이후 변경되지 않게 하여 협력하는 다른 객체들이 협업하기 쉽게 하고, 코드의 안정성을 높일 수 있습니다.
final
키워드가 사용되지 않은 경우에는 주로 설계 상의 의도를 드러내기 위해 이러한 접근 제어를 사용합니다. Java에서는 final
필드를 통해 불변 객체를 쉽게 만들 수 있지만, 모든 경우에 final
을 사용하기 어려운 부분도 있습니다. 예를 들어, JPA에서 id
는 지연 로딩되므로 final
로 선언할 수 없습니다.
만약 @RequiredArgsConstructor(access = AccessLevel.PROTECTED)
를 사용하는데 final
필드가 없다면, 이는 기본적으로 @NoArgsConstructor
와 유사한 동작을 수행할 수 있습니다. 하지만 생성자의 접근 수준을 보호(Protected) 로 설정하여 서브 클래스에서만 생성 가능하게 제한하는 전략으로 볼 수 있겠습니다.
관련해서 더 배워보실 수 있는 질문과 답변 링크를 추천드립니다:
- Lombok 사용시 생성자 관련 문의
위 링크에서는 Lombok을 활용한 생성자 사용 시의 다양한 패턴에 대한 활용 방법을 설명하고 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.