본문 바로가기

Web Sever 개발과 CS 기초/스프링

JDBC와 SQL 쿼리를 사용한, Spring DB CRUD 기능 만들기

관련 내용

해당 프로젝트 깃허브

 

<Spring DB를 사용하기 위한 JDBC, Connection 기초>

  • JDBC 기술이 어떤 역할을 하는 지, 커넥션은 어떻게 획득하는 지, SQL 쿼리와 JDBC 사용법은 어떻게 되는지에 대한 설명

 [백엔드/스프링] - 스프링 DB 사용을 위한 JDBC에 대한 이해와 사용 방법

  • 커넥션 풀에 대한 이해와, DataSource 인터페이스를 사용한, 커넥션 얻어오기 통일화 방법

[백엔드/스프링] - ConnectionPool에 대한 이해와 DataSource 인터페이스로 커넥션을 획득하는 방법 통일하기

개요와 목적

이번 글에서는 자바의 JDBC 기술과 MySQL을 사용해서, 텍스트 기능을 하는 API를 만들어 보려고 한다.

  • DB에 Id 별텍스트 작성하기(write)
  • DB Id 별텍스트 조회하기(read)
  • DB Id 별 텍스트 업데이트하기(update)
  • DB Id 별 텍스트 삭제하기(delete)

개발 환경

  • SpringBoot(gradle) - 2.7.3
  • mysql-connector-java - 8.0.28

JDBC - DB 커넥션 획득 방법

Spring Server와 MySQL을 연결하기 위해서는 MySQL의 커넥션을 획득해야 한다. 이번에는 JDBC 인터페이스 기술의 DriverManager 클래스를 사용해서, 커넥션을 획득해보자.

SpringHTTPServer\src\main\java\com\example\springhttpserver\HTTPServer\repository\JdbcStringRepository.java

@Repository
@RequiredArgsConstructor
public class JdbcStringRepository {

    public Connection connectJdbc() throws SQLException {
        String url = "jdbc:mysql://127.0.0.3:3306/jdbc";
        String username = "hwang";
        String password = "5510";
        return DriverManager.getConnection(url
            , username
            , password);
    }
}

드라이버 매니저에 URL과 USERNAME, PASSWORD를 넣으면 URL 규칙에 따라 데이터 베이스 드라이버를 선택해서 데이터 드라이버가 작동하여 해당 DB의 커넥션을 가져와 반납한다. 해당 커넥션을 통해서 SQL 쿼리를 보내는 방식으로 DB와 소통할 수 있다.

JDBC - SQL 쿼리를 사용한 CRUD 기능 구현

텍스트 추가하기

DB에 아이디 별 텍스트를 추가하기 위해 아래 URL로 요청을 하게 되면 리포지토리의 save메소드가 실행된다.

SpringHTTPServer\src\main\java\com\example\springhttpserver\HTTPServer\controller\TextController.java

@PostMapping("/api/text/{textId}")

SpringHTTPServer\src\main\java\com\example\springhttpserver\HTTPServer\repository\JdbcStringRepository.java

public void save(Connection connection, String textId, String messageBody) {
    String sql = "INSERT INTO storage (txt_id, message) VALUES(?,?)";
    try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
        preparedStatement.setString(1, textId);
        preparedStatement.setString(2, messageBody);
        preparedStatement.executeUpdate();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

PreparedStatement 는 Statement 의 자식 타입인데, ? 를 통한 파라미터 바인딩을 가능하게 해준다.

pstmt.executeUpdate()를 통해서, 준비 된 SQL을 커넥션을 통해 데이터 베이스에 전달한다.

텍스트 조회하기

DB에 아이디 별 텍스트를 확인하기 위해 아래 URL로 요청을 하게 되면 리포지토리의 findByTextId 메소드가 실행된다.

SpringHTTPServer\src\main\java\com\example\springhttpserver\HTTPServer\controller\TextController.java

@GetMapping("/api/text/{textId}")

SpringHTTPServer\src\main\java\com\example\springhttpserver\HTTPServer\repository\JdbcStringRepository.java

public StorageDto findByTextId(Connection connection, String textId) {
    String sql = "SELECT * FROM storage WHERE txt_id=?";
    StorageDto storageDto = null;
    try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
        preparedStatement.setString(1, textId);
        try (ResultSet resultSet = preparedStatement.executeQuery()) {
            while (resultSet.next()) {
                String id = resultSet.getString(2);
                String message = resultSet.getString(3);
                storageDto = new StorageDto(id, message);
            }
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return storageDto;
}

텍스트 추가와 다르게, preparedStatement.executeQuery()를 통해서, 해당 조건에 해당하는 컬럼의 정보를 담은 ResultSet을 가져온다.

그리고 resultSet의 진짜 데이터가 담겨 있는 두 번째 커서로 이동한 후에, 정보를 dto에 담아 전달한다.

텍스트 업데이트 하기

DB에 아이디 별 텍스트를 업데이트 위해 아래 URL로 요청을 하게 되면 리포지토리의 update메소드가 실행된다.

SpringHTTPServer\src\main\java\com\example\springhttpserver\HTTPServer\controller\TextController.java

@PutMapping("/api/text/{textId}")

SpringHTTPServer\src\main\java\com\example\springhttpserver\HTTPServer\repository\JdbcStringRepository.java

public void update(Connection connection, String textId, String messageBody) {
    String sql = "UPDATE storage SET message=? WHERE txt_id=?";
    try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
        preparedStatement.setString(1, messageBody);
        preparedStatement.setString(2, textId);
        preparedStatement.executeUpdate();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

sql 쿼리에 UPDATE 와 txt_id 조건을 지정하고 excuteUpdate로 쿼리를 DB에 보낸다.

텍스트 삭제 하기

DB에 아이디 별 텍스트를 삭제 위해 아래 URL로 요청을 하게 되면 리포지토리의 delete메소드가 실행된다.

SpringHTTPServer\src\main\java\com\example\springhttpserver\HTTPServer\controller\TextController.java

@DeleteMapping("/api/text/{textId}")

SpringHTTPServer\src\main\java\com\example\springhttpserver\HTTPServer\repository\JdbcStringRepository.java

public void delete(Connection connection, String textId) {
    String sql = "DELETE FROM storage WHERE txt_id=?";
    try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
        preparedStatement.setString(1, textId);
        preparedStatement.executeUpdate();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

sql 쿼리에 DELETE와 조건을 지정해서 excuteUpdate로 DB에게 보낸다.