Everyday Dev System

도커 컨테이너 생성 및 실행하기 본문

내배캠 주요 학습/JPA 심화

도커 컨테이너 생성 및 실행하기

chaeyoung- 2023. 7. 28. 16:11

 

1. 인텔리제이에서 docker 백그라운드 설정 확인

 

터미널 콘솔 창에 docker 명령어를 입력해서

도커 명령어들을 조회한다.

이것이 실행이 된다면, 도커가 백그라운드에서 running 중이라는 의미이다.

docker 명령어가 안된다면, 인텔리제이 혹은 터미널을 재시작해봐야 한다.

 

아래와 같이 docker desktop에서 running 중임을 확인할 수도 있다.

 

 

 

 

 

2. 백그라운드에 도커가 돌아가는 것을 확인한 후 아래 코드 입력

docker run -p 5432:5432 -e POSTGRES_PASSWORD=pass -e POSTGRES_USER=chaeyoung -e POSTGRES_DB=messenger --name postgres_boot -d postgres

 

docker를 run해서 컨테이너를 띄우겠다. 

-p는 포트번호를 내 로컬포트 5432에 띄우겠다. 서버의 포트번호를 연결하겠다. (-p 5432:5432 -> 앞에가 로컬 포트: 뒤에가 서버 포트번호

 

-e POSTGRES_PASSWORD=pass 는 환경 변수로 POSTGRES_PASSWORD를 pass로 지정했다.

-e POSTGRES_USER=chaeyoung 은 환경 변수로 POSTGRES_USER를 chaeyoung으로 지정했다. 본인의 이름

-e POSTGRES_DB=messenger 도 환경 변수로 지정.

--name 은 컨테이너 이름 지정하는 것이다. postgres_boot 로 컨테이너 이름 지정.

인텔리제이 터미널 콘솔창
docker desktop 화면

 

 

 

 

3. 도커 실행하기

docker exec -i -t postgres_boot bash

postgres_boot 해당 컨테이너 명으로 접속해서 bash 명령어를 실행하겠다는 의미

 

해당 명령어를 통해 root계정으로 접속해 컨테이너를 bash 환경으로 들어온 것을 알 수 있다.

 

 

 

 

4. 계정 변경

su - postgres

psql --username chaeyoung --dbname messenger

현재 계정을 postgres 로 변경한다.

chaeyoung 유저이름으로 messenger db에 접속합니다.

 

 

 

\list 명령어를 치면 DB 리스트가 나옴.

\dt 는 테이블 리스트 조회 (아래는 테이블 생성이 아직 안되었기 때문에 안나옴)

 

 

 

public class JDBCTest {

  @Test
  @DisplayName("JDBC DB 연결 실습")
  void jdbcTest() throws SQLException {
    // given

		// docker run -p 5432:5432 -e POSTGRES_PASSWORD=pass -e POSTGRES_USER=chaeyoung -e POSTGRES_DB=messenger --name postgres_boot -d postgres

    // docker exec -i -t postgres_boot bash
    // su - postgres
    // psql --username teasun --dbname messenger
    // \list (데이터 베이스 조회)
    // \dt (테이블 조회)

    // IntelliJ Database 에서도 조회

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

    // when
    try (Connection connection = DriverManager.getConnection(url, username, password)) {
      try {
        String creatSql = "CREATE TABLE ACCOUNT (id SERIAL PRIMARY KEY, username varchar(255), password varchar(255))";
        try (PreparedStatement statement = connection.prepareStatement(creatSql)) {
          statement.execute();
        }
      } catch (SQLException e) {
        if (e.getMessage().equals("ERROR: relation \"account\" already exists")) {
          System.out.println("ACCOUNT 테이블이 이미 존재합니다.");
        } else {
          throw new RuntimeException();
        }
      }
    }

    // then
		// DB 확인
  }

  @Test
  @DisplayName("JDBC 삽입/조회 실습")
  void jdbcInsertSelectTest() throws SQLException {
    // given
    String url = "jdbc:postgresql://localhost:5432/messenger";
    String username = "teasun";
    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");
  }
}