티스토리 뷰
MySql에서 DB 테이블 생성
예제 작성을 위한 테이블 생성 및 데이터 생성.
JdbcTemplate 생성
JdbcTemplate 객체는 DataSource를 생성자에 받아서 생성된다.
DataSource 는 빈 객체로 등록했으니 받아서 만들면 된다 .
AppCtx.class (설정 클래스)
package config;
import org.apache.tomcat.jdbc.pool.DataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import spring.MemberDao;
@Configuration
public class AppCtx
{
@Bean(destroyMethod = "close") // close 메소드는 커넥션 풀에 보관된 Connection을 닫는다
public DataSource dataSource()
{
DataSource ds = new DataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver"); // Driver 클래스 지정
ds.setUrl("jdbc:mysql://localhost/spring5fs?characterEncoding=utf8");
ds.setUsername("spring5");
ds.setPassword("spring5");
ds.setInitialSize(2); // 커넥션풀을 2개 만들어 놓는다
ds.setMaxActive(10); // 활성 상태 가능한 최대 커넥션 개수 10
// 10초 주기로 유휴 커넥션이 유효한지 여부 검사, 최소 유휴 시간 3분으로 지정
ds.setTestWhileIdle(true); // 유휴 커넥션 검사 true
ds.setMinEvictableIdleTimeMillis(1000 * 60 * 3); // 최소 유휴 시간 3분 설정
ds.setTimeBetweenEvictionRunsMillis(10 * 1000); // 10초 주기로
return ds;
}
@Bean
public MemberDao memberDao()
{
// dataSource 빈 객체를 받는다
return new MemberDao(dataSource());
}
}
DB 연동 기능을 구현할 MemberDao 클래스
// Member DB
public class MemberDao
{
private static long nextId = 0;
private Map<String, Member> map = new HashMap<>();
private JdbcTemplate jdbcTemplate;
public MemberDao(DataSource dataSource)
{
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
JdbcTemplate을 이용한 조회 쿼리 실행
JdbcTemplate 클래스는 SELECT 쿼리 실행을 위한 query() 메소드가 있다.
List<T> query(String sql, RowMapper<T> rowMapper, Object... args)
sql 문을 String으로 전달한다.
전달 받은 쿼리를 실행하고 얻은 ResultSet의 결과를 RowMapper가 자바 객체로 변환한다.
args는 sql의 파라미터가 인덱스 기반 파라미터를 갖는 쿼리이면 인덱스를 지정한다.
query() 메소드는 쿼리 실행 결과가 존재하지 않으면 길이 0인 List를 리턴한다.
MemberDao 클래스
public Member selectByEmail(String email)
{
// List<T> query(String sql, RowMapper<T> rowMapper, Object... args)
List<Member> results = jdbcTemplate.query(
"select * from MEMBER where EMAIL = ?",
// 임의 클래스를 이용해 RowMapper 객체 전달
new RowMapper<Member>()
{
@Override
public Member mapRow(ResultSet rs, int rowNum) throws SQLException
{
Member member = new Member(
rs.getString("EMAIL"),
rs.getString("PASSWORD"),
rs.getString("NAME"),
rs.getTimestamp("REGDATE").toLocalDateTime());
member.setId(rs.getLong("ID"));
return member;
}
}
, email
);
return results.isEmpty() ? null : results.get(0);
}
query() 메소드에 String으로 된 쿼리문, 임의 클래스 RowMapper 객체, email을 전달해 결과를 List로 받고있다.
임의 클래스 RowMapper를 보면 알겠지만, RowMapper은 쿼리의 결과를 자바 객체로 변환해서 반환한다.
queryForObject() 메소드
queryForObject 메소드는 쿼리 실행 결과가 행이 한 개인 경우 사용한다.
결과 행이 없어도, 2개 이상이어도 익셉션이 발생한다.
예를들어 쿼리문이 "select count(*) from MEMBER" 이면 MEMBER 테이블 전체 행 갯수를 가져오는데, 실행 결과가 한개의 행이다.
queryForObject(String sql, Class<T> requiredType)
public int count()
{
// queryForObject(String sql, Class<T> requiredType)
// 쿼리 실행 결과가 한 행일때 사용 가능
Integer count = jdbcTemplate.queryForObject("select count(*) from MEMBER", Integer.class);
return count;
}
queryForObject 메소드도 query 메소드와 마찬가지로 인덱스 파라미터 (물음표)를 사용할수 있고, 사용할시 queryForObject의 3번째 메소드로 전달한다. (query와 마찬가지로 가변인자)
아래 코드는 queryForObject 메소드로 MEMBER 테이블에서 ID가 100인 컬럼을 가져오는 코드다.
Member member = jdbcTemplate.queryForObject
(
"select * from MEMBER where ID = ?", // MEMBER 테이블에서 특정 ID인 컬럼 가져옴
new RowMapper<Member>()
{
@Override
public Member mapRow(ResultSet rs, int rowNum) throws SQLException
{
Member member = new Member(
rs.getString("EMAIL"),
rs.getString("PASSWORD"),
rs.getString("NAME"),
rs.getTimestamp("REGDATE").toLocalDateTime());
member.setId(rs.getLong("ID"));
return member;
}
}
, 100 // ID = 100인 컬럼
);
query() 메소드와 마찬가지로 실행 결과 컬럼이 두개 이상이면 RowMapper를 두번째 파라미터로 전달해 결과를 받을수 있다.
query와 queryForObject 메소드의 흐름
두 메소드의 차이는 쿼리 결과 행이 1개 인지, 2개 이다.
query()는 List를 반환받고, queryForObject는 파라미터로 받은 타입을 리턴한다.
둘이 흐름은 동일하다.
1. 첫번째 파라미터로 쿼리문을 전달한다. 쿼리문에는 인덱스 파라미터가 있을수 있고 있다면 가변인자인 세번째 파라미터로 전달한다.
2. 쿼리의 결과를 받기위해 두번째 파라미터로 RowMapper를 전달한다.
RowMapper는 임의 클래스, 람다 혹은 아예 클래스를 구현해 전달할수 있다.
마지막으로 query, queryForObject 메소드 모두 jdbcTemplate에 정의되어 있고,
jdbcTemplate는 디비 설정 등 정보가 담긴 DataSource 빈 객체를 받아 생성된다!
출처 : 스프링5 프로그래밍 입문 (최범균 저)
'Web' 카테고리의 다른 글
mysql 연동 에러들 (0) | 2022.07.08 |
---|---|
Ch8. JdbcTemplate을 이용한 변경 쿼리 실행 (0) | 2022.07.08 |
Ch8. DB, 스프링이 제공하는 JdbcTemplate Class (0) | 2022.07.07 |
Ch07. Advice 적용 순서, @Order, @Around의 Pointcut 설정 (0) | 2022.06.28 |
Ch07. ProceedingJoinPoint, 프록시 생성 방식 (0) | 2022.06.28 |
- Total
- Today
- Yesterday
- permutation
- recursion
- Brute Force
- Tree
- binary search
- dfs
- CSS
- Spring
- Kruskal
- graph
- Implementation
- priority queue
- 재귀
- BFS
- Stack
- C
- Unity
- floyd warshall
- C++
- MVC
- 조합
- greedy
- db
- two pointer
- back tracking
- Dijkstra
- DP
- 이분탐색
- 자료구조
- Python
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |