강의

멘토링

로드맵

Inflearn brand logo image

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

JongYun Won님의 프로필 이미지
JongYun Won

작성한 질문수

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

주문, 주문상품 엔티티 개발

생성자 대신 세터를 쓰는 이유

작성

·

42

0


=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]
14:26을 보시면, createOrderItem에서 모든 필드에 대해 세터를 호출하여 일일히 값을 주입합니다.

다양한 파라미터를 사용하는 경우의 수에 대해 각각 생성자를 선언해두면
가독성이 상승하여 추후 유지보수에도 더 편리할것 같은데, 이렇게 사용하는 이유가 있나요?

스프링 강의만 수강하고 야생형 코스를 막 시작한 입장에서,

제가 기억하는 생성자 관련 원칙은 다음과 같습니다.

  1. 아무 생성자도 없다면 기본 생성자가 생성된다.

  2. JPA는 리플렉션을 통해 코드를 생성하기에 기본 생성자는 반드시 필요하므로, 필요하면 명시하여 생성한다.

  3. DI를 위해서 @RequiredArgsConstructor를 이용하여 final 필드를 사용하는 생성자를 생성하고, 주입받는 방식을 권장한다.

생성자는 최소화하라는 다른 원칙이 존재하는 것인가요?

답변 1

0

안녕하세요, 인프런 AI 인턴입니다. JongYun Won님. 질문 주신 “생성자 대신 세터를 사용하는 이유”에 대해 설명드리겠습니다.

스프링과 JPA 환경에서 생성자를 설계할 때는 몇 가지 고려사항이 있습니다.

  1. 기본 생성자의 필요성: JPA는 엔티티를 프록시를 통해 관리하며, 리플렉션을 사용해 객체를 생성할 때 기본 생성자가 필요합니다. 따라서 별도로 생성자를 정의하지 않으면, JPA는 기본 생성자를 필요로 하게 됩니다.

  2. Setter 사용의 이유:

    • 유연성: 여러 생성자를 만들기보다는 기본 생성자를 사용하고, 필요한 경우에 따라 적절한 필드를 변경할 수 있는 setter를 사용하는 것이 유연합니다. 이는 초기화 단계에서 객체의 상태를 유연하게 설정할 수 있도록 합니다.
    • 명확성: 해당 엔티티의 값이 어떻게 세팅되는지를 코드를 통해 명확히 드러내는 장점도 있습니다. 각 필드가 어떤 목적을 가지고 어떻게 초기화되는지를 메서드명(예: setOrderPrice)을 통해 알 수 있습니다.
  3. 컨스트럭터와의 조합:

    • @RequiredArgsConstructor와 같은 롬복 애노테이션은 final 필드 위주로 생성자를 생성하게 하여 DI 주입 시 유용합니다. 그러나 비즈니스 로직이나 객체 변환 로직에서 필요한 경우에는 불변 객체를 유지하기 위해 final을 사용하는 것이 더 안정적일 수 있습니다.
  4. 유지보수성: 여러 개의 생성자를 관리하는 것은 자칫 잘못된 사용으로 객체의 불변성을 해칠 수 있으며, 코드의 가독성을 떨어뜨릴 수 있습니다. setter를 통해 관리하면, 필요한 부분에 따라 분리되고 명확하게 각 단계에서 데이터를 설정할 수 있어 유지보수가 더 수월합니다.

추천 자료:
- OrderItem을 생성할 때 생성자와 Builder 패턴을 사용하는 이유

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

JongYun Won님의 프로필 이미지
JongYun Won

작성한 질문수

질문하기