You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
JdbeTemplateItemRepositoryV1 은 ItemRepository 인터페이스 구현
this.template= new JdbcTemplate(dataSource)
JdbcTemplate 은 데이터소스가(dataSource) 필요하다.
JdbcTemplateRepositoryV1() 생성자를 보면 dataSource 를 의존 관계 주입 받고 생성자 내부에서 JdbcTemplate 을 생성한다. (스프링에서는 관례상 이 방법을 많이 사용한다. )
물론 JdbcTemplate 을 스프링 빈으로 직접 등록하고 주입받아도 된다.
save() - 데이터를 저장한다.
template.update() : 데이터를 변경할 때는 update() 를 사용하면 된다.
INSERT, UPDATE, DELETE SQL 에 사용한다.
template.update() 의 반환 값은 int 인데, 영향 받은 로우 수를 반환한다.
데이터를 저장할 때 PK 생성에 identity 방식을 사용하기 때문에 직접 개발자가 지정하는 것이 아니라 비워두고 저장해야 한다. 그러면 데이터베이스가 PK 인 ID 를 대신 생성해준다.
데이터베이스가 대신 생성해주는 PK ID 값은 데이터베이스가 생성하기 때문에, 데이터베이스에 insert 가 완료 되어야 생성된 PK ID 값을 확인할 수 있다.
KeyHolder 와 connection.prepareStatement(sql, new String[]{"id"}) 를 사용해서 id 를 지정해주면 INSERT 쿼리 실행 이후에 데이터베이스에서 생성된 ID 값을 조회할 수 있다.
뒤에서 설명하는 JdbcTemplate 이 제공하는 SimpleJdbcInsert 라는 훨씬 편리한 기능이 있다.
update() - 데이터를 업데이트 한다.
template.update() : 데이터를 변경할 때는 update() 를 사용하면 된다.
? 에 바인딩할 파라미터를 순서대로 전달하면 된다.
반환 값은 해당 쿼리의 영향을 받은 로우 수이다. where id=? 를 지정했기 때문에 영향 받은 로우 수는 최대 1개이다.
findById() - 데이터를 하나 조회한다.
template.queryForObject()
결과 로우가 하나일 때 사용한다.
RowMapper 는 데이터베이스의 반환 결과인 ResultSet 을 객체로 변환한다.
결과가 없으면 EmptyResultDataAccessException 예외가 발생한다.
결과가 둘 이상이면 IncorrectResultSizeDataAccessException 예외가 발생한다.
ItemRepository.findById() 인터페이스는 결과가 없을 때 Optional 을 반환해야 한다. 따라서 결과가 없으면 예외를 잡아서 Optional.empty 를 대신 반환하면 된다.
findAll() - 데이터를 리스트로 조회한다. 그리고 검색 조건으로 적절한 데이터를 찾는다.
template.query()
결과가 하나 이상일 때 사용한다.
RowMapper 는 데이터베이스의 반환 결과인 ResultSet 을 객체로 변환한다.
결과가 없으면 빈 컬렉션을 반환한다.
itemRowMapper()
데이터베이스의 조회 결과를 객체로 변환할 때 사용한다. JDBC를 직접 사용할 때 ResultSet 을 사용했던 부분을 떠올리면 된다.
차이가 있다면 JdbcTemplate 이 루프를 돌려주고, 개발자는 RowMapper 를 구현해서 그 내부 코드만 채운다고 이해하면 된다.
3️⃣ JdbcTemplate 적용2 - 동적 쿼리 문제
findAll() 에서 어려운 부분은 사용자가 검색하는 값에 따라서 실행하는 SQL이 동적으로 달라져야 한다는 점이다.
검색 조건이 없음
select id, item_name, price, quantity from item
상품명(itemName) 으로 검색
select id, item_name, price, quantity from item
where item_name like concat('%' , ? '%')
최대 가격(maxPrice) 으로 검색
select id, item_name, price, quantity from item
where price <= ?
상품명(itemName), 최대 가격(maxPrice) 둘 다 검색
select id, item_name, price, quantity from item
where item_name like concat ('%' ,? '%')
and price <= ?
결과적으로 4가지 상황에 따른 SQL을 동적으로 생성해야 한다. 동적 쿼리가 쉬워보이지만, 막상 개발하면 다양한 상황을 고민해야 한다.
예를 들어 어떤 경우에는 where 을 앞에 넣고 어떤 경우에는 and 를 넣어야 하는지 등을 모두 계산해야 한다.
또한 각 상황에 맞추어 파라미터를 생성해야 한다.
이후에 나오는 MyBatis 의 가장 큰 장점은 SQL을 직접 사용할 때 동적 쿼리를 쉽게 작성할 수 있다는 점이다.
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
1️⃣ JdbcTemplate 소개와 설정
SQL 을 직접 사용하는 경우 스프링이 제공하는 JdbcTemplate 은 JDBC 를 매우 편리하게 사용할 수 있게 도와준다 .
장점
spring-jdbc라이브러리에 포함되어 있는데, 이 라이브러리는 스프링으로 JDBC 를 사용할 때 기본으로 사용되는 라이브버리이다. 별도의 설정 없이 사용할 수 있다.statement를 준비하고 실행statement,resultset종료단점
JdbcTemplate 설정
build.gradle(추가된부분)2️⃣ JdbcTemplate 적용1 - 기본
기본
JdbeTemplateItemRepositoryV1은ItemRepository인터페이스 구현this.template= new JdbcTemplate(dataSource)JdbcTemplate은 데이터소스가(dataSource) 필요하다.JdbcTemplateRepositoryV1()생성자를 보면 dataSource 를 의존 관계 주입 받고 생성자 내부에서JdbcTemplate을 생성한다. (스프링에서는 관례상 이 방법을 많이 사용한다. )JdbcTemplate을 스프링 빈으로 직접 등록하고 주입받아도 된다.save() - 데이터를 저장한다.
template.update(): 데이터를 변경할 때는update()를 사용하면 된다.INSERT,UPDATE,DELETESQL 에 사용한다.template.update()의 반환 값은int인데, 영향 받은 로우 수를 반환한다.identity방식을 사용하기 때문에 직접 개발자가 지정하는 것이 아니라 비워두고 저장해야 한다. 그러면 데이터베이스가 PK 인 ID 를 대신 생성해준다.KeyHolder와connection.prepareStatement(sql, new String[]{"id"})를 사용해서id를 지정해주면INSERT쿼리 실행 이후에 데이터베이스에서 생성된 ID 값을 조회할 수 있다.SimpleJdbcInsert라는 훨씬 편리한 기능이 있다.update() - 데이터를 업데이트 한다.
template.update(): 데이터를 변경할 때는update()를 사용하면 된다.?에 바인딩할 파라미터를 순서대로 전달하면 된다.where id=?를 지정했기 때문에 영향 받은 로우 수는 최대 1개이다.findById() - 데이터를 하나 조회한다.
template.queryForObject()RowMapper는 데이터베이스의 반환 결과인ResultSet을 객체로 변환한다.EmptyResultDataAccessException예외가 발생한다.IncorrectResultSizeDataAccessException예외가 발생한다.ItemRepository.findById()인터페이스는 결과가 없을 때Optional을 반환해야 한다. 따라서 결과가 없으면 예외를 잡아서Optional.empty를 대신 반환하면 된다.findAll() - 데이터를 리스트로 조회한다. 그리고 검색 조건으로 적절한 데이터를 찾는다.
template.query()RowMapper는 데이터베이스의 반환 결과인ResultSet을 객체로 변환한다.itemRowMapper()
데이터베이스의 조회 결과를 객체로 변환할 때 사용한다. JDBC를 직접 사용할 때
ResultSet을 사용했던 부분을 떠올리면 된다.차이가 있다면 JdbcTemplate 이 루프를 돌려주고, 개발자는
RowMapper를 구현해서 그 내부 코드만 채운다고 이해하면 된다.3️⃣ JdbcTemplate 적용2 - 동적 쿼리 문제
findAll()에서 어려운 부분은 사용자가 검색하는 값에 따라서 실행하는 SQL이 동적으로 달라져야 한다는 점이다.itemName) 으로 검색maxPrice) 으로 검색결과적으로 4가지 상황에 따른 SQL을 동적으로 생성해야 한다. 동적 쿼리가 쉬워보이지만, 막상 개발하면 다양한 상황을 고민해야 한다.
예를 들어 어떤 경우에는 where 을 앞에 넣고 어떤 경우에는 and 를 넣어야 하는지 등을 모두 계산해야 한다.
또한 각 상황에 맞추어 파라미터를 생성해야 한다.
이후에 나오는 MyBatis 의 가장 큰 장점은 SQL을 직접 사용할 때 동적 쿼리를 쉽게 작성할 수 있다는 점이다.
4️⃣ JdbcTemplate 적용3 - 구성과 실행
ItemRepository구현체로JdbcTemplateItemRepositoryV1이 사용되도록 했다. 메모리 저장소가 아닌 실제 DB 에 연결하는 JdbcTemplate 이 사용된다.ItemServiceApplication - 변경
데이터베이스 접근 설정
src/main/resources/application.propertiesDataSource, 트랜잭션 매니저를 스프링 빈으로 자동 등록한다.실행
TestDataInit이 실행되기 때문에itemA,itemB도 데이터베이스에 계속 추가된다. 메모리와 다르게 서버가 내려가도 데이터베이스를 유지되기 때문이다.🔗 출처
김영한 - 스프링 DB 2편 - 데이터 접근 활용 기술
All reactions