체스 미션을 하면서 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 사용법 검색하면 스프링이랑 같이 많이 사용하던데 스프링 학습 전에 미리 학습해본 느낌이다.
이 방법대로 따라 하다가 안되면 댓글 남겨주세요 !!
'우아한테크코스' 카테고리의 다른 글
1차 데모데이 회고 (0) | 2023.07.24 |
---|---|
책임 연쇄 패턴을 사용해서 지하철 추가 요금 정책을 반영해보자 (0) | 2023.06.16 |
레벨 1 - 레벨 로그 (0) | 2023.03.29 |
[우테코 프리코스] 5기 합격 (0) | 2023.01.04 |
[우테코 프리코스] 최종 코딩 테스트 (1) | 2023.01.04 |