작성
·
242
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
}
또한 webClient를 이용해 외부로 API 요청을 보내고자 할 때, path 값을 관리하는 과정에서,
해당 path 값 ( ex. /a/b/xxx ) 을 반드시 webClient를 변수로 주입받아 실제 통신을 하는 class에서 가지고 있는 것과
혹은 통신 시 사용되는 request 데이터 dto 에서 그 변수 값을 가지고, 실제 통신을 하는 class에서는 request dto에서 getPath()를 통해 가져와 사용하는 것
어느 부분이 더 적절하다고 생각하실까요?
저는 2번의 경우 webClient를 사용하는 클래스에서 추가적으로 여러 개의 path에 대한 상수 변수를 가지고 있을 필요가 없고 getPath()라는 메소드를 통해서 request dto의 종류를 신경쓰지 않고 일관되게 가져올 수 있다는 점에서 2번이 더 괜찮다고 생각을 하였는데,
다른 의견에서는 패스 값은 통신에 사용되는 값이기 때문에 dto가 아닌 통신을 하는 클래스가 가져야 하는게 더 자연스럽다. 그래서 새 기능이 추가되었을 때 통신을 하는 클래스 ( webClient를 변수로 가진 ) 에 패스에 대한 상수변수를 추가하고 패스에 따른 통신 메서드를 추가하는 것이 더 낫다.
라는 의견이 있었습니다.
코드 스타일에 따라 정답은 없겠지만, OOP의 입장에서 선생님의 의견을 여쭙고자 합니다! 답변 해주시면 정말 감사하겠습니다!
답변 2
0
제 생각에 "정적 팩토리 메서드"에 정해진 역할이라는 건 없습니다. "정적 팩토리 메서드"라는 건 기술이지 어떤 비즈니스 로직이나 도메인의 구성 요소가 아닙니다. 가공 로직과 인스턴스 생성로직을 한 곳에 둘지 분리 할지는 가공 로직을 다른 곳에서도 사용을 하는지 안 하는지에 따라 결정할 수 있겠네요. 다른 곳에서 사용하는 로직이라면 따로 분리해서 재사용성을 높여야 겠죠.
2번에 대해서는 제가 구체적인 코드를 보고 말씀드리는게 아니라서 답변 드리기가 어렵네요. URL이 왜 해당 클래스의 변수로 존재해야 하는지, 또는 왜 DTO에 담겨서 전달되어야 하는지 보다 반대로 그렇게 안하고 요청 보는 메서드 안에 변수로 선언해두면 무슨 문제가 있을지부터 논의를 해볼 것 같네요.
0
안녕하세요, 인프런 AI 인턴입니다.
qpal1zm23님의 질문에 대해 답변드리검니다.
정적 팩토리 메소드의 역할에 대해 말씀드리면, 정적 팩토리 메소드는 인스턴스 생성 뿐만 아니라 타입 추론, 입력 값에 따른 다양한 클래스의 객체 반환, 싱글턴 패턴 구현 등 다양한 기능을 수행할 수 있습니다. 따라서 파라미터 검증과 데이터 가공을 포함하는 것 역시 정적 팩토리 메소드의 책임 범위 내에 있다고 볼 수 있습니다. 물론 이러한 로직의 복잡성이 증가한다면 별도의 검증 로직이나 데이터 변환 로직을 구현하여 관심사를 분리할 수도 있습니다.
WebClient를 이용한 API 요청과 관련하여 path 값을 관리하는 방법에 대해서는, 사용하시는 구조와 유지 보수성, 그리고 팀 내의 코드 스타일 가이드에 따라 달라질 수 있습니다. DTO 내에 경로를 관리하는 방식은 DTO가 통신 구조에 대해 알게 됨으로써 생기는 결합을 유의해야 합니다. 반면, 통신하는 클래스가 경로를 관리한다면 통신에 필요한 정보가 한 곳에 집중되어 있어 관리 측면에서는 이점이 있을 수 있습니다. OOP의 관점에서는 객체가 자신의 데이터와 관련된 행위를 캡슐화하는 것이 중요합니다. 따라서 통신 경로는 통신을 담당하는 클래스에서 관리하는 것이 적절할 수 있으나, 이는 팀의 상황과 유지 보수의 용이성을 고려하여 결정하는 것이 좋습니다.
각 방법의 장단점을 충분히 이해하고 프로젝트의 구조, 팀의 작업 방식, 유지 보수성 등을 고려하여 결정하는 것이 중요합니다.