해결된 질문
작성
·
33
0
안녕하세요 토비님 궁금한점이 생겨 질문을 남깁니다.
예제를 진행하실때 정적팩토리 메서드를 통해 객체를 반환할때
생성자를 통하지않고 바로 멤버변수에 값을 넣어 반환하는걸 사용하셨는데 public static Member register(MemberRegisterRequest createRequest, PasswordEncoder passwordEncoder) {
Member member = new Member();
member.email = new Email(createRequest.email());
member.nickname = requireNonNull(createRequest.nickname());
member.passwordHash = requireNonNull(passwordEncoder.encode(createRequest.password()));
member.status = MemberStatus.PENDING;
member.detail = MemberDetail.create();
return member;
}
이게 가능한 원리는 이해를 했습니다만 AI와 이야기하다보니 아래와 같은 이유를 제시하면서 생성자를 통한 반환을 강력 추천하더라구요
부분 초기화 위험: 생성 직후 한동안 불완전 상태일 수 있어요. (중간에 예외가 나면 더더욱)
final 을 못 씀: 생성자 밖 대입이 필요하니 final로 못 고정합니다(불변성/스레드 가시성 이점 상실).
검증 누락 가능성: 검증/정규화가 흩어지기 쉬움 → 생성자 경로에 모으는 게 안전.
토비님 생각은 어떠하신지 궁금합니다.
답변 2
0
네. 보통은 생성자를 통해서 한번에 인스턴스를 만드는 것이 완결성이 있어서 좋다고 여겨집니다. 저도 동의하고요.
그런데 여기서 정적 팩토리 메소드를 사용하려고 했던 이유 중에는 생성자 파라미터가 길어지고 같은 타입의 파라미터가 연속으로 나올 때 순서가 잘못 되어서 버그가 생기는 문제를 피하기 위함도 있었습니다. 그런데 팩토리 메소드에서도 생성자를 호출하는 방식을 쓴다면 그 문제는 여전히 남아있겠죠.
그래서 여기서는 마치 빌더패턴을 사용하듯이 하나씩 프로퍼티를 설정하는 방식을 사용해봤습니다. 팩토리 메소드도 일종의 생성자라고 생각한다면 그 안에서 완결성을 가지는 오브젝트를 초기화하는 코드를 넣는 것도 나쁘지 않겠다고 생각합니다. 물론 저도 익숙한 방법은 아니긴합니다.
생성자를 private으로 만들고, 팩토리 메소드를 단일 오브젝트 생성 구조로 만드는 경우라면 이 안에서 초기화와 검증까지 모두 완료할 수 있습니다. 더더욱 필드 이름과 파라미터로 전달된 오브젝트에서 꺼내는 값의 이름을 일치시키면서 코딩을 할 수 있기 때문에 나중에 생성 시점에 전달할 파라미터가 변경되거나 순서가 바뀔 때 실수할 확률이 줄어듭니다.
final은 어짜피 JPA 엔티티이고 필드 액세스를 디폴트로 적용했기 때문에 쓸 수 없습니다. JPA 엔티티는 가변 객체로 선언해야 합니다.
사실 생성자를 써도 파라미터로 넘어온 값을 모두 필드에 할당하지 않을 수도 있습니다. 그러면 부분 초기화 문제가 발생하고요. 검증 누락도 마찬가지죠. 어디선가는 생성 로직을 완벽하게 구성해야 할 책임이 있습니다. 그걸 팩토리 메소드로 가져오는 것도 하나의 옵션으로 생각하시면 좋겠습니다. 물론 저도 생성자만 쓰기도 하고, 프로퍼티 갯수가 많지 않다면 생성자에 파라미터로 풀어서 전달하기도 합니다.
0
안녕하세요, 인프런 AI 인턴입니다. 마르크스님께서 올려주신 정적 팩토리 메서드에 관한 질문에 대해 답변드리겠습니다.
정적 팩토리 메서드를 사용할 때 주로 생성자를 사용하지 않고 객체를 생성할 수 있는 방법은 강력하고 유연한 디자인 패턴입니다. 특히 유연한 객체 생성, 가독성 있는 코드 그리고 명확한 메소드 명으로 인해 장점이 많습니다. 그러나 AI가 언급한 부분도 고려할 필요가 있습니다:
일부 속성이 초기화되지 않을 위험이 있습니다. 이는 예외가 발생할 경우 불안정한 객체 상태를 초래할 수 있으므로 방어적 코드 작성이 필요합니다. 이러한 점을 보완하기 위해서는 휴리스틱 체크 또는 초기화 중 필요한 검증 로직을 메서드 내에 포함하는 것이 좋습니다.
정적 팩토리 메서드가 값을 설정하는 방식으로 인해 불변성을 유지하기 어려울 수 있습니다. 따라서 가급적 불변 객체를 선호하는 환경에서는 생성을 비롯한 객체 불변성을 유지할 수 있는 다른 설계를 고려해볼 수 있습니다.
정적 팩토리 메서드는 생성자와 달리 여러 로직을 포함할 수 있기 때문에, 필요한 검증을 일관되게 적용해야 합니다. 생성자 내에 검증 로직을 위치시키면, 객체를 생성하는 모든 경로에서 동일한 검증을 자동으로 수행할 수 있습니다.
정적 팩토리 메서드는 구조적으로 더 유연할 수 있지만, 불변성을 비롯한 다양한 안정성을 확보하려면 적절한 방어적 프로그래밍이 필요합니다.
관련된 논의는 강의 내의 여러 사례를 통해 토비님의 의견을 확인할 수 있으며, 아래 링크들을 참고하시면 도움이 될 수 있습니다:
- 정적 팩토리 메서드의 장점과 단점
- 객체의 초기화와 불변성에 대한 고찰
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.