JDBC, Spring Data JDBC, H2 설정

귀찮Lee·2022년 7월 4일
0

Spring

목록 보기
21/30

◎ JDBC (Java Database Connectivity)

  • JDBC (Java Database Connectivity)

    • Java에서 제공하는 표준 API (Spring과는 독립적)
    • Java 기반 애플리케이션의 코드 레벨에서 사용하는 데이터를 데이터베이스에 저장 및 업데이트
    • 데이터베이스에 저장된 데이터를 Java 코드 레벨에서 사용할 수 있도록 함
  • JDBC API의 사용법 (서술X)

    • JDBC는 Java 기반의 애플리케이션에서 사용하는 데이터 액세스 기술의 기본이 되는 저수준(low level) API이다.
    • Spring에서는 Spring Data JDBC나 Spring Data JPA 같은 기술을 제공함으로써 편리하게 접근할 수 있다.
    • JDBC의 동작 흐름 정도는 알면 Spring에서 지원하는 데이터 액세스 기술을 사용하는데 도움이 된다.
  • JDBC의 동작 흐름

    • JDBC API를 사용하기 위해서는 JDBC 드라이버를 먼저 로딩한 후에 데이터베이스와 연결
    • JDBC 드라이버
      • 데이터베이스와의 통신을 담당하는 인터페이스
      • Oracle이나 MS SQL, MySQL 같은 다양한 벤더에서는 해당 벤더에 맞는 JDBC 드라이버를 구현해서 제공
      • JDBC 드라이버의 구현체를 이용해서 특정 벤더의 데이터베이스에 액세스함
  • JDBC API 사용 흐름

    1. JDBC 드라이버 로딩 : 사용하고자 하는 JDBC 드라이버를 로딩, DriverManager라는 클래스를 통해서 로딩
    2. Connection 객체 생성 : DriverManager를 통해 데이터베이스와 연결되는 세션(Session)인 Connection 객체를 생성
    3. Statement 객체 생성 : Statement 객체는 작성된 SQL 쿼리문을 실행하기 위한 객체, 객체 생성 후에 정적인 SQL 쿼리 문자열을 입력으로 가진다.
    4. Query 실행 : 생성된 Statement 객체를 이용해서 입력한 SQL 쿼리를 실행
    5. ResultSet 객체로부터 데이터 조회 (SQL 쿼리문에 대한 결과 데이터 셋)
    6. ResultSet 객체, Statement 객체, Connection 객체 Close
  • Connection Pool

    • 필요성 : 기본적으로 Connection 객체를 생성하는 작업은 비용이 많이 드는 작업이기에, 개선이 필요
    • 애플리케이션 로딩 시점에 Connection 객체를 미리 생성해두고, DB 연결이 필요시, 미리 만들어 둔 Connection 객체를 사용하여 성능을 향상
    • Connection Pool : DB Connection을 미리 만들어서 보관하고, 필요시 제공하는 역할을 하는 관리자
    • Spring Boot 2.0 부터는
  • Spring Boot 2.0 이후부터는 JDBC API의 필요성 성능면에서 더 나은 이점을 가지고 있는 HikariCP를 기본 DBCP(Database Connection Pool)로 채택

◎ 데이터 액세스 기술

  • SQL 중심 기술

    • mybatis, Spring JDBC
    • 애플리케이션에서 데이터베이스에 접근하기 위해 SQL 쿼리문을 애플리케이션 내부에 직접적으로 작성하는 것이 중심이 되는 기술
    <!-- mybatis의 SQL Mapper -->
    <select id="findMember" resultType="Member">
      SELECT * FROM MEMBER WHERE member_id = #{memberId}
    </select>
    // Spring JDBC의 JdbcTemplate 사용
    Member member = this.jdbcTemplate.queryForObject(
    			 "select * from member where member_id=?", 1, Member.class);
  • 객체(Object) 중심 기술

    • JPA(Java Persistence API), Spring Data JDBC, Spring Data JPA
    • 데이터를 SQL 쿼리문 위주로 생각하는 것이 아니라 모든 데이터를 객체(Object) 관점으로 바라보는 기술
    • 애플리케이션 내부에서 이 Java 객체(Object)를 SQL 쿼리문으로 자동 변환 한 후에 데이터베이스의 테이블에 접근
    • ORM(Object-Relational Mapping) : 객체(Object) 중심의 데이터 액세스 기술
  • 현재 Java 진영에서는 SQL 중심의 기술에서 객체(Object) 중심의 기술로 지속적으로 이전을 하고 있는 추세

◎ Spring Data JDBC

  • Spring Data JDBC
    • 데이터베이스 연동 기술들 중에 객체(Object) 중심 기술을 이용
    • JPA는 기술적인 난이도와 복잡도가 꽤 높으나, Spring Data JDBC는 상대적으로 기술적 복잡도를 낮추었다.
    • cf) Spring Data JDBC vs JPA vs Spring Data JPA
      • 모두 다 배워야 한다.
      • JPA : 실무에서 가장 많이 사용하고 있는 기술
      • Spring Data JPA : Spring에서 JPA 기술을 편리하게 사용하기 위한 기술

◎ H2 설정

  • 의존 라이브러리 추가 및 H2 설정

    dependencies {
        ...
        ...
        implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
        runtimeOnly 'com.h2database:h2' // In-memory DB
    }
    • In-memory DB
      • 메모리 안에 데이터를 저장하는 데이터베이스
      • 서버를 껏다가 키면 데이터가 다 날라감
      • 사용 이유 : 테스트에 필요한 데이터 이외에 나머지 쓸데없는 데이터는 테이블에 없는 것이 테스트의 정확도 면에서 유리
      • 로컬 테스트 환경에서는 인메모리(In-memory) DB 사용을 권장
    • h2 설정
    # src/main/resources/application.yml
    # Shift + F6 를 통해 확장자 변경 가능
    
    spring:
    h2:
      console:
        enabled: true  # h2 기본 설정
        path: /h2   # h2-console path 변경
        settings:
          web-allow-others: true # 외부 주소로도 접속 가능
      datasource:
        url: jdbc:h2:mem:test  # JDBC URL 변경 (매번 랜덤으로 바뀌지 않게)
profile
배운 것은 기록하자! / 오류 지적은 언제나 환영!

0개의 댓글