본문 바로가기

스프링

[jdbc] 전략패턴_내부클래스2

1.     Com.springsource.junit : junit

2.     Commons-logging : Spring-context가 사용

3.     Mysql-connector : Mysql JDBC

4.     Spring-aop : 스프링 기능 자체의 aop

5.     Spring-bean : 스프링 빈을 활용하는 경우 필요. 스프링의 XML 설정파일과 자바 애노테이션을 파싱 하는데 필요한 클래스 포함

6.     Spring-context : 스프링 코어를 확장한 많은 클래스가 들어 있는데 모든 클래스는 EJB, JNDI(Java Naming Directory Interface), JMX용 클래스와 연동하는데 applicationcontext기능을 사용해야 하며 스프링 리모팅 클래스, 동적 스크립팅 언어(제이루비, 그루비등)와 연동하는 클래스, 빈 유효성검증(JSR-303) API, 스케줄링을 하는 클래스도 포함되어 있다.

7.     Spring-core : 모든 스프링 모듈에서 필요한 모듈. 다른 스프링 모듈에서 사용하는 공통 클래스가 포함됨.

8.     Spring-dao : EmpltyResultDataAccessException 등 사용을 위한 jar

9.     Spring-expression : 스프링 표현언어(SpEL) 지원 클래스 포함.

10.   Spring-jdbc : 스프링이 지원하는 jdbc.

11.   Spring-test.jar

-       @RunWith : Junit 프레임워크의 테스트 실행방법을 확장시 사용.

-       SpringJUnit4ClassRunner : 어플리케이션컨텍스트를 만들고 관리하는 확장 클래스

-      @ContextConfiguration(경로) : 자동으로 만들어줄 어플리케이션 컨텍스트 설정파일

 

전략 > 바뀌는 부분 Statement(쿼리) 생성

Context > 변하지 않는 부분 deleteAll메서드(try/catch/finally)

 

변하는 쿼리 부분을 전략 인터페이스 선언

 

삭제 쿼리 인터페이스 구현

 

 

19~32. 별도의 메소드로 분리한 try/catch/finally 컨텍스트. 컨텍스트는 인터페이스만 안다 구체적인걸 모름. 클라이언트로부터 StatementStrategy 타입의 전략 오브젝트를 제공받고, JDBC try/catch/finally 구조로 만들어진 컨텍스트 내에서 작업을 수행. 이 메소드는 하위 DAO 메서드들이 공유할 수 있음.(select 제외)

63. deleteAll() 메소드가 클라이언트가 됨.

64. 선정한 전략 클래스 오브젝트 생성

65. 컨텍스트 호출. 전략 오브젝트 전달

 

클라이언트와 컨텍스트 클래스를 분리하진 않았지만, 의존관계와 책임으로 볼 때 이상적인 클라이언트 컨텍스트 관계를 가지고 있음. 이것이 바로 DI

 

 

 

 

 

 

l  OCP(개방 패쇄 원칙) : 컨텍스트는 그대로 유지되면서 전략만 바꿔쓸 수 있다

l  바뀌는 전략 부분은 인터페이스로 구현한다..

인터페이스를 통해서만 의존하도록 만드는 전략

 

전략 구현 delelte

 

전략 구현 add

User 타입의 정보가 필요하기 때문에 생성자로 받음

 

 

33,56. Daoadd, deleteAll 메서드가 클라이언트가 된다.

19. jdbcContextWithState~ 메서드가 context 변하지 않는 JDBC, try,catch,finnally가 됨. 변하는 부분은 인터페이스로 받아 업데이트

* adddeleteAll 메서드를 보라 이런식으로 간편해 질 수 있다.

 

불안요소 : 메소드마다 새로운 구현 클래스가 만들어져야함

 

 

중첩클래스(내부클래스)전환

 

전략(쿼리) : 변하는 부분은 인터페이스로 구현

 

원래는 클래스를 이것처럼 add도 추가해줘야 하지만 중첩클래스를 사용한 DAO참조

 

 

클래스파일이 하나 줄고 add안에서 PrepareStatement 생성 로직을 함께 볼 수 있으니 가독성도 좋다. 또한 로컬변수(user)를 바로 사용 가능하여 코드를 줄일 수 있다.

* 로컬클래스의 장점 : 자신이 선언된 곳의 정보에 접근가능(자신이 정의된 메서드에 user변수가 있으므로 외부변수 사용가능. 반드시 final로 선언해야함. 메소드 내부에서 변경될 일이 없는 경우)

 

 

UserDao add 메서드를 익명 내부 클래스로 선언해보자.

익명내부클래스 : 이름을 갖지 않는 클래스. 클래스 선언과 오브젝트 생성이 결합된 형태로 만들어지며, 클래스를 재사용할 필요가 없고, 구현한 인터페이스 타입으로만 사용할 경우 유용하다.

34. new StatementStrategy() { : 인터페이스를 생성자처럼 이용하여 오브젝트로 만듬

하지만, 익명 내부클래스의 오브젝트는 딱 한번만 사용할 테니 굳이 변수에 담아 두지 말고 사용하는 것이 낫다.

 

요런식으로 간략하게 가능해진다.

'스프링' 카테고리의 다른 글

[jdbc] 콜백의 분리와 재활용 4  (0) 2020.10.18
[jdbc]전략패턴_context분리3  (0) 2020.10.17
[jdbc]예외처리_전략패턴1  (0) 2020.10.17
[spring] junit 3 학습테스트  (0) 2020.10.13
[spring] junit 2  (0) 2020.10.13