ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring boot #5 JDBC로 db접근
    Study/Spring boot 2021. 7. 10. 14:40

    스프링부트에서 DB를 이용하는 방법은 여러가지 있다. 그 중에서 요즘은 JPA를 가장 많이 사용하지만 일단 옛날에 사용하던 방법인 JDBC부터 정리하고자 한다.

     

    0. H2 DB설치

    H2 데이터베이스는 가벼운 db로 주로 테스트용으로 사용된다고 한다. django로 따지면 기본 내장 db인 sqlite3같은 db이다. 일단 이것으로 스프링부트랑 연결해보자.

     

    https://www.h2database.com/

    위 url에 접속하여 자신의 os에 맞는 버전을 설치해주자. 그리고 콘솔을 실행시키면 웹페이지가 뜰텐데 실행버튼을 누르면 된다. db를 생성하고 접속은 항상 local 환경에서만 할수 있도록 'jdbc:h2:tcp://localhost/~/test' 로 바꿔준다. 그리고 앞에서 하던 프로젝트를 이어서 하기위해 member 테이블을 아래와 같이 생성해주자.

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

     

     

    1.  JDBC

     

    일단 jdbc와 h2 데이터베이스를 디펜던시에 추가해야한다. build.gradle에 아래와 같이 디펜던시를 추가해주자. 디펜던시를 추가하고 gradle에서 새로고침버튼을 한번 눌려줘야 라이브러리가 설치된다.

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

     

    그리고 DB의 연결 설정을 명시해줘야한다. resoucres/ 디렉토리내에 application.properties 파일에 아래와 같이 설정을 추가해주자

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

     

     

     

    앞에서 만든 MemberRepository 인터페이스를 상속하는 JdbcMemberRepository 클래스를 생성하자. 그리고 사용할 DataSource를 아래와 같이 DI로 주입받자.

    public class JdbcMemberRepository implements MemberRepository{
    
        private final DataSource dataSource;
    
        public JdbcMemberRepository(DataSource dataSource) {
            this.dataSource = dataSource;
        }

     

    그리고 dataSource를 보다 쉽게 사용하기 위해 아래처럼 getconnection과 close 메소드를 만들어주자.

        private Connection getConnection() {
            return DataSourceUtils.getConnection(dataSource);
        }
        private void close(Connection conn, PreparedStatement pstmt, ResultSet rs)
        {
            try {
                if (rs != null) {
                    rs.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
            try {
                if (pstmt != null) {
                    pstmt.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
            try {
                if (conn != null) {
                    close(conn);
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        private void close(Connection conn) throws SQLException {
            DataSourceUtils.releaseConnection(conn, dataSource);
        }

     

     

    그리고 오버라이드 함수중에 save함수만 한번 구현해보자. 일단 try문에 가두기 전에 사용할 connection 등 변수들을 선언해주고 sql문을 준비해두자.

    String sql = "insert into member(name) valuse(?)";
    
    Connection connection = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;

     

    그리고 try catch문으로 jdbc문을 아래처럼 직접 코드를 작성해보자.

    	try{
                connection = getConnection();
                pstmt = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
    
                pstmt.setString(1, member.getName());
                pstmt.executeUpdate();
                rs = pstmt.getGeneratedKeys();
    
                if(rs.next()){
                    member.setId(rs.getLong(1));
                } else{
                    throw new SQLException("id fails");
                }
    
                return member;
    
            } catch (Exception e) {
                throw new IllegalStateException(e);
            } finally {
                close(connection, pstmt, rs);
            }

     

     

    이제 config에서 bean 설정을 바꿔주면 save를 통해 h2 데이터베이스에 제대로 저장이 되는지 확인할 수 있다.

     
     
     

    댓글

Designed by Tistory.