ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 토비의 스프링 - 1권 3장 템플릿
    BackEnd/SpringBoot 2023. 8. 23. 23:13

    1. 템플릿 메서드 패턴 적용

    불변 로직을 부모 클래스에 두고 상속을 통해 변하는 부분만 자식클래스에 설정

    단점 중 하나로 상속을 통해 구현시 중복 메서드가 발생한다.

    2. 전략패턴을 통한 구현

    인터페이스를 DI받도록 설정 후 인터페이스를 구현한다음 클래스를 넘김 구현하고자 하는 전략클래스를 생성 후 갈아 끼움

    ( 원하는 클래스로 설정 )

     

    수정전 - DI 이전의 코드

     

    public class TestUserDao {

    public void deleteAll() throws SQLException {
    ...
    try {
    c = dataSource.getConnection();

    ps = makeStatement(c);

    ps.executeUpdate();
    } catch (SQLException e){}
    ...
    }

    private PreparedStatement makeStatement(Connection c) throws SQLException {
    PreparedStatement ps;
    ps = c.prepareStatement("delete from users");
    return ps;
    }
    }

     

    수정 과정 - DI 하고자하는 인터페이스 생성

     

    public interface JdbcContextInterface {

    public void workWithStatementStrategy(StatementStrategy stmt) throws SQLException;
    }

     

    수정 과정 - 인터페이스 구현 클래스

     

    public class JdbcContextInterfaceImpl implements JdbcContextInterface {

    private DataSource dataSource;

    public JdbcContextInterfaceImpl(DataSource dataSource) {
    this.dataSource = dataSource;
    }

    @Override
    public void workWithStatementStrategy(StatementStrategy stmt) throws SQLException {
    ...
    try {
    Connection c = this.dataSource.getConnection();
    PreparedStatement = stmt.makePreparedStatement(c);

    ps.executeUpdate9):
    } catch (SQLException e) {}
    finally {}
    ...
    }
    }

     

    수정 후 - 다이나믹하게 주입을 받아서 실행

     

    public class TestUserDao {

    private JdbcContextInterface jdbcContextInterface;

    public void setJdbcContext(JdbcContextInterface jdbcContextInterface) {
    this.jdbcContextInterface = jdbcContextInterface;
    }

    public void deleteAll() throws SQLException {
    this.jdbcContextInterface.workWithStatementStrategy(new StatementStrategy(){...});
    }
    }

     

    3. 의존 관계 주입

    의존 관계 주입은 인터페이스로 두어 런타임 시에 다이나믹하게 주입 되어야한다.

    특정 클래스로 받게된다면 완전한 DI라고 할수없다.

    의존관계가 특정 클래스로 고정되지않도록 해야한다.

     

    4. 템플릿/콜백

    템플릿은 고정된 작업을 재사용하기 위해서 사용된다.

    콜백함수는 템플릿안에서 호출되기위해 만들어진 오브젝트다.

    DI와는 다르게 클라이언트와 강하게 결합되어 있다. ( 중복 메서드를 하나의 메서드로 코드를 줄인 레벨의 리팩토링이다. )

    매번 새로운 오브젝트를 리턴받고 클라이언트에서 미리 만들어진 콜백함수를 설계도 대로 실행한 후 결과를 돌려받는다

    자주 반복되는 패턴이 있다면 구조를 템플릿/콜백 패턴으로 변경한다 단 구조가 정해져있다면 한다.

    항상 제일 먼저 고려해야 할 부분은 인터페이스를 이용한 전략패턴 DI이며 그 후에 중복되는 부분을 템플릿/콜백으로 변경한다.

    우리가 제일 쉽게 주로 사용하는 리팩토링 중이 이에 해당한다고 생각한다.

    컨텍스트 호출과 동시에 전략 DI를 수행하는 방식이 라고도함

    이를 판단하는 기준은 변하는 코드의 경계를 찾고 그 경계를 사이에 두고 주고 받는 일정한 정보를 확인하면 된다.

    댓글

Designed by Tistory.