본문으로 바로가기
반응형

 

 

자바 프로젝트에서 생성한 데이터들을 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(개방-폐쇄 원칙)을 잘 준수한 것이다.

 

 

기존에 있는 상태에서 확장은 하였지만, 기존 코드는 전혀 손을 대지 않았다.

 

 

 

이것이 스프링의 장점이다.

 

 

 

반응형