본문 바로가기
BackEnd/Project

[Board] Ch02. 데이터베이스 접근 로직 테스트 정의(1)

by 개발 Blog 2024. 8. 6.

공부 내용을 정리하고 앞으로의 학습에 이해를 돕기 위해 작성합니다.

 

이번 시간에는 데이터베이스 접근 로직 테스트를 정의한다.

도메인 설계한 것을 토대로 데이터베이스와의 연결을 어떻게 사용할 것인지를 고민해야 한다.

또한, 어떤 DB를 사용할지, 실제 DB와 테스트 DB를 따로 둘 것인지 등의 몇 가지 생각해봐야 할 점들을 정리한다.

 

우선 프로젝트의 카드를 정리하고, 이슈 번호를 토대로 새로운 브랜치를 생성한다.

 

프로젝트 카드 정리

 

GitKraken에서 브랜치 생성

 

MySQL 설치 확인

 

IntelliJ에서 MySQL 데이터베이스 등록하기

다음으로 IntelliJ에서 Database를 등록하는 과정은 다음과 같다.

이 과정에서는 DataGrip 기능을 사용하여 MySQL 데이터베이스를 등록한다.

 

DataGrip의 장점

DataGrip은 IntelliJ IDEA에서 제공하는 데이터베이스 관리 도구로, 다음과 같은 장점이 있다:

  • 다양한 데이터베이스 지원: MySQL뿐만 아니라 PostgreSQL, Oracle, SQLite 등 다양한 데이터베이스를 지원하여 여러 데이터베이스를 쉽게 관리할 수 있다.
  • 사용자 친화적인 인터페이스: 직관적인 UI를 통해 데이터베이스 구조를 쉽게 파악하고 관리할 수 있다. 데이터베이스 탐색, 테이블 편집, 쿼리 작성 등이 용이하다.
  • 강력한 쿼리 편집기: 쿼리 자동 완성, 코드 포매팅, 오류 탐지 등 다양한 기능을 제공하여 쿼리 작성과 디버깅을 효율적으로 수행할 수 있다.
  • 통합된 개발 환경: IntelliJ IDEA와 통합되어 있어 별도의 도구 없이 코드 작성과 데이터베이스 관리를 동시에 할 수 있다. 이를 통해 개발 생산성을 크게 향상시킬 수 있다.

MySQL DB 등록

 

  • DataGrip 열기:
    • IntelliJ IDEA를 열고, 상단 메뉴에서 View > Tool Windows > Database를 선택하여 Database 창을 연다.
  • Data Source 추가하기:
    • Database 창에서 + 아이콘을 클릭하고, Data Source > MySQL을 선택한다.
  • MySQL 드라이버 설정:
    • MySQL을 선택한 후, 오른쪽에 나타나는 옵션에서 MySQL을 선택한다. IntelliJ가 자동으로 드라이버를 다운로드하고 설치한다.
  • 연결 설정:
    • 새로운 데이터 소스 창이 열리면, 다음 정보를 입력한다:
      • Host: localhost
      • Port: 3306
      • User: root
      • Password: 공백
      • Database: board 데이터베이스를 선택한다.
  • 연결 테스트:
    • 모든 정보를 입력한 후, Test Connection 버튼을 클릭하여 연결이 성공적으로 이루어지는지 확인한다.
    • 연결이 성공하면 Apply와 OK 버튼을 클릭하여 설정을 저장한다.

MySQL에서 데이터베이스 및 사용자 설정

root 계정 대신 사용할 새로운 유저 계정을 생성하고 권한을 부여하는 과정을 진행한다.

 

-- 데이터베이스 목록 확인
SHOW DATABASES;

-- 데이터베이스 생성
CREATE DATABASE board;

-- 사용자 생성
CREATE USER 'eunchan'@'localhost' IDENTIFIED BY 'asdfadsf!@#$';

-- 사용자 목록 확인
SELECT `user` FROM `mysql`.`user`;

-- 사용자의 권한 확인
SHOW GRANTS FOR 'eunchan'@'localhost';

-- 사용자에게 권한 부여
GRANT ALL ON `board`.* TO 'eunchan'@'localhost' WITH GRANT OPTION;

-- 권한 적용
flush privileges;

 

  • 데이터베이스 목록 확인
    • 현재 MySQL 서버에 존재하는 모든 데이터베이스의 목록을 확인한다.
  • 데이터베이스 생성
    • board라는 이름의 새 데이터베이스를 생성한다.
  • 사용자 생성
    • eunchan이라는 이름의 새 사용자를 생성하고, 비밀번호는 asdfadsf!@#$로 설정한다.
  • 사용자 목록 확인
    • MySQL 서버에 존재하는 모든 사용자 계정을 확인한다.
  • 사용자의 권한 확인
    • eunchan 사용자가 현재 가지고 있는 권한을 확인한다.
  • 사용자에게 권한 부여
    • eunchan 사용자에게 board 데이터베이스에 대한 모든 권한을 부여하고, 다른 사용자에게도 권한을 부여할 수 있는 옵션을 추가한다.
  • 권한 적용
    • 변경된 권한 설정을 MySQL 서버에 적용한다.

 

Spring Boot 프로젝트 설정

Spring Boot 프로젝트에서 데이터베이스에 접근하기 위한 기술을 설정한다. 이 예제에서는 JPA를 사용하여 MySQL 데이터베이스와 연동한다. 또한, 테스트용 임메모리 데이터베이스를 설정한다.

 

이를 위해 https://start.spring.io/ 에 접속한다.

explore를 누른 후 필요한 부분만 복사 후 build.gradle에 추가한다.

 

Spring Boot 프로젝트에서 JPA에 접근하기 위한 application.yaml 설정을 다음과 같이 작성한다.

이는 데이터베이스 연결 설정, JPA 관련 설정, 로깅 설정 등을 포함한다.

# 디버그 설정
debug=false
management.endpoints.web.exposure.include=*

# 로깅 설정
logging.level.com.fastcampus.projectboard=debug
logging.level.org.springframework.web.servlet=debug
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=trace

# 데이터베이스 설정
spring.datasource.url=jdbc:mysql://localhost:3306/board
spring.datasource.username=eunchan
spring.datasource.password=asdfasdf!@#$
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# JPA 설정
spring.jpa.defer-datasource-initialization=true
spring.jpa.hibernate.ddl-auto=create
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.default_batch_fetch_size=100

# H2 콘솔 설정
spring.h2.console.enabled=true
spring.sql.init.mode=always

1. 디버그 설정:
   - debug=false로 설정하여 디버그 모드를 비활성화한다. 이는 애플리케이션이 디버그 정보를 출력하지 않도록 설정하는 것이다.
   - management.endpoints.web.exposure.include=*로 모든 관리 엔드포인트를 노출시킨다. 이 설정은 Spring Boot Actuator의 모든 엔드포인트를 외부에 노출시키는 역할을 한다.

2. 로깅 설정:
   - 특정 패키지와 클래스에 대해 디버그 및 추적 로그를 활성화한다.
     - logging.level.com.fastcampus.projectboard=debug: com.fastcampus.projectboard 패키지에 대해 디버그 로그를 활성화한다. 이 패키지에서 발생하는 모든 디버그 메시지를 로그로 출력한다.
     - logging.level.org.springframework.web.servlet=debug: Spring Web MVC와 관련된 로그를 디버그 수준으로 출력한다. 이는 요청 처리 과정에서 발생하는 자세한 로그를 볼 수 있게 한다.
     - logging.level.org.hibernate.type.descriptor.sql.BasicBinder=trace: Hibernate에서 SQL 바인딩 과정을 추적 수준으로 출력한다. 이는 SQL 쿼리 실행 시 파라미터 바인딩 정보를 자세히 볼 수 있게 한다.

3. 데이터베이스 설정:
   - MySQL 데이터베이스에 연결하기 위한 설정을 정의한다.
     - spring.datasource.url : MySQL 데이터베이스의 URL을 설정한다. 여기서는 localhost의 3306 포트에서 board 데이터베이스에 연결한다.
     - spring.datasource.username: 데이터베이스에 접근하기 위한 사용자 이름을 설정한다.
     - spring.datasource.password: 데이터베이스에 접근하기 위한 비밀번호를 설정한다.
     - spring.datasource.driver-class-name: JDBC 드라이버의 클래스 이름을 설정한다. 이는 데이터베이스와의 연결을 가능하게 한다.

4. JPA 설정:
   - JPA 관련 설정을 정의한다.
     - spring.jpa.defer-datasource-initialization=true: 데이터 소스 초기화를 지연시킨다. 이는 데이터베이스 초기화 전에 다른 초기화 작업이 완료되도록 한다.
     - spring.jpa.hibernate.ddl-auto=create: 애플리케이션 시작 시 데이터베이스 스키마를 생성한다. 이는 기존의 테이블을 삭제하고 새로 생성하는 역할을 한다.
     - spring.jpa.show-sql=true: 실행되는 SQL을 콘솔에 출력한다. 이는 개발자가 실행된 SQL 쿼리를 쉽게 확인할 수 있게 한다.
     - spring.jpa.properties.hibernate.format_sql=true: SQL을 포맷팅하여 출력한다. 이는 SQL 쿼리를 가독성 있게 출력하는 설정이다.
     - spring.jpa.properties.hibernate.default_batch_fetch_size=100: 기본 배치 페치 크기를 100으로 설정한다. 이는 한 번에 페치할 엔터티의 수를 조정하여 성능을 최적화하는 설정이다.

5. H2 콘솔 설정:
   - H2 데이터베이스 콘솔을 활성화한다.
     - spring.h2.console.enabled=true: H2 콘솔을 활성화한다. 이는 내장형 H2 데이터베이스의 웹 콘솔을 사용할 수 있게 한다.
     - spring.sql.init.mode=always: 항상 SQL 초기화 모드를 사용한다. 이는 애플리케이션 시작 시마다 SQL 스크립트를 실행하여 데이터베이스를 초기화하는 설정이다.