본문 바로가기

분류 전체보기

3.7 정리 JDBC와 같이 예외가 발생할 가능성이 있으며, 공유 리소스의 반환이 필요한 코드는 반드시 예외처리를 해주어야 한다. 일정한 작업 흐름이 반복되면서 그 중 일부 기능만 바뀌는 코드가 존재한다면 전략 패턴을 적용한다. 컨텍스트 : 바뀌지 않는 부분 전략 : 바뀌는 부분, 인터페이스를 통해 유연하게 변경할 수 있도록 구성 같은 애플리케이션 내에서 여러 가지 종류의 전략을 다이내믹하게 구성하고 사용해야 한다면, 컨텍스트를 이용하는 클라이언트 메소드에서 직접 전략을 정의하고 제공하게 만든다. 익명 내부 클래스를 이용하면 코드도 간결해지고 메소드의 정보를 직접 사용할 수 있어서 편리하다. 컨텍스트가 하나 이상의 클라이언트 오브젝트에서 사용된다면 클래스를 분리해서 공유하도록 만든다. 컨텍스트는 별도의 빈으로 등록해..
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 전략과 클라이언트의 동거 로..