ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 (6) 스프링 DB 접근 기술
    Back-End/Spring 2022. 8. 21. 23:27

    📚 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()처럼 메서드 이름 만으로 조회 기능 제공
    • 페이징 기능 자동 제공

    댓글

Designed by Tistory.