You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
logic1()과 logic2()는 시간을 측정하는 부분과 비즈니스 로직을 실행하는 부분이 함께 존재
변하는 부분: 비즈니스 로직
변하지 않는 부분: 시간 측정
템플릿 메서드 패턴 - 예제2
AbstractTemplate
packagehello.advanced.trace.template.code;
importlombok.extern.slf4j.Slf4j;
@Slf4j/*** abstract(추상 클래스란)* 직접 객체를 만들 수 없는 클래스* 공통된 기능은 제공, 일부 기능은 자식 클래스에서 직접 구현해야 함* abstract method(추상 메서드란?)* 내용이 없는 메서드* 자식 클래스에서 반드시 오버라이딩(재정의)해야 함* 공통된 부분은 부모가 달리지는 부분은 자식*/publicabstractclassAbstractTemplate {
publicvoidexecute() {
longstartTime = System.currentTimeMillis();
//비즈니스 로직 실행call(); // 자식 클래스가 구현해야 하는 부분//비즈니스 로직 종료longendTime = System.currentTimeMillis();
longresultTime = endTime - startTime;
log.info("resultTime={}", resultTime);
}
protectedabstractvoidcall(); // 자식이 반드시 구현해야 하는 메서드
}
템플릿 메서드 패턴: 템플릿을 사용하는 방식, 템플릿은 기준이 되는 거대한 틀
템플릿이라는 틀에 변하지 않는 부분을 몰아두고, 일부 변하는 부분을 별로 호출해서 해결
SubClassLogic1
변하는 부분인 비즈니스 로직 1,2을 처리하는 자식 클래스, 템플릿이 호출하는 대상인 call() 메서드를 오버라이딩 함
AbstractTemplate 코드를 보면, 변하지 않는 부분인 시간 측정 로직을 몰아둔 것을 확인, 이것이 이제 하나의 템플릿
그리고 템플릿 안에서 변하는 부분은 call() 메서드를 호출해서 처리
템플릿 메서드 패턴은 부모 클래스에 변하지 않는 템플릿 코드를 두고 변하는 부분은 자식 클래스에 두고 상속과 오버라이딩을 통해 처리함
OrderServiceV4: 핵심 기능과 템플릿을 호출하는 코드가 섞임, V4는 템플릿 메서드 패턴을 사용한 덕분에 핵심 기능에 좀 더 집중할 수 있음
좋은 설계란?
진정한 좋은 설계는 바로 변경이 일어날 때 자연스럽게 드러남
로그를 남기는 부분을 모아서 하나로 모듈화하고, 비즈니스 로직 부분을 분리했음
만약 로그를 남기는 로직을 변경해야 한다고 생각해보면, AbstractTemplate 코드를 변경해야 한다고 가정해 보면, 단순히 AbstractTemplate 코드만 변경하면 됨
템플릿이 없는 V3 상태에서 로그를 남기는 로직을 변경해야 한다고 생각해보자. 이 경우 모든 클래스를 다 찾아서 고쳐야 함, 클래스가 수백 개라면 생각만해도 끔찍
단일 책임 원칙(SRP)
V4는 단순히 템플릿 메서드 패턴을 적용해서 소스코드 몇줄을 줄인 것이 전부가 아님
로그를 남기는 부분에 단일 책임 원칙을 지킴, 변경 지점을 하나로 모아서 변경에 쉽게 대처할 수 있는 구조를 만듦
###템플릿 메서드 패턴 - 정의
작업에서 알고리즘의 골격을 정의하고 일부 단계를 하위 클래스로 연기
템플릿 메서드를 사용하면 하위 클래스가 알고리즘의 구조를 변경하지 않고 알고리즘의 특정 단계를 재정의할 수 있음
풀어서 설명하면 부모 클래스에 알고리즘의 골격인 템플릿을 정의하고, 일부 변경되는 로직은 자식 클래스에 정의하는 것, 이렇게 하면 자식 클래스가 알고리즘의 전체 구조를 변경하지 않고, 특정 부분만 재정의 가능, 결국 상속과 오버라이딩을 통한 다형성으로 문제를 해결하는 것
하지만
템플릿 메서드 패턴은 상속을 사용, 상속에서 오는 단점들을 그대로 안고 감, 특히 자식 클래스가 부모 클래스와 컴파일 시점에 강하게 결합되는 문제가 있음, 의존관계에 대한 문제, 자식 클래스 입장에서는 부모 클래스의 기능을 전혀 사용하지 않음
이번 장에서 지금까지 작성했던 코드를 떠올리면, 자식 클래스를 작성할 때 부모 클래스의 기능을 사용한 것이 있었던가? 그럼에도 불구하고 템플릿 메서드 패턴을 위해 자식 클래스는 부모 클래스를 상속 받음
상속을 받는다는 것은 특정 부모 클래스를 의존하고 있다는 것, 자식 클래스의 extends 다음에 바로 부모 클래스가 코드상에 지정되어 있음, 따라서 부모 클래스가 기능을 사용하든 사용하지 않든 간에 부모 클래스를 강하게 의존하게 됨, 여기서 강하게 의존한다는 뜻은 자식 클래스의 코드에 부모 클래스의 코드가 명확하게 적혀 있다는 뜻, 자식 -> 부모 의존관계 반영
자식 클래스 입장에서는 부모 클래스의 기능을 전혀 사용하지 않는데, 부모 클래스를 알아야 함 이것은 좋은 설계가 아님, 그리고 이런 잘못된 의존관계 때문에 부모 클래스를 수정하면, 자식 클래스에도 영향 줌
추가로 템플릿 메서드 패턴은 상속 구조를 사용하기 때문에, 별도의 클래스나 익명 내부 클래스를 만들어야 하는 부분도 복잡 지금까지 설명한 이런 부분들을 더 깔끔하게 개선하려면 어떻게 해야할까? 템플릿 메서드 패턴과 비슷한 역할을 하면서 상속의 단점을 제거할 수 있는 디자인 패턴이 바로 전략 패턴(Strategy
Pattern)
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
템프릿 메서드 패턴 - 시작
로그 추적기 도입 전 - V0코드
로그 추적기 도입 후 - V3 코드
핵심 기능 vs 부가 기능
동일한 패턴이 보임
템플릿 메서드 패턴 - 예제1
TemplateMethodTest
템플릿 메서드 패턴 - 예제2
AbstractTemplate
SubClassLogic1
SubClassLogic2
TemplateMethodTest - templateMethodV1() 추가
실행 결과
템플릿 메서드 패턴은 이렇게 다형성을 사요으 변하는 부분과 변하지 않는 부분을 분리하는 방법
###템플릿 메서드 패턴 - 예제3
TemplateMethodTest - templateMethodV2() 추가
TemplateMethodTest$2 확인 가능
###템플릿 메서드 패턴 - 적용1
AbstractTemplate
템플릿 메서드 패턴 - 적용2
지금까지 작성한 코드 비교
좋은 설계란?
단일 책임 원칙(SRP)
###템플릿 메서드 패턴 - 정의
하지만
템플릿 메서드 패턴은 상속을 사용, 상속에서 오는 단점들을 그대로 안고 감, 특히 자식 클래스가 부모 클래스와 컴파일 시점에 강하게 결합되는 문제가 있음, 의존관계에 대한 문제, 자식 클래스 입장에서는 부모 클래스의 기능을 전혀 사용하지 않음
이번 장에서 지금까지 작성했던 코드를 떠올리면, 자식 클래스를 작성할 때 부모 클래스의 기능을 사용한 것이 있었던가? 그럼에도 불구하고 템플릿 메서드 패턴을 위해 자식 클래스는 부모 클래스를 상속 받음
상속을 받는다는 것은 특정 부모 클래스를 의존하고 있다는 것, 자식 클래스의 extends 다음에 바로 부모 클래스가 코드상에 지정되어 있음, 따라서 부모 클래스가 기능을 사용하든 사용하지 않든 간에 부모 클래스를 강하게 의존하게 됨, 여기서 강하게 의존한다는 뜻은 자식 클래스의 코드에 부모 클래스의 코드가 명확하게 적혀 있다는 뜻, 자식 -> 부모 의존관계 반영
자식 클래스 입장에서는 부모 클래스의 기능을 전혀 사용하지 않는데, 부모 클래스를 알아야 함 이것은 좋은 설계가 아님, 그리고 이런 잘못된 의존관계 때문에 부모 클래스를 수정하면, 자식 클래스에도 영향 줌
추가로 템플릿 메서드 패턴은 상속 구조를 사용하기 때문에, 별도의 클래스나 익명 내부 클래스를 만들어야 하는 부분도 복잡 지금까지 설명한 이런 부분들을 더 깔끔하게 개선하려면 어떻게 해야할까? 템플릿 메서드 패턴과 비슷한 역할을 하면서 상속의 단점을 제거할 수 있는 디자인 패턴이 바로 전략 패턴(Strategy
Pattern)
All reactions