[ JDBC ] 템플릿 메서드 패턴
현재의 JDBC는 개발자가 직접 관리해야하는 코드가 많은편
" 템플릿 메서드 패턴 중에 하나 " 인 jdbctemplate 클래스를 활용해 보자
템플릿 메서드 패턴
반복적인 로직을 가지는 부분을 캡슐화해서 사용하는것이 목표
코딩 순서가 정형화된 기술을 재사용하기 용이하게 모듈화해놓은 것
1) 라이브러리를 추가해야한다
Pom.xml에 코드를 추가하여 오른쪽구석에 다운로드 바가 완료될때 까지 대기!!
추가 완료 된 모습
2) JdbcTemplate에서 활용할 DataSource가 필요
DataSource를 applicationContext.xml에서 생성해야 한다
원래라면 <bean>이 아닌 @으로 사용할 수 있는 것 아닌가?
>> 우리가 만드는 클래스는 @를 이용할 수 있다
>> 클래스나 데이터소스를 외부에서 지원받으면 @를 이용할 수 없다
실무에서 xml을 @으로 바꾸는 과정을 할때, 외부에서 가져오는 클래스는 남아있을 수 밖에 없다
1) DataSource 설정하기
Setter 인젝션 방법을 이용하여
>> diverClassName
>> url
>> username
>> password
모두 String 타입이기 때문에 value로 값을 넣어준다
2) Spring JDBC 설정하기
객체화한 dataSource를 Setter 인젝션 방법으로 넣어 객체화 한다
3) 준비는 모두 끝났다 DAO를 진화시켜 보자
기존의 DAO와 진화된 DAO 비교
요약 : 귀찮게 만들었던 conn, pstmt 관련 get, set을 내가 하지 않는다
기존의 DAO | 진화된 DAO |
pstmt.executeUpdate() | jdbcTemplate.update() |
pstmt.executeQuery | jdbcTemplate.queryForObject() jdbcTemplate.query() |
진화된 DAO 쓰는법
1) jdbcTemplate.update( sql문, sql문에 들어갈 ?값, ... )
Insert, Update, Delete 에서 사용함
?순서에 맞게 인자도 순서에 맞춰 넣어주어야 한다!
2) jdbcTemplate.queryForObject() 과 jdbcTemplate.query()
Select 에서 사용함
jdbcTemplate.queryForObject() = SQL문의 결과가 하나라면 사용
jdbcTemplate.query() = SQL문의 결과가 여러개라면 사용
특별하게 Select류에서 사용해야하는 클래스가 있는데
Mapper 클래스이다
SelectOne, SelcetAll을 사용할때 주로 사용할텐데
>> 결과값이 모든 칼럼을 출력해 준다 **
코드와 함께 확인해 보자
1) selectOneBoard 메소드 설명
Object [ ] args = sql문에 들어갈 ? 값들을 넣어줄 배열
결과값이 하나이기 때문에 jdbcTemplate.queryForObject() 를 사용
jdbcTemplate.queryForObject( SQL문, args, new RowMapper )
** Mapper는 내부에서 클래스를 생성한다
class 클래스명 implements RowMapper< 타입 > 로 생성 해준다
SelectOne과 SelectAll은 모든 칼럼값이 결과로 나오기 때문에
빈 객체를 생성하여 모든칼럼을 set 하는 코드를 나열한다
반환값으로는 생성했던 빈객체명을 넣는다 ( return될땐 내용이 채워져 있음 )
SelectOne메서드 안에서
return jdbcTemplate.queryForObject()을 한다면 RowMapper의 결과와 동일한 객체로 리턴된다
순서 요약
sql문과 args를 이용하여 >> SQL문 실행후 rs에 결과값이 담김
>> RowMapper와 알맞는 객체를 생성하여 rs의 결과를 set 해주고 set 완료한 객체리턴
>> jdbcTemplate.queryForObject() 결과가 되어 SelectOne메서드에서 return을 한다
2) selectAllBoard 메소드 설명
결과값이 여러개이기 때문에 jdbcTemplate.query() 사용
Object [ ] args 는 넣을 ?값이 없기때문에 생성하지 않았다
jdbcTemplate.query( SQL문 , new RowMapper )
SelectOne과 마찬가지로 RowMapper에 SQL문의 결과값 rs가 set 되고 리턴된다
jdbcTemplate.query()의 아웃풋값은 List<T> 인데
다음값이 없을때까지 계속 넣어주기 때문인 것 같다
SelectAll메서드 안에서
return jdbcTemplate.query()을 한다면 RowMapper결과와 동일한 객체를 가진 List<객체>로 리턴된다
결과값이 없을경우
jdbcTemplate.queryForObject()
jdbcTemplate.query()
결과값이 존재하지 않다면 오류가 발생한다
>> AfterThrowAdvice 클래스를 이용하여 오류를 잡아내면 된다