본문 바로가기

Spring

2. 토비 Chapter 4.템플릿 내용 정리

템플릿 : 일정한 패턴으로 유지되는 특성을 가진 부분을 자유롭게 변경되는 성질을 가진 부분으로부터 독립시켜서 효과적으로 활용할 수 있도록 하는 방법

  • 변하지 않는 부분은 슈퍼 클래스에 두고 변하는 부분은 추상 메소드로 정의해둬서서브클래스에서 오버라이드하여 새롭게 정의해 쓰도록 하는 것

풀(Pool) 방식 : 미리 정해진 풀 안에 제한된 수의 리소스를 만들어 두고 필요할 때 이를 할당하고, 반환하면 다시 풀에 넣는 방식

템플릿 메소드 패턴으로의 접근 제한

  • DAO 로직마다 상속을 통해 새로운 클래스를 만들어야 한다는 점
  • 확장구조가 이미 클래스를 설계하는 시점에서 고정되어 버린다는 점

전략패턴 :OCP관점에 보면 확장에 해당하는 변하는 부분을 별도의 클래스로 만들어 추상화된 인터페이스를 통해 위임하는 방식

중첩 클래스의 종류

  • 중첩 클래스 : 다른 클래스 내부에 정의되는 클래스를 중첩 클래스(nested class)라고 한다.
  • Static class : 독립적으로 오브젝트로 만들어질 수 있다.
  • Inner class : 자신이 정의된 클래스의 오브젝트 안에서만 만들어질 수 있다.-멤버 필드처럼 오브젝트

내부(Inner)클래스의 3가지종류

  • 멤버 필드처럼 오브젝트 레벨에 정의되는 멤버 내부 클래스(member inner class)
  • 메소드 레벨에 정의되는 로컬클래스(local class) : 같은 클래스 내에 생성을 하다보니자신이 선언된 곳의 정보에 접근할 수 있다. 그리고 생성로직을함께 볼 수 있어 코드 이해가 쉽다.
  • 이름을 갖지 않는 익명 내부 클래스(anonymous inner class) : 클래스 선언과 오브젝트 생성이 결합된 형태로 만들어지며, 상속할 클래스나 구현할 인터페이스를 생성자 대신 사용해서 new 인터페이스 이름(){ 클래스 본문 }; 과 같은 형태로 만들어 사용한다. 클래스를 재사용할 필요가 없고, 구현한 인터페이스 타입으로만 사용할 경우에 유용

클래스를 DI에 적용하는 두가지 방법

  • 인터페이스를 사용하지 않고 주입하기→ DI의 근본적인 원칙에 부합하지 않는 구체적인 클래스와의 관계가 설정에 직접 노출되는 단점이 있다.
  • → 인터페이스를 사용하지 않는 클래스와의 의존 관계이지만 스프링의 DI를 이용하기 위해 빈으로 등록해서 사용하는 방법은 오브젝트 사이의 실제 의존관계가 설정파일에 명확하게 들어난다.
  • DAO 코드를 이용한 수동으로 DI→ 그러나 JdbcContext를 여러 오브젝트가 사용하더라도 싱글톤으로 만들 수 없고, DI 작업을 위한 부가적인 코드가 필요하다는 단점 존재
  • → JdbcContext가 UserDao의 내부에서 만들어지고 사용되면서 그 관계를 외부에 들어내지 않는다.

콜백(Callback) : 실행되는 것을 목적으로 다른 오브젝트의 메소드에 전달되는 오브젝트를 말한다.

  • 템플릿 안에서 호출되는 것을 목적으로 만들어진 오브젝트를 뜻함
  • 파라미터로 전달되지만 값을 참조하기 위한 것이 아니라 특정 로직을 담은 메소들르 실행시키기 위해 사용
  • 자바에서는 메소드 자체를 파라미터로 전달할 방법은 없기 때문에 메소드가 담긴 오브젝트를 전달해야함
  • 그래서 Functional Object라고도 한다.

템플릿/ 콜백의 특징

  • 전략 패턴의 기본 구조에 익명 내부 클래스를 활용한 방식
  • → 일부분만 자주 바꿔서 활용해야하는 경우 적합
  • 단일 메소드의 인터페이스를 사용
  • → 템플릿의 작업 흐름 중 특정 기능을 위해 한번 사용하는 경우가 일반적이기 때문
  • 매번 메소드 단위로 사용할 오브젝트를 새롭게 전달받는다.
  • 콜백 오브젝트가 내부 클래스이기 때문에 자신을 생성한 클라이언트 메소드 내의 정보를 직접 참조
  • 클라이언트와 콜백이 강하게 결합되어 있다.

정리

  • JDBC와 같은 예외가 발생할 가능성이 있으며 공유 리소스의 반환이 필요한 코드는 반드시 try/catch/final 블록으로 관리해야 한다.
  • 일정한 작업 흐름이 반복되면서 그중 일부 기능만 바뀌는 코드가 존재한다면 전략 패턴을 적용한다. 바뀌지 않는 부분은 컨텍스트로, 바뀌는 부분은 전략으로 만들고 인터페이스를 통해 유연하게 전략을 변경할 수 있도록 구성한다.
  • 같은 애플리케이션 안에서 여러가지 종류의 전략을 다이내믹하게 구성하고 사용해야 한다면 컨텍스트를이용하는 클라이언트 메소드에서 직접 전략을 정의하고 제공하게 만든다.
  • 클라이언트 메소드 안에 익명 내부 클래스를 사용해서 전략 오브젝트를 구현하면 코드도 간결해지고 메소드의 정보를 직접 사용할 수 있어 편리하다.
  • 컨텍스트가 하나 이상의 클라이언트 오브젝트에서 사용된다면 클래스를 분리해서 공유하도록 만든다.
  • 컨텍스트는 별도의 빈으로 등록해서 DI받거나 클라이언트 클래스에서 직접 생성해서 사용한다. 클래스 내부에서 컨텍스트를 사용할 때 컨텍스트가 의존하는 외부의 오브젝트가 있다면 코드를 이용해서 직접 DI 해줄 수 있다.
  • 단일 전략 메소드를 갖는 전략 패턴이면서 익명 내부 클래스를 사용해서 매번 전략을 새로 만들어 사용하고, 컨텍스트 호출과 동시에 전략 DI를 수행하는 방식을 템플릿/콜백 패턴이라고 한다.
  • 콜백의 코드에도 일정한 패턴이 반복된다면 콜백을 템플릿에 넣고 재활용하는 것이 편리하다.
  • 템플릿과 콜백의 타입이 다양하게 바뀔 수 있다면 제네릭스를 이용한다.
  • 스프링은 JDBC 코드 작성을 위해 JdbcTemplate을 기반으로 하는 다양한 템플릿과 콜백을 제공한다.
  • 템플릿은 한번에 하나 이상의 콜백을 사용할 수도 있고, 하나의 콜백을 여러번 호출할 수 있다.
  • 템플릿/콜백을 설계할 때는 템플릿과 콜백 사이에 주고받는 정보에 관심을 두어야 한다.템플릿 : 일정한 패턴으로 유지되는 특성을 가진 부분을 자유롭게 변경되는 성질을 가진 부분으로부터 독립시켜서 효과적으로 활용할 수 있도록 하는 방법

'Spring' 카테고리의 다른 글

6. 스프링 Servlet  (0) 2022.07.02
5. 스프링 AOP  (0) 2022.06.28
4. 람다함수의 개념 이해하기 + 스트림  (0) 2022.01.25
3. 템플릿 메소드 패턴 VS 전략패턴  (0) 2022.01.12
1. Spring annotation  (0) 2021.12.30