-
토비의 스프링 - 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를 수행하는 방식이 라고도함
이를 판단하는 기준은 변하는 코드의 경계를 찾고 그 경계를 사이에 두고 주고 받는 일정한 정보를 확인하면 된다.
'BackEnd > SpringBoot' 카테고리의 다른 글
토비의 스프링 - 1권 5장 서비스의 추상화 (0) 2023.10.05 토비의 스프링 - 1권 4장 예외 (0) 2023.09.13 토비의 스프링 - 1권 2장 테스트 (0) 2023.08.15 토비의 스프링 - 1권 1장 오브젝트의 의존관계 (0) 2023.08.15