Everyday Dev System

자바 어플리케이션에서 도커 컨테이너에 접속 select, insert 수행 본문

내배캠 주요 학습/JPA 심화

자바 어플리케이션에서 도커 컨테이너에 접속 select, insert 수행

chaeyoung- 2023. 7. 28. 17:47

도커 컨테이너 생성이 선행되어 있어야 합니다.

이전글 참조: 

 

 

 

또한, build.gradle 파일에 

postgreSQL 의존성 추가가 필요합니다!

 implementation 'org.postgresql:postgresql:42.2.27'

 

 

 

 

 

 

 

1. 테이블 생성 → ' ACCOUNT '

    @Test
    @DisplayName("Table 생성 실습")
    void jdbcTest() {
        DriverManager driverManager;

        String url = "jdbc:postgresql://localhost:5432/messenger";
        String username = "chaeyoung";
        String password= "pass";

        //when
        try {
            Connection connection = DriverManager.getConnection(url,username,password);
            String createSql = "CREATE TABLE ACCOUNT (id SERIAL PRIMARY KEY, username varchar(255), password varchar(255))";
            PreparedStatement statement = connection.prepareStatement(createSql);
            statement.execute();

            statement.close();
            connection.close();
        }catch (SQLException e){
            e.printStackTrace();
        }
    }

 

만약, 아래와 같이 작성하면 try문이 끝나면 try() 괄호 안에 들어간 객체를 자동으로 close() 해줍니다.
        try (Connection connection = DriverManager.getConnection(url,username,password)){
            String createSql = "CREATE TABLE ACCOUNT (id SERIAL PRIMARY KEY, username varchar(255), password varchar(255))";
            try(PreparedStatement statement = connection.prepareStatement(createSql)){
                statement.execute();
            }
        }catch (SQLException e){
            e.printStackTrace();
        }

 

 

위와 같이 생성됨을 알 수 있습니다.

 

 

조회해보면 저장된 정보가 없기 때문에 빈 테이블이 표시됩니다.

인텔리제이 DataBase 카테고리에 postgres 데이터 소스를 추가하고 테이블 생성을 확인할 수 있다.

터미널로 접속하지 않아도 됨.

 

 

 

2. 데이터 저장하기

public class JDBCTest {

  @Test
  @DisplayName("JDBC 삽입/조회 실습")
  void jdbcInsertSelectTest() throws SQLException {
    // given
    String url = "jdbc:postgresql://localhost:5432/messenger";
    String username = "chaeyoung";
    String password = "pass";

    // when
    try (Connection connection = DriverManager.getConnection(url, username, password)) {
      System.out.println("Connection created: " + connection);

      String insertSql = "INSERT INTO ACCOUNT (id, username, password) VALUES ((SELECT coalesce(MAX(ID), 0) + 1 FROM ACCOUNT A), 'user1', 'pass1')";
      try (PreparedStatement statement = connection.prepareStatement(insertSql)) {
        statement.execute();
      }

      // then
      String selectSql = "SELECT * FROM ACCOUNT";
      try (PreparedStatement statement = connection.prepareStatement(selectSql)) {
        var rs = statement.executeQuery();
        while (rs.next()) {
          System.out.printf("%d, %s, %s", rs.getInt("id"), rs.getString("username"),
              rs.getString("password"));
        }
      }
    }
  }


  @Test
  @DisplayName("JDBC DAO 삽입/조회 실습")
  void jdbcDAOInsertSelectTest() throws SQLException {
    // given
    AccountDAO accountDAO = new AccountDAO();

    // when
    var id = accountDAO.insertAccount(new AccountVO("new user", "new password"));

    // then
    var account = accountDAO.selectAccount(id);
    assert account.getUsername().equals("new user");
  }
}

위와 같이 데이터가 잘 삽입되었다.

 

 

 

 

3. DAO 클래스 활용하기

파일 구조

public class JDBCTest {

  @Test
  @DisplayName("JDBC DAO 삽입/조회 실습")
  void jdbcDAOInsertSelectTest() throws SQLException {
    // given
    AccountDAO accountDAO = new AccountDAO();

    // when
    var id = accountDAO.insertAccount(new AccountVO("new user", "new password"));

    // then
    var account = accountDAO.selectAccount(id);
    assert account.getUsername().equals("new user");
  }
}

 

dao 클래스

package jdbc.dao;

import jdbc.vo.AccountVO;

import java.sql.*;

public class AccountDAO {

    // jdbc 관련 변수
    private Connection conn = null;
    private PreparedStatement stmt = null;
    private ResultSet rs = null;
    private static final String url = "jdbc:postgresql://localhost:5432/messenger";
    private static final String username = "chaeyoung";
    private static final String password= "pass";

    // SQL 쿼리
    private final String ACCOUNT_INSERT = "INSERT INTO account(ID, USERNAME, PASSWORD) "
            + "VALUES((SELECT coalesce(MAX(ID), 0) + 1 FROM ACCOUNT A), ?, ?)";
    private final String ACCOUNT_SELECT = "SELECT * FROM account WHERE ID = ?";


    // CRUD 기능 메소드
    public Integer insertAccount(AccountVO vo){
        var id = -1;
        try {
            String[] returnId = {"id"};
            conn = DriverManager.getConnection(url,username,password);
            stmt = conn.prepareStatement(ACCOUNT_INSERT, returnId);
            // 삽입된 행 또는 행에서 반환해야 할 열을 나타내는 열 이름 배열 변수 (returnId)
            stmt.setString(1, vo.getUsername());
            stmt.setString(2, vo.getPassword());
            stmt.executeUpdate(); // 해당 메서드는 update 한 갯수를 반환함.

            try(ResultSet rs = stmt.getGeneratedKeys()) {
                if(rs.next()) {
                    id = rs.getInt(1);
//                    id = rs.getString(1);

                }
            }
        }catch(SQLException e){
            e.printStackTrace();
        }
        return id;
    }

    public AccountVO selectAccount(Integer id) {
        AccountVO vo = null;

        try{
            conn = DriverManager.getConnection(url,username, password);
            stmt = conn.prepareStatement(ACCOUNT_SELECT);
            stmt.setInt(1,id);
            var rs = stmt.executeQuery();

            if(rs.next()) {
                vo = new AccountVO();
                vo.setId(rs.getInt("ID"));
                vo.setUsername(rs.getString("USERNAME"));
                vo.setPassword(rs.getString("PASSWORD"));
            }

        }catch(SQLException e){
            e.printStackTrace();
        }
        return vo;
    }

}
stmt = conn.prepareStatement(ACCOUNT_INSERT, returnId);
해당 메서드의  2번째 파라미터에 들어갈 값은 삽입된 행 또는 행에서 반환해야 할 열을 나타내는 열 이름 배열 변수 

 

 

vo 클래스

package jdbc.vo;

public class AccountVO {

    private Integer id;
    private String username;
    private String password;

    public AccountVO(String username, String password){
        this.username = username;
        this.password = password;
    }

    public AccountVO() {

    }

    public void setId(Integer id) {
        this.id = id;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public void setPassword(String password){
        this.password = password;
    }

    public String getUsername() {
        return this.username;
    }

    public String getPassword() {
        return this.password;
    }


}