자바 프로젝트에서 생성한 데이터들을 DB와 연동하고자 한다.
spring에서 제공하는 JPA 방식을 사용하면 간편하게 연동이 가능하지만,
스프링을 최대한 활용하지 않고 사용하는 방법부터 알아보고자 한다.
DB 연동은, 같은 동작을 수행하는 코드를
총 4단계에 거쳐서 기술하고자 한다.
그 두 번째는 Spring JDBC Template을 활용하는 방법이다.
기존 코드(Service, Repository, Domain 등)는 아래 링크에서
순차적으로 볼 수 있다
https://healthdevelop.tistory.com/entry/spring12
[Spring boot] 스프링 - 회원 가입, 회원 조회
간단한 회원관리 예제를 구현하고자 한다. 순서는 아래를 참조하면 된다. ● 회원관리 예제 - 백엔드 개발 1. 회원 도메인과 리포지토리 만들기 2. 회원 리포지토리 테스트 케이스 작성 3. 회
healthdevelop.tistory.com
1. JdbcTemplateRepository 작성
JdbcTemplateMemberRepository.java
package hello.hellospring.repository;
import hello.hellospring.domain.Member;
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 javax.sql.DataSource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
public class JdbcTemplateMemberRepository implements MemberRepository {
private final JdbcTemplate jdbcTemplate;
// @Autowired - 생성자가 하나일 경우 생략 가능
public JdbcTemplateMemberRepository(DataSource dataSource) {
jdbcTemplate = new JdbcTemplate(dataSource);
}
@Override
public Member save(Member member) {
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());
}
private RowMapper<Member> memberRowMapper() {
return (rs, rowNum) -> {
Member member = new Member();
member.setId((rs.getLong("id")));
member.setName(rs.getString("name"));
return member;
};
}
}
클래스 안에 작성할 쿼리문에 별도의 db connection없이
간편하게 쿼리문을 작성하고, resultSet을 반환해준다.
여기서 resultSet은
코드 하단에 RowMapper 클래스로 작성하였다.
람다식을 이용하여 처리할 쿼리문의 결과들을 member Id와 Name로 설정하고
member를 반환하여 결과값을 전달해준다.
2. Config 작성
위에 작성한 코드들을 작성했던 memberRepository interface로 넘겨주어야 한다.
그것은 이전에 작성했던 config 파일을 수정해서 할 수 있다.
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.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
@Configuration
public class SpringConfig {
private final DataSource dataSource;
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); // 추가
}
memberRepository 빈의 return을
새로 작성한 JdbcTemplateMemberRepository로 반환해주는 것이다.
그리고 매개변수로 datasource를 넘겨주었다.
이것은 spring이 application properties에 설정 파일(db 연결)을 보고
datasource 스프링 빈을 만들어준다.
이제 데이터 연동은 마쳤고,
실제로 회원 가입이 잘 되는지 확인해 보자.
● 서버(브라우저)에서 확인
서버를 실행시키고,,
회원 가입을 페이지에 접속을 요청하고
새로운 회원 "jpa"를 등록시켜준다음
회원 조회 페이지로 가보면,,
새로운 회원이 "jpa"가 등록되었다.
h2 데이터베이스도 확인을 해보면
데이터가 잘 저장되었다.
우리(개발자)는 기존의 MemoryMemberRepository를 수정하지 않고
SpringConfig만 수정함으로써 db 저장소를 바꾸었다.
이것은 객체 지향 설계 5원칙 중 하나인 OCP(개방-폐쇄 원칙)을 잘 준수한 것이다.
기존에 있는 상태에서 확장은 하였지만, 기존 코드는 전혀 손을 대지 않았다.
이것이 스프링의 장점이다.
'Java > Spring' 카테고리의 다른 글
[Spring] 스프링 데이터 JPA | 스프링 데이터 JPA로 DB(데이터베이스) 연동하기 | 회원 가입, 회원 조회 (0) | 2022.01.10 |
---|---|
[Spring] JPA란? | JPA의 장점 | JPA로 DB(데이터베이스) 연동하기 | 회원 가입, 회원 조회 (0) | 2022.01.10 |
[Spring] 스프링 통합 테스트 | DB(데이터베이스) 연동하기 | 회원 가입, 회원 조회, 중복 회원 예외 (0) | 2022.01.10 |
[Spring] DB(데이터베이스) 연동하기 | 순수 JDBC | 회원 가입, 회원 조회 (0) | 2022.01.10 |
[Spring boot] 스프링 회원 조회, 전체 회원 조회, 회원 가입 예제 | 타임리프(Thymeleaf) (0) | 2022.01.07 |