[Spring] Spring에서 Query문 리팩토링(2)

배지원·2022년 10월 25일
0

실습

목록 보기
6/24
post-custom-banner

이전에 했던 프로젝트를 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

1. Stragetegy

  • 여러 알고리즘을 추상적인 접근점(인터페이스)을 만들어 접근점에서 서로 교환 및 실행(델리게이트) 가능하도록 하는 패턴으로 sql쿼리별 구분하여 구현할 것이다.

  • 전략 패턴의 장점

    • 코드 중복 방지
    • 런타임시에 타겟 메소드 변경
    • 확장성, 알고리즘 변경이 용이

(1) StatementStrategy

  • statement를 전략 구조로 설계하기 위해 인터페이스 생성
// 쿼리문을 DAO 클래스에 작성하지 않고 따로 interface를 통해 각자 별도 클래스 생성함
public interface StatementStrategy {
    PreparedStatement makepreparedStatement(Connection connection) throws SQLException;

}

(2) DeleteAllStrategy

  • 인터페이스를 구현한 Delete 쿼리문 담은 클래스 생성
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) {}
        }

(3) AddStrategy

  • 인터페이스를 구현한 Add 쿼리문 담은 클래스 생성
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) {}
        }

(4) jdbcContextWithStatementstrategy

  • 현재 Delete와 Add메서드에는 중복되는 코드가 존재한다. 따라서 이를 하나의 메서드로 빼내어 분리한다.
 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

profile
Web Developer
post-custom-banner

0개의 댓글