//////
Search
🍒

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

생성일
2022/11/10 07:58
태그
TodayILearn
Spring
java
생성일 1

전략패턴 개요

“좋은 설계는 변하는 것과 변하지 않는 것을 분리하는 것이다.”
변하지 않는 것은 context에, 변하는 부분은 Strategy라는 인터페이스로 선언하여 구현체를 생성하여 문제를 해결한다.

1. 관심사의 분리

deleteAll, add 메소드
오늘은 deletAll과 add메소드의 전략 패턴을 적용하는 실습을 해보았다.
메소드를 살펴보면 똑같은 코드가 (변하지 않는)반복되는 부분과 계속 변하는 부분이 있다.

2. 리팩토링

리팩토링 후 설계도

바뀌는 부분

(Query문 작성 부분) PreparedStatement를 만드는 부분만 바뀌기 때문에 PreparedStatement를 리턴하는 StatementStrategy인터페이스를 도입한다.
바뀌는 부분만 외부에 위임하는 셈이다.
AddStrategy는 생성자를 통해 User을 초기화 해준다.
DeleteAllStrategy

변하지 않는 부분

connection 코드도 변하지 않고 반복되지만,
특히 try-catch가 반복되는 부분은 모든 메소드마다 길게 반복되는데 이러한 코드의 문제는
속도를 내서 작업하다가 복사를 덜한다거나, 몇 줄을 삭제하는 등의 human error 를 낼 수가 있다는 점이다.
이 부분은 jdbcContextWithStatmentStrategy 라는 이름의 메소드를 만들어서 분리한다.
WithStatementStrategy는 파라메터로 StatementStrategy를 받는다는 것을 암시한다!

디자인 패턴 : 전략패턴

전략 패턴 상세 설명 (토비의 스프링 참고)
전략패턴은 객체를 아예 둘로 분리하고 클래스 레벨에서는 인터페이스를 통해서만 의존하도록 만든다
좌측의 context의 contextMethod()에서 일정한 구조를 가지고 동작하다가 특정 확장기능은 Strategy인터페이스를 통해 외부의 독립된 전략 클래스에 위임하는 것이다.
deleteAll() 과 add() 메소드에서 변하지 않는 부분이라고 명시한 것이 바로 ContextMethod()가 된다
deleteAll() 과 add() 는 각각 JDBC를 이용해 DB를 업데이트하는 작업이라는 변하지 않는 맥락(context)을 갖는다.
각 메소드의 Query문을 바꾸기 위해, PreparedStatement를 인터페이스로 외부 기능으로 만든 것이 전략패턴에서 말하는 전략이라고 볼 수 있다.
인터페이스 구현체는 전략클래스, 선택 전략이라고 부른다.
눈여겨볼 것은 PreparedStatement를 생성하는 전략을 호출할 때는 이 컨택스트 내에서 만들어둔 DB 커넥션을 전달해야한다는 점이다.(파라매터)
책 참고
소스코드
UserDao.java [ 컨텍스트가 있는 클래스 ]
UserDaoTest.java [ 클라이언트 ]
StatementStrategy.java [ 전략 ]
DeleteAllStrategy.java [ 선택 전략 ]
AddStrategy.java [ 선택 전략 ]

마무리

오늘 배운 것 정리
일정한 작업 흐름이 반복되면서 그중 일부만 바뀌는 코드가 존재한다면 전략 패턴을 적용한다. 바뀌지 않는 부분은 컨텍스트로, 바뀌는 부분은 전략으로 만들고 인터페이스를 통해 유연하게 전략을 변경할 수 있도록 구성한다.
앞으로 배울 것
다음주에 배워볼 것은 익명 Class적용, JdbcContext분리, JdbcTemplate,
ConnectionMaker를 DataSource로 교체적용 이다!