[스프링입문] 스프링 db 접근 기술 - 순수JDBC와 JDBCTemplate

김우경·2021년 1월 11일
0

Spring Framework

목록 보기
6/12

김영한님의 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술을 보면서 공부한 내용입니다.

H2 데이터베이스

개발이나 테스트 용도로 가볍고 편리한 DB이고 웹 화면을 제공한다.

설치하기 (맥os 기준)

  1. 설치 후 압축을 풀기

    H2 Database Engine

  2. 권한 주기: chmod 755 h2.sh

  3. 실행: ./h2.sh

    잠시후 이런 창이 나타난다.

  4. 데이터베이스 파일을 생성한다.
    최초 한번은 jdbc:h2:~/test 로 접속하여 db파일을 생성한다.

    ~/test.mv.db 파일 생성 확인

    위와같이 메인에 db파일이 생성되었음을 확인할 수 있다.
    → 이후부터의 접속은 jdbc:h2:tcp://localhost/~/test 로 한다.

순수 JDBC

db 연결 환경 설정하기

build.gradle

dependency 추가하기

implementation 'org.springframework.boot:spring-boot-starter-jdbc'
runtimeOnly 'com.h2database:h2'

application.properties

spring.datasource.url=jdbc:h2:tcp://localhost/~/test
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa

상세한 구현에 대한 이해보다는 옛날에는 이런 방식으로 개발했다 ~ 정도로 이해하면 된다고 하셨다.

인터페이스 구현체의 확장

/SpringConfig 에서 빈 등록하는 한줄만 수정하면 기존의 코드는 하나도 수정할 필요 없이 H2 디비로 갈아끼우기 완성~

@Bean
    public MemberRepository memberRepository() {
        //return new MemoryMemberRepository();
        return new JdbcMemberRepository(dataSource);
    }

개방 - 폐쇄 원칙 (OCP)

: 확장에는 열려있고 수정(변경)에는 닫혀있다.
→ 객체지향에서의 다형성을 잘 활용하면 기능을 완전히 변경할때에도 어플리케이션 동작 코드는 수정할 필요 x
→ 스프링의 DI 사용

스프링 통합 테스트

→ DB까지 연동된 통합 테스트를 해보자.

↔단위테스트 : 순수 자바 코드로 최소한의 단위로 테스트

@SpringBootTest

: 스프링 컨테이너와 테스트를 함께 실행한다.

@Transactional

: 테스트 시작 전에 transaction, 테스트 완료 후 commit을 날리지 않고 rollback하는 annotation

→ db에 데이터가 남지 않으므로 테스트의 반복 수행 가능

Spring JDBC Template

환경 설정

순수 JDBC와 동일한 환경설정

implementation 'org.springframework.boot:spring-boot-starter-jdbc'
runtimeOnly 'com.h2database:h2'

→ JDBC API에서의 반복 코드를 대부분 제거

JDBCTemplate 활용해서 Repository 수정하기

private final JdbcTemplate jdbcTemplate;

@Autowired
public JdbcTemplateMemberRepository(DataSource dataSource) {
	this.jdbcTemplate = new JdbcTemplate(dataSource);
}

→ 반복 코드 제거하기

private RowMapper<Member> memberRowMapper() {
	return (RowMapper<Member>) (rs, rowNum) -> {
		Member member = new Member();
		member.setId(rs.getLong("id"));
		member.setName(rs.getString("name"));

		return member;
}

SpringConfig 수정

@Bean
    public MemberRepository memberRepository() {
        // return new MemoryMemberRepository();
        // return new JdbcMemberRepository(dataSource);
        return new JdbcTemplateMemberRepository(dataSource);
    }

Spring JDBC Template

환경 설정

순수 JDBC와 동일한 환경설정

implementation 'org.springframework.boot:spring-boot-starter-jdbc'
runtimeOnly 'com.h2database:h2'

→ JDBC API에서의 반복 코드를 대부분 제거

JDBCTemplate 활용해서 Repository 수정하기

private final JdbcTemplate jdbcTemplate;

@Autowired
public JdbcTemplateMemberRepository(DataSource dataSource) {
	this.jdbcTemplate = new JdbcTemplate(dataSource);
}

→ 반복 코드 제거하기

private RowMapper<Member> memberRowMapper() {
	return (RowMapper<Member>) (rs, rowNum) -> {
		Member member = new Member();
		member.setId(rs.getLong("id"));
		member.setName(rs.getString("name"));

		return member;
}

SpringConfig 수정

@Bean
    public MemberRepository memberRepository() {
        // return new MemoryMemberRepository();
        // return new JdbcMemberRepository(dataSource);
        return new JdbcTemplateMemberRepository(dataSource);
    }

출처

김영한님의 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술을 보면서 공부한 내용입니다.

profile
Hongik CE

0개의 댓글