이전에 했던 프로젝트를 Strategy 전략패턴과 JDBC를 통해 리팩토링하여 OOP형식을 구현할 수 있도록 하였다.
이전 프로젝트 : https://velog.io/@qowl880/Spring-Spring%EC%97%90%EC%84%9C-Query%EB%AC%B8-%EB%A6%AC%ED%8C%A9%ED%86%A0%EB%A7%811
여러 알고리즘을 추상적인 접근점(인터페이스)을 만들어 접근점에서 서로 교환 및 실행(델리게이트) 가능하도록 하는 패턴으로 sql쿼리별 구분하여 구현할 것이다.
전략 패턴의 장점
// 쿼리문을 DAO 클래스에 작성하지 않고 따로 interface를 통해 각자 별도 클래스 생성함
public interface StatementStrategy {
PreparedStatement makepreparedStatement(Connection connection) throws SQLException;
}
public class DeleteAllStrategy implements StatementStrategy{
@Override
public PreparedStatement makepreparedStatement(Connection connection) throws SQLException {
return connection.prepareStatement("delete from users");
}
}
DAO
Connection conn = null;
PreparedStatement ps = null;
st = new DeleteAllStrategy();
try {
conn = connectionMaker.makeConnection(); // DB 설정을 위해 선언
ps = st.makepreparedStatement(conn); // 쿼리문을 가져오기 위해 선언
ps.executeUpdate(); // 쿼리문 동작
} catch (ClassNotFoundException | SQLException e) {
throw new RuntimeException(e);
}finally {
try {
ps.close();
} catch (SQLException e) {}
try {
conn.close();
} catch (SQLException e) {}
}
public class AddStrategy implements StatementStrategy{
private User user;
public AddStrategy(User user){
this.user =user;
}
@Override
public PreparedStatement makepreparedStatement(Connection connection) throws SQLException {
PreparedStatement ps = connection.prepareStatement("INSERT INTO users(id,name,password) VALUES(?,?,?)");
ps.setString(1,user.getId()); // mysql 테이블로 값 insert
ps.setString(2,user.getName());
ps.setString(3,user.getPassword());
return ps;
}
}
DAO
Connection conn = null;
PreparedStatement ps = null;
AddStrategy addStrategy = new AddStrategy(user);
st = addStrategy;
try {
conn = connectionMaker.makeConnection(); // DB 설정을 위해 선언
ps = st.makepreparedStatement(conn); // 쿼리문을 가져오기 위해 선언
ps.executeUpdate(); // 쿼리문 동작
} catch (ClassNotFoundException | SQLException e) {
throw new RuntimeException(e);
}finally {
try {
ps.close();
} catch (SQLException e) {}
try {
conn.close();
} catch (SQLException e) {}
}
public void jdbcContextWithStatementstrategy(StatementStrategy st){
Connection conn = null;
PreparedStatement ps = null;
try {
conn = connectionMaker.makeConnection(); // DB 설정을 위해 선언
ps = st.makepreparedStatement(conn); // 쿼리문을 가져오기 위해 선언
ps.executeUpdate(); // 쿼리문 동작
} catch (ClassNotFoundException | SQLException e) {
throw new RuntimeException(e);
}finally {
try {
ps.close();
} catch (SQLException e) {}
try {
conn.close();
} catch (SQLException e) {}
}
Delete
jdbcContextWithStatementstrategy(new DeleteStrategy());
add
AddStrategy addStrategy = new AddStrategy(user);
jdbcContextWithStatementstrategy(addStrategy);
※ 코드 정리 : https://github.com/Bae-Ji-Won/Spring-Study/tree/main/git/Toby-spring-jdbc/src/main/java/dao/Strategy