본문 바로가기

우아한테크코스

h2 database 를 사용해서 InMemoryDao Test 하기

체스 미션을 하면서 DB 연결을 배우게 되었고 그에 따라 DB 에 값이 제대로 동작하는지 확인하는 테스트가 필요해졌다.

하지만 코드를 구현하면서 실제 사용하는 DB 에 바로 연결해서 테스트하기에는 위험성이 너무 컸고 

강의에서는 Dao interface 를 만들고

public interface ChessBoardDao {

    void create(ChessBoard chessBoard, String id);

    void updateBoard(ChessBoard chessBoard, String id);

    ChessBoard findChessBoardById(String id);

    void update(ChessBoard chessBoard, String id);
}

기능 구현을 할때는 InMemoryDao 를 이런식으로 껍데기만 만들어서 실제 DB 에 연결하기 전 Application 이 잘 돌아가는지 테스트하는 용도로만 사용했다.

 

public class InMemoryChessRoomDao implements ChessRoomDao {
    @Override
    public List<String> readRoomIds() {
        return null;
    }

    @Override
    public String readTurn(String id) {
        return "turn";
    }

    @Override
    public String create(String turn, String state) {
        return "null";
    }

    @Override
    public void updateTurn(String id, String turn) {

    }

    @Override
    public void updateState(String id, String state) {

    }
}

하지만 나는 실제 DB 와 연결 전에 어플리케이션이 잘 돌아가는지 확인하는 용도 외에도 DB 와 CRUD 동작이 제대로 되는지 확인하고 싶었다! 그래서 Test DB 를 만들어야 하는데 그때 H2 Database 를 많이 사용한다는 것을 보고 H2 Database 를 사용해서 Test DB 를 만들기로 했다.

 

H2 Database 란 자바로 작성된 관계형 데이터베이스 관리 시스템으로 용량이 매우 가볍고 Embedded  모드와 server mode 를 지원하여 인메모리 데이터베이스로 로컬환경, 테스트 환경에서 많이 쓰이는 데이터베이스라고 한다.

 

Mac OS 기준 H2 Database 설정 방법이다

우선 https://h2database.com/html/main.html 에서 All Platforms (zip, 9.5 MB) 를 다운로드 한다.

다운로드하면 /bin 폴더에 h2.sh 실행파일이 생기는데 해당 실행 파일을 실행시켜 준다.

(실행 권한을 주려면 chmod +x h2.sh 명령어를 입력해준다)

 

또 bin 폴더에 있는 h2-2.1.214.jar 파일을 chess 디렉토리로 이동해준뒤 build.gradle dependency 설정에 추가해준다 

아까 ./h2.sh 를 실행시키면 localhost:8082 로 해당 페이지가 뜬다. 연결을 누른다.

 

 

그리고 사용자 디렉토리에 해당 파일들이 잘 생성된 걸 확인한다.

 

그리고 다시 첫화면으로 가서  jdbc:h2:tcp://localhost/~/test 로 URL 을 변경하고 다시 접속한다.

그럼 콘솔 환경 설정은 끝났다.

인텔리제이에서도 동일한 환경을 확인할 수 있게 설정을 해보자.

 

dababase 제어창에서 + 를 눌러 import from URL 을 누르고 사진대로 설정을 해준 뒤 OK 를 누른다.

 

이때 OK 를 누르면 드라이버가 없다고 다운로드하라고 알람창이 뜰 수 있는데 다운로드 받아주면 된다.

이제 콘솔창과 똑같은 DB가 인텔리제이 제어창에도 나타나는 것을 확인할 수 있다.

CREATE TABLE 을 해보면

잘 생성되는 것을 확인할 수 있다.

 

콘솔로 볼때도 잘 생성이 되었다.

 

이제 InMemoryDao를 H2 Connection 을 사용하는 것으로 수정을 해본다.

public class H2Connection {
    public Connection getConnection() {
        // 드라이버 연결
        try {
            return DriverManager.
                    getConnection("jdbc:h2:tcp://localhost/~/test", "sa", "");
        } catch (final SQLException e) {
            throw new DBConnectionException("DB 연결 오류");
        }
    }
}

연결을 해주고

테스트시 pass!

 

그리고 DB 연결에 사용하는 쿼리문을 그대로 InMemoryDao 에 복붙해주고 

DB 연결만 

private final H2Connection h2Connection = new H2Connection();

를 사용하는 것으로 바꿔준다.

 

어플리케이션을 한번 실행해서 Test DB에 값이 잘 들어가는지 확인해보자.

 

new 를 입력하면 chess_room 에는 새로운 체스 방의 정보가, chess_board 에는 초기화된 체스 보드의 정보가 들어가 있어야 한다.

잘 들어가 있는 것을 확인했다! 😊

 

H2 Database 를 이용하여 Test DB 를 만들어서 DB 테스트 하는 방법을 학습해보았다.

Embedded mode 를 사용해서 DB 데이터가 로컬에(test.mv.db) 저장되어서 어플리케이션이 종료되었다 다시 실행해도 휘발되지 않고 남아있다. 

Inmemory mode 랑 동일한 줄 알았는데 다른거였다. Inmemory 로 사용하면 로컬에 저장되지 않고 메모리에만 가지고 있기 때문에 어플리케이션이 종료되면 DB 정보가 휘발된다.

 

H2 Database 사용법 검색하면 스프링이랑 같이 많이 사용하던데 스프링 학습 전에 미리 학습해본 느낌이다.

 

이 방법대로 따라 하다가 안되면 댓글 남겨주세요 !!