Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
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
Archives
Today
Total
관리 메뉴

yongsa0221의 고물상

little-writer-v2 전략패턴 사용하기 본문

프로젝트/리팩터링

little-writer-v2 전략패턴 사용하기

yongsa0221 2024. 9. 20. 01:07

기존의 방식
수정한 방식

 

기존의 Ai 관련 도메인을 전략패턴을 사용하여 수정하였다.

AiModelBehavior라는 인터페이스를 통해 생성형 Ai를 통해 어떤 것을 생성할지 동작을 구현하는 부분을 분리하였다.

외부 생성형 Ai api를 직접적으로 호출하는 부분을 오롯이 AiModelBehavior의 구현체를 통해서 구현하도록 수정하였다.

이를 통해서 생성형 Ai를 사용하는 부분을 최대한 다른 도메인과 구분하여 관리하고자 한다.

 

왜 전략패턴인가?

생성형 Ai가 프로그램 내에서 특정한 클래스로써 존재 할 수 있게 하는 속성은 “어떤 입력을 통해 어떤 출력을 생성하는가” 라고 생각한다.

삽화 생성기는 사용자 텍스트와 사전설정된 프롬프트를 통해 특정 화풍의 이미지를 생성한다.

전략 패턴을 사용함으로서 이러한 Ai에게 사전 설정값과 출력 타입을 설정하는 부분을 캡슐화하였다.

 

public abstract class Ai<I extends AiInput, R extends AiResponse> {
    protected AiModelBehavior<I, R> aiModelBehavior;

    protected Ai(AiModelBehavior<I, R> aiModelBehavior) {
        this.aiModelBehavior = aiModelBehavior;
    }

    public R getResponseFrom(I aiInput) throws AiException {
        return aiModelBehavior.getResponseFrom(aiInput);
    }
}

 

@FunctionalInterface
public interface AiModelBehavior <I extends AiInput, R extends AiResponse>{
    R getResponseFrom(I aiInput) throws AiException;
}

 

의문점들…

AiModelBehavior를 함수형 인터페이스로 만든건 좋은데 어떻게 활용할 수 있을지 잘 모르겠다.

테스트 과정에서 modelbehavior를 주입하는 과정도 mockito를 통해 구현할 수 있고 실제 서비스 코드에서는 modelbehavior들도 다 빈으로 등록되어 관리되니까 이점을 잘 모르겠다. 람다식을 통해 그때그때 편하게 동작을 주입하는 일이 있을까?

Ai클래스의 기능도 아직 modelbehavior빼면 별로 기능도 없어서,,,