스프링 입문 6 - 스프링 DB 접근 기술

박철민·2022년 8월 28일
0

스프링 완전 정복

목록 보기
7/8
post-thumbnail

스프링 DB 접근 기술

H2 데이터베이스 설치

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

https://www.h2database.com/html/download-archive.html

테이블 생성하기

drop table if exists member CASCADE;
create table member
(
 id bigint generated by default as identity,
 name varchar(255),
 primary key (id)
);

값 넣기

insert into member(name) values('spring')
insert into member(name) values('spring2')

값 조회하기

SELECT * FROM MEMBER 


순수 JDBC

20년전 개발자

고대의 방식

이런게 있다는 것을 알필요가 있지 배울 필요는 X

환경 설정

build.gradle

plugins {
	id 'org.springframework.boot' version '2.7.2'
	id 'io.spring.dependency-management' version '1.0.12.RELEASE'
	id 'java'
}

group = 'hello'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	implementation 'org.springframework.boot:spring-boot-starter-jdbc'
	runtimeOnly 'com.h2database:h2'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

tasks.named('test') {
	useJUnitPlatform()
}

application.property

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

코드에 대해서 그냥 듣기만 할 것 -> 현재는 사용이 되지 않고 있다.


다음과 같이 memberService에서 레퍼지토리를 다양하게 바꿀수 있다.-> 나중에는 JPA로 바꾸자

  • 개방-폐쇄 원칙
    - 확장에는 열려있고, 수정, 변경에는 닫하였다.(인터페이스 다형성을 활용) -> 다른 코드들은 안 바꾼다.
  • 스프링의 DI을 사용하면 기존 코드를 전혀 손대지 않고, 설정만으로 구현 클래스를 변경할 수 있다.

스프링 통합 테스트

@Transactional
이걸 이용하면 여러번 테스트가 가능하다.

DB 연결 테스트를 하는 법에 대해서 잘 설명을 해주셨다.

이것이 가능하도록 할 것

@SpringBootTest : 스프링 컨테이너와 테스트를 함께 실행한다.
@Transactional : 테스트 케이스에 이 애노테이션이 있으면, 테스트 시작 전에 트랜잭션을 시작하고,
테스트 완료 후에 항상 롤백한다. 이렇게 하면 DB에 데이터가 남지 않으므로 다음 테스트에 영향을 주지
않는다


스프링 JDBC Template

스프링이 JDBC를 중복을 없앤

순수 JDBC와 동일한 환경ㅅ겅절ㅇ을 하면된다.

스프링 JdbcTemplate과 MyBatis 같은 라이브러리는 JDBC API에서ㅓ 본 반복 코드를 대부분 제거해준다. 하지만 SQL은 직접 작성해야 한다.

생성자 하나일 경우 @AutoWired 생략 가능


이랬던 코드가


이렇게 짧게 변한다.

이거는 현재 잘 쓰이고 있다.


JPA

혁신적인 방법 SQL을 DB 삭제 쿼리 같은 것을 해주는

  • JPA는 기존의 반복 코드는 물론이고, 기본적인 SQL도 JPA가 직접 만들어서 실행해준다.
  • JPA를 사용하면, SQL과 데이터 중심의 설계에서 객체 중심의 설계로 패러다임을 전환을 할 수 있다.
  • JPA를 사용하면 개발 생산성을 크게 높일 수 있다.

jpa는 인터페이스 중 hibernate

ORM 관계형 데이터베이스 매핑을 한다.

간단하다. createQuery를 통해 SQL문을 사용한다.

package hello.hellospring.repository;


import hello.hellospring.domain.Member;

import javax.persistence.EntityManager;
import java.util.List;
import java.util.Optional;

public class JpaMemberRepository implements MemberRepository {

    private final EntityManager em;

    public JpaMemberRepository(EntityManager em) {
        this.em = em;
    }

    @Override
    public Member save(Member member) {
        em.persist(member);
        return member;
    }

    @Override
    public Optional<Member> findById(Long id) {
        Member member = em.find(Member.class, id);
        return Optional.ofNullable(member);
    }

    @Override
    public Optional<Member> findByName(String name) {
        List<Member> result = em.createQuery("select m from Member m where m.name = :name", Member.class)
                .setParameter("name", name)
                .getResultList();

        return result.stream().findAny();
    }

    @Override
    public List<Member> findAll() {
        return em.createQuery("select m from Member m", Member.class)
                .getResultList();
    }
}


스프링 데이터 JPA

JPA를 활용한 스프링에서 하는 JPA를 편리하게 사용할 수 있도록 감싸준것

스프링 부트와 JPA만 사용해도 개발 생산성이 정말 많이 증가하고, 개발해야할 코드도 확연히 줄어듭니다. 여기에 스프링 데이터 JPA를 사용하면, 기존의 한계를 넘어 마치 마법처럼, 리포지토리에 구현 클래스 없이 인터페이스 만으로 개발을 완료할 수 있습니다. 그리고 반복 개발해온 기본 CRUD 기능도 스프링데이터 JPA가 모두 제공합니다.
지금까지 조금이라도 단순하고 반복이라 생각했던 개발 코드들이 확연하게 줄어듭니다. 따라서 개발자는 핵심 비즈니스 로직을 개발하는데, 집중할 수 있습니다.
실무에서 관계형 데이터베이스를 사용한다면 스프링 데이터 JPA는 이제 선택이 아니라 필수 입니다.

| 주의 : 스프링데이터 JPA는 JPA를 편리하게 사용하도록 도와주는 기술입니다. 따라서 JPA를 먼저 학습한 후에 스프링 데이터 JPA를 학습해야 합니다.

스프링 데이터 JPA 제공 기능

  • 인터페이스를 통한 기본적인 CRUD
  • findByName 처럼 메서드 이름 만으로 조회 기능 제공
  • 페이징 기능 자동 제공

| 참고 : 시;ㄹ무에서는 JPA와 스프링 데이터 JPA를 기본으로 사용하고, 복잡한 동적 쿼리는 Querydsl이라는 라이브러리를 사용하면 도니다. Querydsl을 사용하면 쿼리도 자바 코드로 안전하게 작성할 수 있고, 동적 쿼리도 편리하게 작성할 수 있습니다. 이 조합으로 해결하기 어려운 쿼리는 JPA가 제공하는 네이티브 쿼리를 사용하거나, 앞서 학습한 스프링 JdbcTemplate를 사용하면 된다.


profile
넓고 깊은 지식을 위해 삽질 중

0개의 댓글