5. 스프링 DB 접근 기술
4) 스프링 JdbcTemplate
JdbcTemplate : 가장 많이 사용하는 JDBC 데이터베이스 접근 방식. 가장 낮은 수준의 접근이며
JDBC 코어 패키지의 중심 Class임. SQL 쿼리들을 작성하면 실행해준다.
- 순수 JDBC와 동일한 환경설정을 해줌 >> build.gradle에서 spring-boot-starter-jdbc 유지
- JDBC API에서의 반복 코드 Almost 제거 해줌. 실무에서 사용 多
- SQL문은 직접 작성할 것.
1. JdbcTemplateMemberRepository 생성 (implements MemberRepository)
1) 사용하기 전 JdbcTemplate를 먼저 선언.
private final JdbcTemplate jdbcTemplate;
- 전(순수 Jdbc)과 동일하게 DataSource 객체를 injection 받아야한다.
//datasource injection 받기
@Autowired
public JdbcTemplateMemberRepository(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
✔ 클래스에서 생성자가 1개만 있을 경우엔, @Autowired를 생략해도 자동으로 스프링 빈이 injection 해줌
2) 조회 메서드 쿼리 작성 (findById)
<먼저 RowMapper 정의>
private RowMapper<Member> memberRowMapper(){
return new RowMapper<Member>() {
@Override
public Member mapRow(ResultSet rs, int rowNum) throws SQLException {
Member member = new Member();
member.setId(rs.getLong("id"));
member.setName(rs.getString("name"));
return member;
}
}
}
쿼리 결과를 row mapper을 이용해 mapping 해 주기
➔ 쿼리 결과로 넘어온 ResultSet에서 id를 찾아 member의 id로 넣어준다. (rs.getLong("id")) , name도 마찬가지
- mapping시 객체 생성은 여기서 해서 member로 넘어감
Replace lambda 기능을 이용해 람다형식으로 간단하게 바꿀 수 있다.
<findById 완성> - jdbcTemplate 라이브러리를 이용해 간단하게 사용 가능
@Override
public Optional<Member> findById(Long id) {
List<Member> result = jdbcTemplate.query("select * from member where id = ?", memberRowMapper(), id);
return result.stream().findAny();
}
List형 ➔ stream으로 바꿔서 Optional로 반환하기 위함
- jdbcTemplate에서 "select ~ " 쿼리를 날려서 → 결과를 memberRowMapper을 통해 매핑 → 매핑된 member 객체를 List로 받아서 → Optional로 바꿔서 반환함
3) 저장 메서드 작성 (save)
@Override
public Member save(Member member) {
//SimpleJdbcInsert >> 쿼리 대신 작성해줌 (테이블 명, columnname 만 입력하면 됨)
SimpleJdbcInsert jdbcInsert = new SimpleJdbcInsert(jdbcTemplate);
jdbcInsert.withTableName("member").usingGeneratedKeyColumns("id");
//insert 쿼리 수행과 동일한 효과
Map<String, Object> parameters = new HashMap<>();
parameters.put("name", member.getName());
Number key = jdbcInsert.executeAndReturnKey(new MapSqlParameterSource(parameters));
member.setId(key.longValue());
return member;
}
- SimpleJdbcInsert : 쿼리를 작성할 필요 없이 insert문을 대신 수행해 줌
4) 조회 메서드 쿼리 작성 (findByName)
findById와 유사함.
@Override
public Optional<Member> findByName(String name) {
List<Member> result = jdbcTemplate.query("select * from member where name = ?", memberRowMapper(), name);
return result.stream().findAny();
}
5) 전체 조회 메서드 쿼리 작성 (findAll)
@Override
public List<Member> findAll() {
return jdbcTemplate.query("select * from member", memberRowMapper());
}
- findAll은 애초에 List로 반환하므로 Optional 변환이 필요 없음
2. SpringConfig 파일 수정
@Bean
public MemberRepository memberRepository() {
// return new MemoryMemberRepository(); --> 순수 java 코드 (메모리에 데이터 저장, DB X)
// return new JdbcMemberRepository(dataSource); --> 순수 jdbc 사용
//jdbcTemplate 사용
return new JdbcTemplateMemberRepository(dataSource);
이제는 jdbcTemplate을 이용한 구현체를 정의했으니 그것을 이용하자!
3. 테스트 하기 - MemberServiceIntegrationTest
먼젓번에 했던 테스트코드를 사용하면 웹 브라우저를 띄울 필요없이 테스트 가능하다!
'Spring > Spring boot 입문' 카테고리의 다른 글
[스프링 부트] 스프링 DB 접근 기술 (6)스프링 데이터 JPA - 스프링 입문 강의 / 인프런 (0) | 2022.08.31 |
---|---|
[스프링 부트] 스프링 DB 접근 기술(5) JPA - 스프링 입문 강의 / 인프런 (0) | 2022.08.30 |
[스프링 부트] 스프링 DB 접근 기술(1)~(3)- 스프링 입문 강의 / 인프런 (1) | 2022.08.28 |
[스프링 입문 강의] H2 DB 접근 오류 - Table "MEMBER" not found (this database is empty) (0) | 2022.08.28 |
[스프링 부트] 화면 웹 기능 - 스프링 입문 강의 / 인프런 (0) | 2022.08.19 |