스프링 DB 접근 기술
스프링 JdbcTemplate
- 순수 Jdbc와 동이란 환경설정을 하면 된다.
- 스프링 JdbcTemplate와 MyBatis 같은 라이브러리는 JDBC API에서 본 반복 코드를 대부분 제거해준다. 하지만 SQL 직접 작성해야 한다.
- (JdbcTemplate은 실무에서도 많이 쓴다.)
마이바티스
마이바티스는 자바 퍼시스턴스 프레임워크의 하나로 XML 서술자나 애너테이션을 사용하여 저장 프로시저나 SQL 문으로 객체들을 연결시킨다. 마이바티스는 아파치 라이선스 2.0으로 배포되는 자유 소프트웨어이다. (출처: 위키백과)
💾 repository > JdbcTemplateMemberRepository.java
package hello.hellospring.repository;
import hello.hellospring.domain.Member;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcInsert;
import org.thymeleaf.expression.Maps;
import javax.sql.DataSource;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
public class JdbcTemplateMemberRepository implements MemberRepository {
// Jdbc Template은 JDBC와 마찬가지로 데잍터를 저장하기 위해 도와주는 API이다.
private final JdbcTemplate jdbcTemplate;
// 생성자가 하나만 있어서 스프링 bean으로 등록될 때 @Autowired를 생략할 수 있다.
@Autowired
public JdbcTemplateMemberRepository(DataSource dataSource) {
jdbcTemplate = new JdbcTemplate(dataSource);
}
// 오버라이드: 객체 지향 프로그래밍에서 서브 클래스 또는 자식 클래스가 자신의 슈퍼클래스들 또는 부모 클래스들 중 하나에 의해 이미 제공된 메소드를 특정한 형태로 구현하는 것을 제공하는 언어의 특정이다.
@Override
public Member save(Member member) {
/*
* SimpleJdbcInsert:
* JDBC를 이용하여 데이터를 간단하게 삽입(insert)할 수 있는 방법을 제공함
* */
SimpleJdbcInsert jdbcInsert = new SimpleJdbcInsert(jdbcTemplate);
jdbcInsert.withTableName("member").usingGeneratedKeyColumns("id");
Map<String, Object> parameters = new HashMap<>();
parameters.put("name", member.getName());
Number key = jdbcInsert.executeAndReturnKey(new MapSqlParameterSource(parameters));
member.setId(key.longValue());
return member;
}
@Override
public Optional<Member> findById(Long id) {
List<Member> result = jdbcTemplate.query("select * from member where id = ?", memberRowMapper(), id);
return result.stream().findAny();
}
@Override
public Optional<Member> findByName(String name) {
List<Member> result = jdbcTemplate.query("select * from member where name = ?", memberRowMapper(), name);
return result.stream().findAny();
}
@Override
public List<Member> findAll() {
return jdbcTemplate.query("select * from member", memberRowMapper());
}
/*
* RowMapper:
* 원하는 형태의 결과값을 반환할 수 있다
* SELECT로 나온 여러 개의 값을 반환할 수 있을 뿐만 아니라
* 사용자가 원하는 형태로도 얼마든지 받을 수 있음
* */
private RowMapper<Member> memberRowMapper() {
return (rs, rowNum) -> {
Member member = new Member();
member.setId(rs.getLong("id"));
member.setName(rs.getString("name"));
return member;
};
}
}
💾 SpringConfig.java
package hello.hellospring;
import hello.hellospring.repository.JdbcMemberRepository;
import hello.hellospring.repository.JdbcTemplateMemberRepository;
import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;
import hello.hellospring.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
/*
* 스프링 뜰 때 @Configuration 읽고,
* @Bean을 스프링 빈에 등록하는 거라고 인식함
* @Configuration: 설정파일을 만들기 위한 애노테이션 또는 Bean을 등록하기 위한 애노테이션
* */
@Configuration
public class SpringConfig {
private final DataSource dataSource;
@Autowired
public SpringConfig(DataSource dataSource) {
this.dataSource = dataSource;
}
@Bean // 스프링 빈을 등록할 거임
public MemberService memberService() {
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
// return new MemoryMemberRepository();
// return new JdbcMemberRepository(dataSource);
return new JdbcTemplateMemberRepository(dataSource); // 💡 추가
}
}
테스트 시, 정상
테스트 코드를 잘 작성하는 게 중요하다.
[스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술] 강의 기록
300x250
'Framekwork > SPRING' 카테고리의 다른 글
[Spring Boot] 스프링 부트 게시판 프로젝트 실습 - application.yml 세팅 (0) | 2023.08.20 |
---|---|
[JAVA/SPRING] ajax 다뤄보기 (코딩레시피) (0) | 2023.04.11 |
[자바/스프링] 스프링 통합테스트 (0) | 2023.02.25 |
[자바/스프링] 순수 JDBC (0) | 2023.02.24 |
[자바/스프링] H2 데이터베이스 설치 (0) | 2023.02.23 |