Dev-Kyuu

어찌저찌 돌아가는 서비스를 만들었으나 이대로 둔다면 나중에 이 서비스를 유지보수 할 누군가에게 칼침을 당할 수도 있다.

칼침을 맞지 않기 위해 확장성이 좋도록 빠르게 수정하며 알게된 것에 대한 정리 기록.

예전처럼 공들여 글 쓸 시간이 없기 때문에 간단히 샤샥 쓰겠음

 

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);

 

profile

Dev-Kyuu

@kyuu_ng

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!