본문 바로가기

Tech/Spring | SpringBoot

[SpringBoot] Database 연동 - 2 (JDBC)

반응형

1. JDBC

- JDBC ?

JDBC Java Database Connectivity 줄임말로, DB 접근할 있도록 자바에서 제공하는 자바 표준 SQL 인터페이스 API 이다. 다양한 종류의 RDBMS 접속하고 SQL 문을 수행하여 처리하는 작업을 사용된다.

 

JDBC 통한 자바 애플리케이션과 DB 구조는 다음과 같다.

 

자바 애플리케이션 - JDBC API - JDBC Driver - Database

 

JDBC 인터페이스 API 이기 때문에, DBMS 맞는 JDBC 드라이버를 설정해주어야 한다. JDBC 드라이버는 실제 DBMS 통신을 수행하는 자바 클래스로 jar 파일로 제공됩니다. JDBC 드라이버는 DBMS url 계정 정보 등을 입력받아서 DB 연결 객체를 생성하고 이를 통해서 DB 연결을 수행합니다.

 

Spring 사용하지 않는 경우에는 DriverManager 통해서 직접 DB 정보와 계정 정보 등을 설정해주고 연결을 맺어야 하지만 Spring 에서는 application.properties 에서 DataSource 설정을 통해서 DB 연결 정보를 설정할 있다.

- JDBC 설정 및 사용

Build.gradle 에 jdbc 라이브러리 의존성 추가와 application.properties 에 사용할 database 정보를 datasource 에 설정해준다.

자세한 내용은 1편에 추가되어 있으니 생략한다.

 

- 1편 링크: https://jammdev.tistory.com/194

 

[SpringBoot] Database 연동 - 1 (DataSource, h2 database)

1.  DataSource DataSource 는 실제 물리적인 database 들과의 연결을 위한 팩토리이다. DriverManager 클래스의 대체제로 username, password 과 URL 을 사용하여 database 와 연결합니다. DataSou..

jammdev.tistory.com

- JDBC 구현

JDBC 사용하여 DB 연결하고 User 라는 객체를 다루는 예제 코드이다.

appcation.properties 설정한 값으로 설정된 DataSource 에서 Connection 얻고, PreparedStatement 통해 쿼리문을 작성한다. 작성한 쿼리문을 실행하여서 Database 작업을 수행한다.
 

@Repository("JdbcUserRepository")
public class JdbcUserRepository implements UserRepository {

    @Autowired
    private DataSource dataSource;

    private Connection getConnection() {
        return DataSourceUtils.getConnection(dataSource);
    }

    private void close(AutoCloseable ... objs) {
        try {
            for(AutoCloseable obj : objs) {
                obj.close();
            }
        } catch(Exception e) 

            e.printStackTrace();
        }
    }

    @Override
    public void saveUser(User user) {
        String sql = String.format("INSERT INTO %s VALUES (?, ?)", TABLE);
        Connection conn = null;
        PreparedStatement pstmt = null;
        try {
            conn = getConnection();
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, user.getId());
            pstmt.setString(2, user.getName());
            pstmt.executeUpdate();
        } catch (Exception e) {
            throw new IllegalStateException(e);
        } finally {
            close(conn, pstmt);
        }
    }

    @Override
    public List<User> findAllUsers() {
        String sql = String.format("SELECT * FROM %s", TABLE);
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        List<User> users = new ArrayList<>();
        try {
            conn = getConnection();
            pstmt = conn.prepareStatement(sql);
            rs = pstmt.executeQuery();
            while(rs.next()) {
                User user = new User(rs.getString("id"), rs.getString("name"));
                users.add(user);
            }
        } catch (Exception e) {
            throw new IllegalStateException(e);
        } finally {
            close(conn, pstmt, rs);
        }
        return users;
    }

    @Override
    public User findById(String id) {
        String sql = String.format("SELECT * FROM %s WHERE ID=?", TABLE);
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        User user = null;
        try {
            conn = getConnection();
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, id);
            rs = pstmt.executeQuery();
            if(rs.next()) user = new User(rs.getString("id"), rs.getString("name"));
            else throw new SQLException(String.format("No matching id. id=%s", id));
        } catch (Exception e) {
            throw new IllegalStateException(e);
        } finally {
            close(conn, pstmt, rs);
        }
        return user;
    }

    @Override
    public void updateUser(User user) {
        String sql = String.format("UPDATE %s SET NAME=? WHERE ID=?", TABLE);
        Connection conn = null;
        PreparedStatement pstmt = null;
        try {
            conn = getConnection();
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, user.getName());
            pstmt.setString(2, user.getId());
            pstmt.executeUpdate();
        } catch (Exception e) {
            throw new IllegalStateException(e);
        } finally {
            close(conn, pstmt);
        }
    }

    @Override
    public void removeUser(String id) {
        String sql = String.format("DELETE FROM %s WHERE ID=?", TABLE);
        Connection conn = null;
        PreparedStatement pstmt = null;
        try {
            conn = getConnection();
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, id);
            pstmt.executeUpdate();
        } catch (Exception e) {
            throw new IllegalStateException(e);
        } finally {
            close(conn, pstmt);
        }
    }
}

 

위의 예제는 User 라는 객체를 읽고, 쓰고, 수정하고, 삭제하는 기본 DML 작업을 수행하는 메서드들을 구현한 예제이다.

connection 과 preparedStatement 와 같은 자원들은 사용이 끝나면 close 해준다.

[Reference]

 

[Spring] Spring JDBC, DataSource란?

DataSource란? DB와 관계된 커넥션 정보를 담고있으며 빈으로 등록하여 인자로 넘겨준다. → 이 과정을 통해 Spring은 DataSource로 DB와의 연결을 획득한다. DB 서버와의 연결을 해준다. DB Connetion pooling기

esoongan.tistory.com

 

JDBC - JDBC란?

JDBC - Java Database Connectivity - 자바에서 DB 프로그래밍을 하기 위해 사용되는 API  ==> 데이터베이스 종류에 상관없다. JDBC API 사용 어플리케이션의 기본 구성 - JDBC 드라이버 : 각 DBMS..

dyjung.tistory.com

 

[spring] DB를 사용하는 주요 기술 5가지

Spring을 이용하여 DB를 사용하는 주요 접근 기술을 학습하고 정리한 내용입니다.

velog.io

 

반응형