일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 폴더구조
- Navigation
- 오블완
- web view
- service 테스트
- 백준 1992
- 자료구조
- Project Bee
- 원복
- 해외 대외활동
- 비트마스킹
- 휴대폰 기기
- react
- springboot
- ReactNative
- 이영직
- 버튼 활성화
- 티스토리챌린지
- 노마드코더
- 완전탐색
- React Natvive
- React Native
- multipart upload
- bfs dfs
- 창의충전소
- BFS
- 상속 관계 매핑
- FlatList
- 구현
- 경우의 수
- Today
- Total
유미의 기록들
[최종 프로젝트] 생성자 대신 정적 팩토리 메서드 본문
💡 배경
public Party(String title, String contents, PartyStatus status, Category category, User user) {
this.title = title;
this.contents = contents;
this.status = status;
this.category = category;
this.user = user;
}
Party newParty=new Party(title,contents,status,category,user);
코드 리팩토링을 진행하면서 지금까지 객체를 인스턴스화 할 때 직접적으로 생성자를 호출하여 생성하였는데, 개발자가 구성한 별도의 `static` 메소드 를 통해 간접적으로 객체 생성을 유도하는 정적 팩토리 메서드 패턴을 추천하여 고려해보았다
📝 정적 팩토리 메서드 패턴 (Static Factory Method Pattern)
정적 팩토리 메서드 패턴은 팩토리 메서드, 추상 팩토리 패턴의 개념을 따와 단순하게 변형시킨 팩토리 변형 패턴 종류라고 볼 수 있다. 왜 더 복잡하게 정적 팩토리 메소드를 통해 객체를 생성해야 하는 지 의문이었는데 결론부터 말하자면, 생성자의 본질적인 문제점을 극복하고, 가독성이 좋으며, 객체 지향적인 프로그래밍을 하기 위해 사용한다고 한다
//정적 메서드 호출을 통해 인스턴스 생성
Person person1 = Person.nameOf("홍길동");
class Person{
private String name;
//생성자를 private화하여 외부에서 생성자 호출 차단
private Person(String name) {this.name=name;}
//정적 팩토리 메서드
public static Person nameOf(String name){
return new Person(name);
}
}
장점
1. 불필요한 객체 생성을 방지할 수 있다
메서드를 통해 한 단계 거쳐 정적 팩토리 메서드를 통해 생성하기 때문에 전반적인 객체 생성을 관리할 수 있다. 즉, 상황에 따라 항상 새로운 객체를 반환할 수 있고, singleton 디자인 패턴 처럼 하나의 객체만 반환하도록 하여 객체를 재사용할 수 있다
signleton 패턴
class Person {
private static Person person;
private Person() {}
// 정적 팩토리 메서드
public static Person getInstance() {
if (person == null) {
person = new Person();
}
return person;
}
}
생성자를 private으로 선언해 다른 곳에서 생성하지 못하도록 만들고, getInstance() 메소드를 통해 객체 인스턴스를 2개 이상 생성하지 못하도록 막는다
이렇게 인스턴스의 생성에 관여하여, 생성되는 인스턴스의 수를 통제할 수 있는 클래스를 인스턴스 통제 (instance-controlled) 클래스라고 한다
2. 객체 생성의 의미를 파악하기 쉽다
//기본 생성자
Person person = new Person("홍길동",25);
//정적 팩토리 메서드
Person person = Person.nameAgeOf("홍길동",25);
객체를 `new` 키워드를 통해 기본 생성자로 생성하면, 개발자는 해당 생성자의 인자 순서와 내부 값을 알고 있어야 하고, 반환될 객체의 특성을 파악하기 어려웠다
생성자 대신 정적 메소드를 통해 메서드 네이밍을 해주면 어떤 객체가 반환되는 지 의도를 쉽게 파악할 수 있어 코드의 가독성을 높여주게 된다
3. 객체 생성을 캡슐화 할 수 있다
생성자를 사용하면 외부에 내부 구현을 드러내야 하는데, 정적 팩토리 메서드는 구현부를 노출하지 않아서 캡슐화 및 정보 은닉이 가능하다
정적 팩토리 메서드 네이밍 규칙
정적 팩토리 메서드를 사용할 때, 독자적인 네이밍 컨벤션이 존재한다고 한다. 정적 팩토리 메서드에서의 네이밍은 거의 일종의 관례처럼 사용하기 때문에 각 네이밍의 역할에 대해 아는 것도 중요하다
- `from` : 하나의 매개변수를 받아서 객체 생성
- `of` : 여러 개의 매개변수를 받아서 객체 생성
- `getInstance` / `instance` : 인스턴스 생성 ( 이전에 생성한 동일한 인스턴스를 반환할 수 있음)
- `newInstance` : 항상 새로운 인스턴스 생성
- `get [OrderType]`: 다른 타입의 인스턴스 생성 ( 이전에 생성한 동일한 인스턴스를 반환할 수 있음)
- `new [OrderType]` : 항상 다른 타입의 새로운 인스턴스 생성
💻 적용
정적 팩토리 메서드를 활용하는 방식으로 전체 리팩토링을 하였다
Party newParty=Party.from(savePartyRequest, user);
//생성자를 private
private Party(String title, String contents, PartyStatus status, Category category, User user) {
this.title = title;
this.contents = contents;
this.status = status;
this.category = category;
this.user = user;
}
//정적 팩토리 메서드
public static Party from(SavePartyRequest request, User user) {
return new Party(
request.getTitle(),
request.getContents(),
request.getStatus(),
request.getCategory(),
user
'대외활동 기록 > 내일배움캠프' 카테고리의 다른 글
[최종 프로젝트] Reflection을 이용한 테스트 코드 (1) | 2024.11.10 |
---|---|
[최종 프로젝트] AWS Multipart Upload로 대용량 파일 업로드 (0) | 2024.11.09 |
[최종 프로젝트] Entity 계층 구조에 따른 상속 관계 매핑 (0) | 2024.11.07 |
[개인과제 - Spring 플러스] 레거시 코드 리팩토링 (0) | 2024.10.11 |
[개인과제 -Spring 숙련] 회원 CRUD API 구현 (Level 2) (0) | 2024.08.29 |