spring boot - 템플릿

원종서·2021년 12월 28일
0

spring

목록 보기
8/12

3.1.1 예외처리 기능을 갖춘 DAO

기존 DAO코드에서 Try / catch / finally 구문을 추가해 주었다.
하지만 메소드에 트라이 케치 구문이 여기저기 있는 것이 별로이다. 매번 하기 귀찮고, 복붙 하기에는 실수를 무시하지 않을 수 없다.

이러다가는 DB풀의 리소스가 고갈되고 말 것이다.

그렇다면 복붙을 하고 테스트 코드로 복붙으로 실수 한것을 테스트로 찾아내는것은 어떨까? 라는 질문에는 이렇게 답할 수 있다.
예외상황을 처리하는 코드는 테스트하기 어렵다. 테스트 할 바에는 코드 한줄한줄을 살펴보는 것이 나을 수도 있다.

그래서 이보다 효과적인 방법이 변하지 않는, 그러나 많은 곳에서 중복되는 코드와 로직에 따라 자꾸 확장되고 자주 변화는 코드를 잘 분리하는 작업이다.

3.2.2 분리와 재사용을 위한 디자인 패턴

탬플릿 메소드 패턴의 적용

변하지 않는 부분은 슈퍼클래스에 두고 변하는 부분은 서브 클레스에서 정의한다.
하지만 탬플릿 메소드 패턴도 문제가 많다. 가장 큰 문제는 DAO 로직마다 상속을 통해 새로운 클래스를 만들어야 한다는 점이다.
또 확장 구조가 이미 클래스를 설계하는 시점에서 고정되어 버렸기 때문에 유연성이 떨어진다.

전략 패턴의 적용

개방 폐쇄 원칙을 잘 지키는 구조이면서 템플릿 메소드 패턴보다 유연하고 확장성이 뛰어난 것이, 오브젝트를 둘로 분리하고 클래스 레벨에서는 인터페이스를 통해서만 의존하도록 만드는 절략이 전략 패턴이다.

변하지 않는곳이 컨텍스트, 변하는 곳이 전략이다.

Di적용을 위한 클라이언트/ 컨텍스트 분리

3.5 템플릿과 콜백

전략 패턴의 기본 구조에 익명 내부 클래스를 활요하는 방식을 템플릿/콜백 패턴이라고 한다.

전략 패턴의 컨텍스트를 템플릿이라고 부르고, 익명 내부 클래스로 만들어지는 오브젝트를 콜백 이라고 부른다.

콜백: 실행되는 것을 목적으로 다른 오브젝트의 메소드에 전달되는 오브젝트를 말한다.
파라미터로 전달되지만 값을 참조하기 위한 것이 아니라, 특정 로직을 담은 메소드를 실행시키기 위해 사용됨. 메소드 자체를 넘겨줄 수 없기 때문에 메소드를 갖은 객체를 넘겨줌
이 객체를 펑셔널 오브젝트라고도 한다.

3.5.1 템플릿/콜백 원리

템플릿 : 전략 패턴의 컨텍스트
콜백 : 익명 내부 클래스,
고정된 작업 흐름을 가진 코드를 재사용한다는 의미인 템플렛 안에서 호출되는 것을 목적으로 만들어진 오브젝트

메소드 단위에서 DI가 일어난다

템플릿/콜백 특징

콜백은 보통 단일 메소드 인터페이스 사용.

콜백 인터페이스의 메서드에는 보통 파라미터가 있다.
이 파라티너는 템플릿의 작업 흐름 중에 만들어지는 컨텍스트 정보를 전달받을 떄 사용된다.

  • 클라이언트의 역활은 템플릿 안에서 실행될 로직을 담은 콜백 오브젝트를 만들고, 콜백이 참조할 정보를 제공하는 것이다. 만들어진 콜백은 클라이언트가 템플릿 메소드를 호출할 때 파라미터로 전달된다.

  • 템플릿은 정해진 작업 따라 진행하다가 내부에서 생성된 참조정보를 가지고 콜백 오브젝트의 메소드를 호출한다.
    콜백은 클라이언트 메소드에 있는 정보와 템프릿이 제공한 참조정보를 이용해 작업을 수행하고 다시 템플릿에게 돌려준다.

템플릿에 담을 반복적인 작업 흐름이 뭐지?
템플릿이 콜백에게 전달해줄 내부정보는 뭐지 ?
콜백이 템플릿에게 돌려줄 내용은 뭐지 ?
템플릿이 작업을 마친 후 클라이언트에게 전달해줘야하는 값이 뭦 ?

템플릿/콜백을 적용할때는 템플릿과 콜백의 경게를 정하고, 템플릿이 콜백에게 콜백이 템플릿에게 전달해야하는 내용이 무엇인지 파악해야한다.

템플릿이 파일을 열고 각 라인을 읽어 올 수 있는 BufferedReader를 전달해주고, 콜백은 각 라인을 읽어 연산을 한 후에 최종 연산결과를 템플릿에게 전달해주는 것이다.

0개의 댓글