2020. 7. 30. 03:45ㆍSpring/Spring
1. JdbcTemplate 설정
1) JDBC 문제점
가장 많은 자바 개발자들이 사용한 데이터베이스 연동 기술이다. 하지만 많은 양의 코드가 필요하며, JDBC 관련 코드를 메서드를 구현할 때 마다 반복해서 작성해야하는 문제가 있다. 이러한 문제점을 스프링은 JdbcTemplate 클래스를 제공하여 데이터베이스 연동에 필요한 코드를 대신 처리를 해주어 해결해준다.
2) JdbcTemplate
GoF 디자인 패턴 중 템플릿 메서드 패턴이 적용된 클래스다. 템플릿 메서드 패턴은 복잡하고 반복되는 알고리즘을 캡슐화하여 재사용하는 패턴으로 정의한다. 즉, JdbcTemplate 클래스가 제공하는 템플릿 메서드를 호출하여 데이터베이스 연동에 필요한 코드를 처리한다.
3) 라이브러리 추가
pom.xml
4) DataSource 설정
JdbcTemplate 클래스가 JDBC API를 이용하여 데이터베이스 연동을 처리하기 위해 DataSource를 <bean> 등록하여 스프링 컨테이너가 생성하도록 해야 한다.
BasicDataSource 객체가 삭제되기 전에 연결을 해제하고자 destroy-method 속성을 설정하고, 연결에 필요한 설정은 <property>를 Setter 인젝션으로 설정했다.
/src/main/java/
applicationContext.xml
5) 프로퍼티 파일을 이용한 DataSource 설정
PropertyPlaceholderConfigurer를 이용하면 외부의 프로퍼티 파일을 참조하여 DataSource를 설정할 수 있다.
/src/main/resources/config/
database.properties
/src/main/java/
applicationContext.xml
2. JdbcTemplate 메서드
1) update() 메서드
INSERT, UPDATE, DELETE 쿼리문을 처리하기 위해 사용한다. 사용법은 '?'에 값을 통해 설정한다.
1. 차례대로 나열
int update(String sql, Object ... args)
String BOARD_UPDATE="update board set title=?, content=? where seq=?";
int cnt=jdbcTemplate.update(BOARD_UPDATE, vo.getTitle(), vo.getContent(), vo.getSeq());
2. 배열 객체를 이용하여 두 번째 인자로 전달
int update(String sql, Object[] args)
String BOARD_UPDATE="update board set title=?, content=? where seq=?";
Object[] args={vo.getTitle(), vo.getContent(), vo.getSeq()};
int cnt=jdbcTemplate.update(BOARD_UPDATE, args);
2) queryForInt() 메서드
SELECT 쿼리문의 결과를 반환받을 때 사용한다.
int queryForInt(String sql)
int queryForInt(String sql, Object ... args)
int queryForInt(String sql, Object[] args)
String BOARD_TOT_COUNT="select count(*) from board";
int count=jdbcTemplate.queryForInt(BOARD_TOT_COUNT);
3) queryForObject() 메서드
SELECT 쿼리문의 결과를 특정 자바 객체로 매핑하여 반환받을 때 사용한다. 결과가 없거나 두개 이상일 경우 예외를 발생한다. 이 메서드의 특징은 결과값을 자바 객체로 매핑할 RowMapper 객체를 반드시 지정해야한다.
Object queryForObject(String sql)
Object queryForObject(String sql, RowMapper<T> rowMapper)
Object queryForObject(String sql, Object[] args, RowMapper<T> rowMapper)
String BOARD_GET="select * from board where seq=?";
Object[] args = {vo.getSeq()};
int count=jdbcTemplate.queryForObject(BOARD_GET, args, new BoardRowMapper());
RowMapper 객체를 queryForObject() 메서드의 매개변수로 넘겨주게 되면 스프링 컨테이너는 SQL 구문을 수행한 후 자동으로 RowMapper 객체의 mapRow() 메서드를 호출한다.
/src/main/java/
BoardRowMapper.java
4) query() 메서드
queryForObject()는 하나의 결과를 가질때 사용하지만 query() 메서드는 SELECT 문의 실행 결과가 목록일 때 사용한다. 동일하게 결과값을 자바 객체로 매핑할 RowMapper 객체를 지정하며, 검색된 결과값의 ROW 수 만큼 mapRow() 메서드가 실행된다.
List query(String sql)
List query(String sql, RowMapper<T> rowMapper)
List query(String sql, Object[] args, RowMapper<T> rowMapper)
String BOARD_LIST="select * from board order by seq desc";
jdbcTemplate.query(BOARD_LIST, new BoardRowMapper());
3. DAO
1) JdbcDaoSupport 클래스 상속 방법
JdbcDaoSupport를 상속받을 경우 getJdbcTemplate() 메서드를 사용할 수있다. 그리고 이 메서드로 호출할 경우 JdbcTemplate 객체가 반환되어 모든 메서드를 JdbcTemplate 객체로 구현할 수 있다. 그리고 JdbcTemplate 객체를 반환하기 위해서는 DataSource 객체가 필요하므로 부모 클래스인 JdbcDaoSupport 클래스의 setDataSource() 메서드를 이용한다. (BoardRowMapper 클래스가 따로 생성이 되어 있다.)
/src/main/java/
BoardDAOSpring.java
2) JdbcTemplate <bean> 등록 방법
JdbcDaoSupport 방법이 아닌, JdbcTemplate 객체를 JdbcTemplate 클래스를 <bean> 등록하고 의존성 주입으로 처리하는 방법이 있다. 반드시 DataSource 객체를 의존성 주입해야하며 @Autowired 어노테이션을 이용하여 DAO 클래스에서 의존성 주입을 처리한다. (BoardRowMapper 클래스가 따로 생성이 되어 있다.)
/src/main/java/
BoardDAOSpring.java
※ 테스트시 BoardServiceImpl 클래스에서 @Autowired된 변수의 타입을 BoardDAOSpring으로 변경하고 진행해야한다.
[참고] gmlwjd9405.github.io/2018/05/15/setting-for-db-programming.html
[참고] 스프링 퀵 스타트
'Spring > Spring' 카테고리의 다른 글
[Spring] Model 아키텍처 (1) (0) | 2020.07.30 |
---|---|
[Spring] 트랜잭션 (0) | 2020.07.30 |
[Spring] AOP 어노테이션 (0) | 2020.07.29 |
[Spring] AOP 엘리먼트, 표현식, JoinPoint, 바인드 변수 (0) | 2020.07.29 |