토비의 스프링 Ver4

존스노우·2021년 11월 15일
0

템플릿

개방폐쇠의 원칙 다시한번.

코드에서 어떤 부분을 변경을통해 기능이 다양해지고, 어떤 부분은 고정되어 변하지 않는 성질이 있음
변화의 특성이 다른 부분을 구분해주고 각각 다른 목적과
다른 이유에 의해 다른 시점에서 독립적으로 변경될 수 있는 효율적구조

하지만

템플릿은 변경이 거의 일어나지 않는다.
일정한 패턴으로 유지되는 특성을 가진 부분을 자유롭게 변경되는 성질을 가진부분으로 독립하고
효과적으로 활용할 수 있다.

다시보는 초난감 DAO

예외처리 기능을 갖춘 DAO

Connection / PreparedStatement 리소스를 가져와서 사용

하지만 예외가 발생하면?

####JDBC 조회 기능의 예외처리

변하는 것과 변하지 않는것

JDBC try/catch/finally 코드의 문제점

위에 코드는 너무 중복코드에 복잡함..

개방폐쇠의 원칙을 적용?

하지만 조금 다르게 접근...

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

변하지않는 부분을 변하는 부분과 분리해보자..

메소드 추출

변하는 부분 메소드 추출 첫번째.

뭔가 이상해 짐 다시..!

템플릿 메소드 패턴의 적용

상속을 통해 기능을 확장!

변하지 않는 부분을 슈퍼클래스로

변하는 부분은 추상 메소드로.

템플릿 메소드 패턴의 상속을 통한 단점이 고스란히 드러남

전략 패턴의 적용

deleteAll() 메소드에서 변하지않는 부분이 contextMethod()

두번째 작업이 외부기능이 바로 전략패턴에서 말하는 전략.

문제 DeleteAllStatement를 직접 알고 있으면 전략패턴 OCP에 잘맞는다고 볼 수 없다.

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

JDBC 전략 패턴의 최적화

전략 클래스의 추가정보

전략과 클라이언트의 동거

문제점

  1. DAO 클래스를 만들 때 마다 StatementStartegy 구현 클래스를 만들어야 된다.

  2. User 같은 부가정조바 잇는경우 생성자와 인스턴스 변수를 만들어야됨.

로컬 클래스

StatementStrategy UserDao 안 내부 클래스로 정의

익명 내부 클래스

흠.. 별로 좋은 방법은 아닌거같은데...

컨텍스트와 DI

JdbcContext 분리

모든 DAO 에서 사용 할 수있게

클래스 분리

빈 의존관계 변경

인터페이스가 아닌이유는 자체적이고 독립적인 JDBC 컨텍스트 를 제공해주므로

서비스 오브젝트 의미이기때문에 구현 방법이 바뀔 이유가 없기 때문이다.

JdbcContext 의 특별한 DI / 스프링 빈으로 DI

DI 인터페이스 사이에 둬서 클래스 레벨에서는 의존관계가 고정되지 않고

런타임 시에 의존할 오브젝트와의 관계를 동적으로 주입해 준다.

하지만 넓게보면 객체 생성과 관계설정에 대한 제어권한을
오브젝트에서 제거하고 외부로 위임했다는 Ioc 개념을 포괄함.

여러가지 설명이있지만 패스.

코드를 이용하는 수동 DI

내부에 직접 DI

자신이 사용할 오브젝트를 만들고 초기화하는 전통적인 방법

템플릿과 콜백

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

템블릿/콜백의 동작원리

템블릿 : 고정된 작업 흐름을 가진 코드를 재사용
콜백: 탬플릿 안에서 호출되는 목적으로 만들어진 오브젝트

템플릿/콜백의 특징

JdbcContext에 적용된 템플릿/콜백

편리한 콜백의 재활용

코드가 복잡해지는 단점..

콜백의 분리와 재활용

콜백과 템플릿의 결합

템플릿/콜백의 응용

한 애플리케이션 안에서 동시에 여러종류가 만들어진다면

템플릿 / 콜백 패턴을 적용해 본다.


코드다.

테스트와 try/catch/finally

중복의 제거와 템플릿/콜백 설계


템플릿/콜백의 재설계

제레닉스 를 이용한 콜백 인터페이스

스프링 JdbcTemplate

스프링은 다양한 JDBC 템플릿/콜백 제공

기본 템플릿은 JdbcTemplate

update

JDBC PreparedStatementCreator 인터페이스의 createPreparedStatement() 메소드

콜백을 받는 update()

queryForInt()

queryForObject()

get() 메소드에 JDBC 적용

query()

기능 정의와 테스트 작성

query() 템플릿을 이용하는 getAll()구현

테스트 보완

재사용 가능한 콜백의 분리

DI를 위한 코드 정리

중복코드 제거

정리~

profile
어제의 나보다 한걸음 더

0개의 댓글