본문 바로가기

Spring/토비의 스프링 3.1

3.6 스프링의 JdbcTemplate 스프링이 제공하는 템플릿/콜백 기술 기본 템플릿 JdbcTemplate JdbcContext를 JdbcTemplate으로 변경 현재 UserDao : DataSource를 DI받아 JdbcContext에 주입하여 템플릿 오브젝트로 만들어서 사용 JdbcTemplate : 생성자의 파라미터로 DataSource를 주입 UserDao public class UserDao { DataSource dataSource; private JdbcTemplate jdbcTemplate; public void setDataSource(DataSource dataSource) { this.jdbcTemplate = new JdbcTemplate(dataSource); this.dataSource = dataSource; ..
3.5 템플릿과 콜백 템플릿/콜백 패턴 전략 패턴 : 일정한 패턴을 갖는 작업 흐름이 존재하고 그 중 일부분만 자주 바꿔서 사용해야 하는 경우에 적합 전략 패턴의 기본 구조에 익명 내부 클래스를 활용한 방식 템플릿 고정된 틀 안에 바꿀 수 있는 부분을 넣어서 사용하는 것 콜백 실행되는 것을 목적으로 다른 오브젝트의 메소드에 전달되는 오브젝트 3.5.1 템플릿/콜백의 동작원리 템플릿/콜백의 특징 보통 단일 메소드 인터페이스를 사용함 템플릿의 작업 흐름 중 특정 기능을 위해 한 번 호출되는 경우가 일반적 메소드에 보통 파라미터가 존재 템플릿 작업 흐름 중 만들어지는 컨텍스트 정보를 전달받을 때 사용됨 템플릿/콜백의 일반적인 작업 흐름 클라이언트가 콜백 오브젝트를 만들고, 콜백이 참조할 정보를 제공 만들어진 콜백은 클라이언트가 템..
3.4 컨텍스트와 DI 3.4.1 JdbcContext의 분리 전략 패턴의 구조 클라이언트 : UserDao의 메소드 (add, deleteAll) 개별 전략 : 익명 내부 클래스 컨텍스트 : jdbcContextWithStatementStrategy() JDBC 일반적인 흐름을 가진 jdbcContextWithStatementStrategy()는 다른 DAO에서도 사용 가능하다. 클래스 밖으로 독립시키자 클래스 분리 JdbcContext 분리된 클래스 컨텍스트 메소드 : workWithStatementStrategy() UserDao는 더 이상 DataSource가 필요없으며, JdbcContext에 DataSource가 필요하다 public class UserDao { // getCount 등 메소드에 여전히 DataSou..
3.3 JDBC 전략 패턴의 최적화 3.3.1 전략 클래스의 추가 정보 add() 메소드에 전략 패턴 적용 add()에서는 PreparedStatement를 만들 때 user라는 부가적인 정보가 필요 user를 제공해주어야 함 AddStatement의 생성자를 통해 제공받도록 UserDao.java public class UserDao { public void deleteAll() throws SQLException { StatementStrategy st = new DeleteAllStatement(); jdbcContextWithStatementStrategy(st); } } AddAllStatement.java public class AddAllStatement implements StatementStrategy { User user..
3.2 변하는 것과 변하지 않는 것 3.2.1 JDBC try/catch/finally 코드의 문제점 복잡한 try/catch/finally 블록이 2중으로 중첩되며, 모든 메소드마다 반복된다. Copy & Paste는 미친 짓이다. 실수를 해도 테스트가 통과할 가능성이 높다. 잘 닫혔는지 테스트 코드를 만드는 것도 불가능에 가깝다. 많은 곳에서 자주 중복되는 코드와 로직에 따라 확장되고 자주 변하는 코드를 분리해야 한다. 3.2.2 분리와 재사용을 위한 디자인 패턴 적용 deleteAll(), add() 메소드를 살펴보면 고정되어 있는 부분과 변하는 부분이 구분된다. 변하지 않는 부분 : 커넥션 생성, 예외처리 변하는 부분 : PreparedStatement 메소드 추출 일단 변하는 부분을 메소드로 빼는 것이 가장 간단할 것 같지만, 변..
3.1 다시보는 초난감 DAO UserDao의 문제점 예외 처리에 대한 문제 3.1.1 예외처리 기능을 갖춘 DAO JDBC 코드에서 반드시 지켜야 할 원칙 예외처리 : 예외가 발생할 경우, 사용한 리소스를 반드시 반환하여야 한다. JDBC 수정 기능의 예외처리 코드 UserDao의 deleteAll() Connection과 PreparedStatement라는 두 개의 공유 리소스를 가져와서 사용 close()를 이용하여 리소스를 반환 중간에 예외가 발생할 경우 close()가 실행되지 않아 리소스가 반환되지 않음 try/catch/finally 구문을 이용한 deleteAll() public void deleteAll() throws SQLException { Connection c = null; PreparedStatement p..
3.0 템플릿 개요 템플릿 바뀌는 성질이 다른 코드 중 변경이 거의 일어나지 않으며 일정한 패턴으로 유지되는 특성을 가진 부분을 자유롭게 변경되는 성질을 가진 부분으로부터 독립시켜서 효과적으로 활용할 수 있도록 하는 방법 목차 3.1 다시 보는 초난감 DAO 3.1.1 예외처리 기능을 갖춘 DAO JDBC 수정 기능의 예외처리 코드 JDBC 조회 기능의 예외처리 3.2 변하는 것과 변하지 않는 것 3.2.1 JDBC try/catch/finally 코드의 문제점 3.2.2 분리와 재사용을 위한 디자인 패턴 적용 메소드 추출 템플릿 메소드 패턴의 적용 전략 패턴의 적용 DI 적용을 위한 클라이언트/컨텍스트 분리 3.3 JDBC 전략 패턴의 최적화 3.3.1 전략 클래스의 추가 정보 3.3.2 전략과 클라이언트의 동거 로..
2.6 정리 테스트는 자동화돼야 하고, 빠르게 실행할 수 있어야 한다. JUnit 프레임워크를 사용하면 테스트 작성이 편리하다. 테스트 결과는 일관성이 있어야 한다. 환경이나 테스트 실행 순서에 따라 결과가 달라지면 안 된다. 테스트는 포괄적으로 작성해야 한다. 검증이 되지 않은 테스트는 없는 것보다 못하다. 코드 작성과 테스트 수행의 간격이 짧을수록 효과적이다. 테스트하기 쉬운 코드가 좋은 코드다 테스트 주도 개발 방법도 유용하다. 테스트 코드도 리팩토링이 필요하다. @Before, @After를 사용해서 테스트 메소드들의 공통 준비 작업과 정리작업을 처리할 수 있다. 스프링 테스트 컨텍스트 프레임워크를 이용하면 테스트 성능을 향상시킬 수 있다. 동일한 설정파일을 사용하는 테스트는 하나의 애플리케이션 컨텍스트를 공..