MySQL 데이터베이스 설정 및 H2에서 MySQL로의 전환

날아올라돼지야·2024년 8월 27일
0

이 챕터에서는 현재 마이크로서비스가 사용하는 임베디드 H2 데이터베이스를 실제 MySQL 데이터베이스로 전환하는 과정을 설명합니다. 이를 통해 로컬 환경에서 실제 MySQL 데이터베이스를 Docker 컨테이너로 설정하고, 각 마이크로서비스가 이 데이터베이스를 사용할 수 있도록 코드 변경을 수행합니다. 각 단계를 상세히 설명하겠습니다.

1. 섹션 7 폴더 준비

  • 새로운 섹션을 위한 폴더를 생성합니다.
  • Section 7이라는 폴더를 생성한 후, 이전 섹션(v2-spring-cloud-config)의 코드를 복사하여 이 폴더에 붙여넣습니다.
  • 이로써 이전 섹션에서 사용했던 모든 코드와 설정을 새로운 섹션으로 가져오게 됩니다.

2. Spring Cloud Bus 및 Config Monitor 관련 코드 제거

  • Spring Cloud BusSpring Cloud Config Monitor는 더 이상 사용하지 않기로 하여, 이에 관련된 코드와 의존성을 제거합니다.
  • pom.xml 파일에서 spring-cloud-starter-bus-amqpspring-cloud-config-monitor 의존성을 삭제합니다.
  • application.yml 파일에서 RabbitMQ 관련 설정을 삭제합니다.
  • 이 작업은 config server뿐만 아니라 accounts, loans, cards 마이크로서비스에도 동일하게 적용됩니다.
  • 이렇게 함으로써 RabbitMQ와 관련된 컨테이너 의존성을 제거하여 로컬 시스템의 리소스 사용을 줄일 수 있습니다.

3. Docker를 이용한 MySQL 데이터베이스 설정

  • MySQL 데이터베이스를 로컬에 설치하지 않고, Docker를 이용해 간편하게 설정합니다.
  • 각 마이크로서비스(accounts, loans, cards)에 대해 별도의 MySQL 데이터베이스를 생성합니다.
  • 이를 위해, Docker 명령어를 사용하여 MySQL 컨테이너를 실행하고, 데이터베이스를 생성합니다.
  • Docker 명령어:
    docker run -p 3306:3306 --name accountsDB -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=accountsDB -d mysql
    docker run -p 3307:3306 --name loansDB -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=loansDB -d mysql
    docker run -p 3308:3306 --name cardsDB -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=cardsDB -d mysql
  • 이 명령어들은 각각 accountsDB, loansDB, cardsDB라는 이름의 MySQL 컨테이너를 생성하고, 해당 컨테이너가 로컬 시스템의 3306, 3307, 3308 포트를 통해 접근할 수 있도록 설정합니다.

4. SQL 클라이언트를 사용한 데이터베이스 연결 확인

  • Docker로 생성한 MySQL 데이터베이스가 정상적으로 동작하는지 확인하기 위해 SQL 클라이언트를 사용합니다.
  • SQL Electron이라는 가벼운 GUI 클라이언트를 사용하여 데이터베이스에 연결합니다.
  • 연결 설정:
    • AccountsDB:
      • Server Address: localhost
      • Port: 3306
      • Username: root
      • Password: root
      • Database: accountsDB
    • LoansDB:
      • Server Address: localhost
      • Port: 3307
      • Username: root
      • Password: root
      • Database: loansDB
    • CardsDB:
      • Server Address: localhost
      • Port: 3308
      • Username: root
      • Password: root
      • Database: cardsDB
  • 각 데이터베이스가 성공적으로 생성되고 연결되는지 확인합니다.

5. H2 데이터베이스에서 MySQL로 전환하기 위한 코드 변경

  • 데이터베이스가 정상적으로 설정된 후, 각 마이크로서비스가 더 이상 H2 데이터베이스를 사용하지 않고 MySQL 데이터베이스를 사용하도록 코드 변경을 수행합니다.
  • 각 마이크로서비스의 application.yml 파일을 수정하여 MySQL 데이터베이스 설정을 반영합니다.
  • 예를 들어, spring.datasource.url, spring.datasource.username, spring.datasource.password와 같은 속성을 수정하여 MySQL 데이터베이스와 연결되도록 합니다.

6. H2 데이터베이스 의존성 제거 및 MySQL 의존성 추가

  • 각 마이크로서비스(accounts, cards, loans)의 pom.xml 파일에서 H2 데이터베이스 의존성을 제거합니다.
  • H2 의존성 대신 MySQL 커넥터 의존성을 추가합니다:
    <dependency>
        <groupId>com.mysql</groupId>
        <artifactId>mysql-connector-j</artifactId>
    </dependency>
  • 이 변경을 통해 마이크로서비스가 MySQL 데이터베이스에 연결할 수 있도록 설정합니다.

7. application.yml 파일 설정 변경

  • 각 마이크로서비스의 application.yml 파일을 수정하여, MySQL 데이터베이스 연결 설정을 추가합니다.
  • 기존 H2 관련 설정을 삭제하고, MySQL 데이터베이스 연결 정보를 추가합니다.
  • 예시(Accounts Microservice):
    spring:
      datasource:
        url: jdbc:mysql://localhost:3306/accountsDB
        username: root
        password: root
        sql:
          init:
            mode: always
      jpa:
        show-sql: true
  • 여기서 jdbc:mysql://localhost:3306/accountsDB는 MySQL 데이터베이스의 연결 URL을 나타내며, accountsDB는 사용할 데이터베이스 이름입니다.
  • spring.datasource.sql.init.modealways로 설정하여, 애플리케이션 시작 시 스키마 스크립트(schema.sql)가 항상 실행되도록 합니다.

8. 각 마이크로서비스에 동일한 설정 적용

  • 동일한 설정을 cardsloans 마이크로서비스의 application.yml 파일에도 적용합니다.
  • 각 마이크로서비스의 데이터베이스 이름과 포트 번호를 적절히 변경합니다:
    • Cards Microservice:
      spring:
        datasource:
          url: jdbc:mysql://localhost:3308/cardsDB
          username: root
          password: root
          sql:
            init:
              mode: always
        jpa:
          show-sql: true
    • Loans Microservice:
      spring:
        datasource:
          url: jdbc:mysql://localhost:3307/loansDB
          username: root
          password: root
          sql:
            init:
              mode: always
        jpa:
          show-sql: true

9. 애플리케이션 시작 및 데이터베이스 테이블 생성 확인

  • 모든 마이크로서비스가 올바르게 MySQL 데이터베이스와 연결되고, 스키마 스크립트를 실행하여 테이블을 생성하도록 설정합니다.
  • IntelliJ IDEA에서 accounts, cards, loans 마이크로서비스를 시작합니다.
  • SQL 클라이언트(SQL Electron)를 사용하여 각 데이터베이스에 연결하고, 테이블이 생성되었는지 확인합니다.
    • 테이블이 생성되지 않은 경우, 설정이 올바른지 확인하고 다시 시작합니다.

10. Postman을 사용한 API 테스트

  • Postman을 사용하여 마이크로서비스의 API를 테스트합니다.
  • 예를 들어, createAccount, createCard, createLoan API를 사용하여 데이터베이스에 데이터를 저장합니다.
  • 각 마이크로서비스의 데이터가 데이터베이스에 정상적으로 저장되었는지 SQL 클라이언트를 통해 확인합니다.

11. Docker 컨테이너 삭제 및 데이터 손실 시나리오

  • Docker 컨테이너 삭제의 위험성:
    • Docker 컨테이너를 삭제하면 해당 컨테이너에 저장된 모든 데이터가 영구적으로 손실됩니다.
    • 이를 데모하기 위해, cards 데이터베이스 컨테이너를 삭제한 후 다시 생성합니다.
    • 컨테이너 삭제 후, 데이터를 다시 확인했을 때 데이터가 손실되었음을 확인합니다.

12. Postman에서 데이터 검증

  • API를 통해 데이터베이스에서 데이터를 가져오는 작업을 수행하여 데이터가 올바르게 저장 및 불러와지는지 확인합니다.
  • 삭제된 컨테이너와 연결된 데이터베이스는 데이터가 손실되었기 때문에, 해당 API 호출 시 데이터가 반환되지 않습니다.

13. 결론

  • Docker를 사용하여 MySQL 데이터베이스를 로컬에서 쉽게 설정하고, 마이크로서비스와 연결하는 방법을 배웠습니다.
  • Docker 컨테이너를 삭제하면 데이터가 손실될 수 있으므로, 데이터를 영구적으로 보존하려면 컨테이너 삭제에 주의해야 합니다.

이 과정을 통해 MySQL 데이터베이스를 로컬 환경에서 마이크로서비스와 연동할 수 있게 되었으며, 데이터 저장 및 조회 작업을 성공적으로 수행할 수 있었습니다.

profile
무슨 생각하며 사니

0개의 댓글