객체들이 할 수 있는 행위 각각에 대해 전략 클래스를 생성하고, 유사한 행위들을 캡슐화하는 인터페이스를 정의하여 객체의 행위를 동적으로 바꾸고 싶은 경우 직접 행위를 수정하지 않고 전략을 바꿔주기만 함으로써 행위를 유연하게 확장하는 방법
전략패턴을 사용하면 공통으로 쓰는 메소드를 인터페이스로 정의하여 그 메소드를 사용하면 상황에 따라 유연하게 사용할 수 있어서 나중에 시스템을 유지보수할 때 편해진다.
이것을 스프링에서 만들면?
public class UserDaoTest {final static Logger LOG = Logger.getLogger(UserDaoTest.class);public static void main(String[] args) {AbstractApplicationContext context = new GenericXmlApplicationContext("applicationContext.xml");UserDao dao = context.getBean("userDao", UserDao.class);//j01_ip : j01_125User user01 = new User("j01_125","노명진","1234");try {int flag = dao.add(user01);LOG.debug("=============================");LOG.debug("01. add flag="+flag);LOG.debug("=============================");} catch (ClassNotFoundException | SQLException e) {e.printStackTrace();}}}
context를 통해 userDao bean을 가져올 때
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="dUserDao" class="com.ehr.DUserDao" /><bean id="userDao" class="com.ehr.UserDao"><property name="connectionMaker" ref="dUserDao"></property></bean></beans>
userDao에 dUserDao를 Setter Injection한 userDao를 가져온다.
그래서 add()가 실행될 때 DUserDao에 있던 connection을 받을 수 있게 된다.
이렇듯 전략 패턴을 이용하면 DUserDao, NUserDao 등등 여러가지 변화를 편하게 줄 수 있는 것 같다.
public interface ConnectionMaker {public Connection makeConnection() throws ClassNotFoundException, SQLException;}public class DUserDao implements ConnectionMaker {final static Logger LOG = Logger.getLogger(DUserDao.class);@Overridepublic Connection makeConnection() throws ClassNotFoundException, SQLException {Class.forName("oracle.jdbc.driver.OracleDriver");String url = "jdbc:oracle:thin:@ip_num:port:SID";String userId = "orcl_id";String passwd = "orcl_pass";Connection conn = DriverManager.getConnection(url,userId,passwd);LOG.debug("---------------------");LOG.debug("01. conn : "+conn);LOG.debug("---------------------");return conn;}}public class UserDao {final static Logger LOG = Logger.getLogger(UserDao.class);private ConnectionMaker connectionMaker;public UserDao() {//connectionMaker = new DUserDao();}public void setConnectionMaker(ConnectionMaker connectionMaker) {this.connectionMaker = connectionMaker;}public int add(User user)throws ClassNotFoundException, SQLException{int flag = 0;Connection conn = connectionMaker.makeConnection();LOG.debug("========================================");LOG.debug(conn+" 연결 완료");LOG.debug("========================================");LOG.debug("========================================");LOG.debug(user+" 추가 완료");LOG.debug("========================================");flag = 1;return flag;}}
전략패턴 끝!