[JavaWeb] 7장 DB를 활용해 데이터를 영구적으로 저장하기 - 1
7.2.1 요구사항
- JDBC에 대한 공통 라이브러리를 만들어 개발자가 SQL 쿼리, 쿼리에 전달할 인자, 조회한 데이터를 추출하는 3가지 구현에만 집중
- SQL Exception을 런타임 Exception으로 변환해 try/catch 절로 가독성을 해치지 않도록 해야함
7.2.2 요구 사항 분리 및 힌트
- INSERT, UPDATE 쿼리를 가지는 메소드의 중복 제거 작업을 진행한다.
- 분리한 메소드 중에서 변화가 발생하지 않는 부분(즉, 공통 라이브러리로 구현할 코드)을 새로운 클래스로 추가한 후 이동한다.
- InsertJdbcTemplate과 UpdateJdbcTemplate이 UserDao에 대한 의존 관계를 가진다. UserDao에 대한 의존 관계를 끊는다.
- InsertJdebcTemplate과 UpdateJdbcTemplate 구현 부분이 다른 부분이 없다. 둘 정의 하나를 사용하도록 리펙토링한다.
- JdbcTemplat은 아직도 User와 의존관계를 가지기 때문에 다른 DAO 클래스에서 재사용할 수 업다. User와 의존관계를 끊는다.
- 더 이상 JdbcTemplate은 특정 DAO 클래스에 종속적이지 않다. 이와 똑같은 방법으로 SelectJdbcTemplate을 생성해 반복 코드를 분리한다.
- JdbcTemplate과 SelectTemplate을 보니 중복 코드가 보인다. 또한 굳이 2개의 클래스를 제공하고 싶지 않다. JdbcTempate과 같은 한 개의 클래스만을 제공하도록 리팩토링 해본다.
- 위와 같이 SelectJdbcTemplate 클래스로 통합했을 때의 문제점을 찾아보고 이를 해결하기 위한 방법을 찾아본다.
- SQL Exception을 런타임 Exception으로 변환해 throw 하도록 한다.
- Connection, PreparedStatement 자원 반납을 close() 메소드를 사용하지 말고 try-with-resources 구문을 적용해 해결한다.
- SELECT 문의 경우 조회한 데이터를 캐스팅 하는 부분이 있다. 캐스팅하지 않고 구현하도록 개선 한다.
- 각 쿼리에 전달할 인자를 PreparedStatementSetter를 통해 전달할 수도 있지만 자바의 가변인자를 통해 전달할 수 있는 메소드를 추가한다
- UserDao에서 PreparedStatementSetter, RowMapper 인터페이스를 구현하는 부분을 JDK8에서 추가한 람다 표현식을 활용하도록 리팩토링 한다.