스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 (6) 스프링 DB 접근 기술

강아람·2022년 8월 14일
0

스프링 개발 입문

목록 보기
6/7
post-thumbnail

📚 H2 데이터베이스 설치

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

1.4.200 버전 설치

2) h2\bin 디렉토리에서 h2.bat 실행

h2\bin> h2.bat

만약, 접속이 안될 경우 주소창의 IP 주소를 localhost로 바꾸어주면 된다.

3) 연결 클릭

4) 새 cmd 창을 열어 dir

test.mv.db 가 생성되어있는 것을 확인

5) 소켓을 통해 접근할 수 있도록 url 변경

jdbc:h2:tcp://localhost/~/test


🔸 TABLE 생성

CREATE TABLE member
(
  id BIGINT GENERATED BY DEFAULT AS IDENTITY,
  name VARCHAR(255),
  PRIMARY KEY (id)
);

MEMBER table이 생성된 것을 확인

GENERATED BY DEFAULT AS IDENTITY

id BIGINT GENERATED BY DEFAULT AS IDENTITY : id 값이 들어오지 않으면 DB가 자동으로 Default 값을 채워넣어줌


🔸 TABLE 조회

SELECT * FROM MEMBER;


🔸 TABLE에 데이터 넣기

INSERT INTO MEMBER(name) VALUES('spring');




📚 순수 Jdbc

build.gradle의 dependencies에 추가

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

🔸 Jdbc

자바 프로그램과 DB를 연결할 때 필요한 driver


🔸 repository에서 DB로 메모리를 변경하는 방법

1) MemberRepository interface를 구현한 JdbcMemberRepository class 생성

public class JdbcMemberRepository implements MemberRepository


2) configuration만 수정하면 된다!

spring에서 제공하는 DataSource를 생성하여 memberRepository에 DI해준다.

private DataSource dataSource;

    @Autowired
    public SpringConfig(DataSource dataSource) {
        this.dataSource = dataSource;
    }
@Bean
    public MemberRepository memberRepository() {
//        return new MemoryMemberRepository();
        return new JdbcMemberRepository(dataSource);
    }

실행 결과 : DB에 잘 연결된다.


🔸 Spring (객체 기반)

  • 개방-폐쇄 원칙

    확장에는 열려있고, 수정과 변경에는 닫혀있다.

  • spring의 DI를 상요하면 기존 코드의 수정 없이 설정만으로 interface 구현 클래스를 변경할 수 있다.



📚 스프링 통합 테스트

스프링과 연결된 DB까지 통합된 테스트 진행

@SpringBootTest

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

@Transactional

: 테스트 케이스에서 사용하면 test를 시작하기 전에 transaction을 시작하고, test가 완료되면 rollback

▶ test 후에 DB에 데이터가 남지 않으므로 다음 테스트에 영향을 주지않고 반복 가능




📚 스프링 JdbcTemplate

Jdbc 코드를 축약하여 간단하게 사용할 수 있도록 해주는 template

@Override
public Optional<Member> findById(Long id) {
    List<Member> result = jdbcTemplate.query("select * from member where id = ?", memberRowMapper());
    return result.stream().findAny();
}



📚 JPA (Java Persistence API)

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

🔸 ORM (Object Relational Database Mapping)

JPA는 ORM이다!

객체와 관계형 데이터베이스의 데이터를 자동으로 매핑(연결)해주는 것

🔸 JPA 라이브러리 추가

◾ build.gradle

dependencies

implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

◾ application.properties

spring.jpa.show-sql=true	// sql을 볼 수 있음
spring.jpa.hibernate.ddl-auto=none	// 테이블을 자동으로 생성
  • 예제에서는 미리 만들어져있는 테이블을 사용할 것이므로 ddl-auto는 none으로 설정

◾ hibernate

JPA(표준)는 interface로 제공되기 때문에 이를 구현하는 hibernate(기업) library 필요


🔸 persistence 관련 annotation

@Entity
public class Member {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;    // system이 회원을 구분하기 위해 부여하는 식별자 id
    private String name;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

@Entity

: JPA가 관리하는 Entity

@Id

: 해당 property가 PRIMARY KEY임을 나타냄

@GeneratedValue

: PRIMARY KEY의 값을 DB가 자동으로 생성해주는 경우 명시

  • strategy : persistence provider가 Entity의 primary key를 생성할 때 사용할 생성 전략
  • generator : @SequenceGenerator@TableGenerator annotation에서 명시된 primary key 생성자를 재사용할 때 사용됨

👀 DB의 column 명과 property 명이 다를 경우

@Column annotation을 사용하여 매핑해준다.

@Column(name = "username")
private String name;

🔸 EntityManager

  • JPA library가 DB connection 정보, data source, sql 설정 등을 조합하여 EM(EntityManager를 알아서 만들어준다.
  • JPA를 사용하려면 EM을 DI받아 사용해야 한다.

em.find()

: primary key로 데이터를 조회하는 경우 사용

em.find(조회할 데이터 타입, key);

em.createQuery()

: primary key가 아닌 property로 데이터를 조회하는 경우 사용

em.createQuery(qlString, 조회 데이터 타입)
	.getResultList();	// 조회된 데이터 목록을 얻어옴

🔸 Transaction

데이터를 저장하거나 변경할 때에는 꼭 @Transaction을 사용해야 한다.




📚 스프링 데이터 JPA

public interface SpringDataJpaMemberRepository extends JpaRepository<Member, Long>, MemberRepository {

    @Override
    Optional<Member> findByName(String name);
}

JpaRepository interface를 상속한 SpringDataJpaMemberRepository interface를 발견하면 SpringDataJpa가 구현체로 만들어 스프링 빈에 등록

🔸 Spring Data JPA

◾ JpaRepository interface

  • find, save, delete, get 등의 대략적인 메서드 정의
  • PagingAndSortingRepository interface 상속
  • 🌟 Spring Data JPA가 이 interface를 상속하는 interface의 구현체를 자동으로 생성해준다.

🔸 Spring Data

◾ Repository interface

◾ CrudRepository interface

  • save, find, exists, count, delete 등의 메서드 정의
  • Repository interface 상속

◾ PagingAndSortingRepository interface

  • findAll 메서드 정의
  • CrudRepository interface 상속

🔸 SpringDataJpaRepository 정의 방법

만약, 내가 정의한 property로 데이터를 조회하는 메서드를 정의하고 싶은 경우

@Override
    Optional<Member> findByName(String name);
@Override
	Optional<Member> findByNameAndId(Spring name, long id);

JPQL : select m from Member m where m.name=?


🔸 스프링 데이터 JPA 제공 기능

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

0개의 댓글