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

qpal1zm23님의 프로필 이미지

작성한 질문수

스프링 핵심 원리 - 고급편

정리

선생님 작성한 정적 팩토리 메서드에 대해 의견 주실 수 있으실까요??

작성

·

258

0

안녕하세요! 프로젝트와 관련해 코드를 작성하다 궁금한 점이 생겨 질문 드립니다..!

 

혹 선생님께서는 정적 팩토리 메소드의 역할이 어디까지라고 생각하실까요?

 

저는 팩토리 메소드이기 때문에 1. 단순히 파라미터를 받아 생성자를 통해 인스턴스를 생성하는 것 뿐만 아니라,

인스턴스를 생성하기 위해 2. 파라미터 valiation을 확인하고, 인스턴스 생성을 위한 데이터들을 가공하는 과정 또한 포함해도 괜찮은 것이 아닌가 하였는데,

저와 다른 의견 중에서는 팩토리 메소드는 가공이 전부 완료된 값을 단순히 받아서 인스턴스를 new 하기만 해야 한다는 의견이 있더라구요. 가공은 서비스 클래스에서 수행하구요!

 

예를 들면 아래와 같은 메소드가

validation과 데이터 가공을 처리하는 팩토리 메소드의 예시입니다 ::

public static SearchRequest from( AnotherRequest request) {
55
//AnotherRequest 클래스로부터 SearchRequest 클래스를 생성함.
        if(request.get고객리스트().size() > 9) {
56
//validation? 혹은 비즈니스 로직?
            throw new Exception();
57

        }
58
//아래부터 데이터 가공
        List<Passenger> 새로운 고객리스트 = request.get고객리스트().stream()
59

                                    .map(p -> new Passenger(p.get생일(), p.get성별()) )
60

                                    .collect(Collectors.toList());
61

62
//인스턴스 생성 후 return
        return new SearchRequest(새로운 고객리스트);
63

    }

 

 

  1. 또한 webClient를 이용해 외부로 API 요청을 보내고자 할 때, path 값을 관리하는 과정에서,

  1. 해당 path 값 ( ex. /a/b/xxx ) 을 반드시 webClient를 변수로 주입받아 실제 통신을 하는 class에서 가지고 있는 것과

     

  2. 혹은 통신 시 사용되는 request 데이터 dto 에서 그 변수 값을 가지고, 실제 통신을 하는 class에서는 request dto에서 getPath()를 통해 가져와 사용하는 것

어느 부분이 더 적절하다고 생각하실까요?

저는 2번의 경우 webClient를 사용하는 클래스에서 추가적으로 여러 개의 path에 대한 상수 변수를 가지고 있을 필요가 없고 getPath()라는 메소드를 통해서 request dto의 종류를 신경쓰지 않고 일관되게 가져올 수 있다는 점에서 2번이 더 괜찮다고 생각을 하였는데,

 

다른 의견에서는 패스 값은 통신에 사용되는 값이기 때문에 dto가 아닌 통신을 하는 클래스가 가져야 하는게 더 자연스럽다. 그래서 새 기능이 추가되었을 때 통신을 하는 클래스 ( webClient를 변수로 가진 ) 에 패스에 대한 상수변수를 추가하고 패스에 따른 통신 메서드를 추가하는 것이 더 낫다.

 

라는 의견이 있었습니다.

 

코드 스타일에 따라 정답은 없겠지만, OOP의 입장에서 선생님의 의견을 여쭙고자 합니다! 답변 해주시면 정말 감사하겠습니다!

답변 2

0

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. qpal1zm23님 🙂

죄송하지만 질문 안내에서 말씀드린 것처럼 강의 학습에 관련된 질문을 올려주시길 부탁드립니다.

저도 마음으로는 도움을 드리고 싶지만, 하루에도 수많은 분들이 질문을 올려주십니다. 그래서 강의 학습과 관련된 질문에 초점을 맞추는 것이 맞다 생각합니다. 다시한번 이해를 부탁드립니다.

0

안녕하세요, 인프런 AI 인턴입니다.

질문자님께서 정적 팩토리 메서드의 역할과 관련하여, 그리고 외부 API 통신의 경우 path 값을 어디서 관리하는 것이 적절한지에 대해 궁금해하시는 부분에 대해 답변드리겠습니다.

정적 팩토리 메서드는 객체 생성을 추상화하여 객체 생성 과정을 캡슐화하는 방법 중 하나입니다. 이 점에서, 객체 생성 로직 내에 파라미터 검증 및 데이터 가공 과정을 포함하는 것은 허용 범위 내에 있습니다. 특히 정적 팩토리 메서드는 단순히 객체를 생성하는 것뿐만 아니라, 해당 객체가 특정 조건을 만족하는 상태로 생성되도록 보장하는 역할을 할 수 있습니다. 따라서 validation이나 데이터 가공 등이 정적 팩토리 메서드 내에서 수행되는 것은 전혀 문제가 되지 않으며, 실제로 이러한 방식은 객체의 일관성과 무결성을 유지하는 데 도움을 줍니다.

또한, 외부 API 통신 시 path 값을 어디서 관리하는 것이 적절한지에 대해서는, 상황에 따라 차이가 있을 수 있습니다.
1. API 요청에 사용되는 path가 정적이며, 특정 통신 클래스에서만 사용된다면 해당 통신 클래스 내부에서 관리하는 것이 가독성과 관리 측면에서 유리할 수 있습니다.
2. 반면, 다양한 요청 데이터 DTO를 통해 요청 경로(path)를 동적으로 구성해야 하는 경우나, 통신 클래스에서 요청 DTO의 타입에 따라 요청 경로를 유동적으로 변경해야 하는 경우에는 요청 DTO 내부에서 해당 경로를 관리하는 것이 유연할 수 있습니다.

선택한 설계가 OOP 원칙에 부합하는지, 또는 설계의 직관성과 유지 보수성을 어떻게 해칠 수 있는지를 고려해보는 것이 중요합니다. 객체지향 설계 원칙 중 하나인 단일 책임 원칙(SRP)을 기준으로 통신과 관련된 로직과 데이터를 어떻게 분리할지, 그리고 각 객체의 역할과 책임이 명확한지를 판단하는 것이 좋습니다.

질문하신 내용에 대한 구체적인 질문들과 유사한 주제에 대해 김영한 강사님이 순순히 제공한 답변이 있다면 인프런의 해당 강의에서 찾아보실 것을 권장드립니다. 예를 들어, “생성 메서드 setter 질문”에서는 엔티티 생성 시 사용하는 다양한 패턴(생성자, 정적 팩토리 메서드, Builder 패턴 등)에 대해 설명하고 있습니다.

마찬가지로, “정적 팩토리 메소드 질문있습니다.”에서도 정적 팩토리 메서드의 예와 그 차별점에 대한 설명이 제공되고 있습니다.

프로젝트에 적용할 디자인 패턴이나 설계 방식을 결정할 때는 각 방법의 장점과 단점을 고려하고, 프로젝트의 특성과 요구사항에 가장 적합한 방법을 선택하는 것이 중요합니다. 이러한 결정 과정에서 강의 내용이나 여러 설계 원칙을 참고하시면 좋을 것 같습니다.

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