어찌저찌 돌아가는 서비스를 만들었으나 이대로 둔다면 나중에 이 서비스를 유지보수 할 누군가에게 칼침을 당할 수도 있다.
칼침을 맞지 않기 위해 확장성이 좋도록 빠르게 수정하며 알게된 것에 대한 정리 기록.
예전처럼 공들여 글 쓸 시간이 없기 때문에 간단히 샤샥 쓰겠음
1️⃣ Factory Method Pattern
: Factory Pattern의 확장 패턴
: 객체를 만들어 내는 부분을 서브 클래스에게 위임하는 패턴
→ New 키워드를 호출하는 부분을 서브 클래스에게 위임함
: 추상화 기법을 사용하여 패턴을 확장하여 실제 내용이 구현되지 않은 상태에도 미리 메서드를 호출하여 사용할 수 있다는 장점이 있음
: 추상화를 통해 하위 클래스에 다형성을 부여하기 때문에 코드간의 결합도를 낮추고 유연성있는 코드 작성이 가능함
2️⃣ 왜 썼나요?
: 내가 구현한 서비스는 특정 구분값(ObjectA, ObjectB)에 따라 properties를 생성하여 빌드 옵션으로 하나의 모듈에서
여러 오브젝트를 핸들링하는 서비스를 실행 시킬 수 있도록 구현하였음
( Object.jar 파일로 ObjectA, ObjectB를 핸들링 하는 서비스를 실행 시킬 수 있도록)
: 각 오브젝트가 파싱하는 데이터 포맷이 다르기 때문에 파싱하는 메서드를 다르게 구현해야하는데, 지금은 처리해야할
대상 오브젝트가 2개밖에 없어서 분기처리(If-else)를 통한 구현을 하였지만 10개-100개-1000개 몇개로 늘어날지는 모르는 상황
→ 10개의 오브젝트가 있을때 if-else로 처리한다면 ,, 나중에 100개가 되었을때 감당할 수 없어져벌임
: 어떤 상황에 따라 생성해야하는 객체가 다를때, 해당 객체를 생성하는 객체와 생성되는 객체간의 결합도를 낮추어서 코드를 유연하게 하기
위해 수정이 필요함
3️⃣ 어떻게 쓰나요?
아래와 같이 만들어서 사용할 수 있음
- Type을 정의할 Enum Class
- 팩토리
- 팩토리 메서드를 가지고 있는 interface
- 구현체
/* 1. Factory 생성 */
@Component
public class ParserFactory {
private final Map<TestType, EventParser> typeMap = new HashMap<>();
public logParserFactory(List<EventParser> eventParsers){
eventParsers.forEach(s -> typeMap.put(s.getContractType() , s));
}
public EventParser getEventParser(TestType type){
return typeMap.get(type);
}
}
/* 2. Interface 생성 */
public interface EventParser {
void parser(RequestDTO requestDto) throws IOException;
testType getTestType();
}
/* 3. 구현체 생성 */
/* 서비스일 경우 Component 어노테이션 대신 Service 어노테이션을 사용해도 됨 */
@Component
public class ObjectAEventParser implements EventParser {
@Override
public void parser(RequestDTO requestDto) throws IOException {
/* 구현부 작성 */
return responseDTO;
}
@Override
public testType getContractType() {
return testType.objectA;
}
}
/* 4. 호출 */
/* testName에 ObjectA, Object B값을 넣으면 됨 */
ParserFactory.getEventParser(testType.valueOf(testName)).parsingData(requestDTO);
'✏️ Java' 카테고리의 다른 글
|Radis| Radis Cache ❓ (0) | 2023.01.04 |
---|---|
| ES | Elasticsearch가 뭔데! (0) | 2023.01.04 |
| ETC | ISP (인터페이스 분리 원칙) 뭔데! (0) | 2022.12.20 |
| ETC | 추상클래스와 인터페이스가 뭔데 🥺 (0) | 2022.12.17 |
| ETC | 상속과 인터페이스 (0) | 2022.12.13 |