Spring

[Spring] Spring Boot + Oracle Cloud 연동하여 배포하기 [2] - DB 연동

PlatinumeOlive 2024. 4. 3. 23:50

이전 포스팅에서는 오라클 클라우드 인스턴스를 할당 받고, SSH를 통해 서버에 접속까지 완료하였습니다.

 

[Spring] Spring Boot + Oracle Cloud 연동하여 배포하기 [1] - 인스턴스 할당받기

서론 이번 포스팅에서는 스프링 부트와 오라클 클라우드를 연동하여 프로젝트를 진행했던 경험을 작성해보려고 합니다. 아직 오라클 클라우드를 연결 할 때 참고할 자료도 많이 없고 아마존과

100cblog.tistory.com

지금 바로 빌드해서 오라클 서버에 보낼수도 있지만, 프로젝트의 정상 작동은 어렵습니다.

 

바로 DB에 연결되어 있지 않기 때문입니다. 로컬 환경에서는 편리하게 H2를 사용하였지만, 오라클 서버엔 H2가 없기 때문에 미리 DB에 연결해놓고 빌드해야 정상적으로 사용이 가능합니다. 천천히 한번 사용해보도록 하겠습니다.

 

이전에도 언급하였듯, 용량과 메모리 등의 자원이 제한되어 있기 때문에, 직접 MySql과 같은 DBMS를 설치하여 사용하기엔 무리가 있습니다.

 

그래서 오라클에도 아마존 RDS처럼, DBMS의 역할을 수행하는 '자율운영 DB'가 존재합니다. 클라우드에 자율운영 DB를 생성하고, SQL Deveolper 툴을 통해 직접 관리도 가능하며 스프링 부트 프로젝트에도 연동하여 사용할 수 있습니다.

 

자율운영 데이터베이스 생성

목록 -> Oracle Database -> 자율운영 데이터 베이스를 클릭한 후 , 이동된 페이지에서 자율운영 데이터 베이스를 생성합니다.

이름은 자유롭게 지정해주시고, 작업 로드 유형은 CRUD를 진행할 것이기 때문에 트랜잭션 처리로 진행하겠습니다. 위 사진 맨 아래를 보면 데이터베이스 구성 -> 항상 무료가 있는데 이것은 꼭 체크해주셔야 합니다. (무료로 사용하기 위해 오라클로 왔는데, 여기서 돈나가면 안됩니다...)

 

나머진 따로 건들 것 없이, 관리자 인증서생성에 비밀번호만 적어주시면 되는데, 이것 역시 까먹으면 안됩니다. 어딘가에 기록해 두어야 합니다.

 

생성완료!

 

원격 DB 접속

오라클에서 제공하는 SQL Developer가 있습니다. 이것을 인터넷에서 다운받아 사용하면 됩니다. 다운로드 방법은 따로 다루지 않겠습니다.

 

그 전에, 우리가 만들었던 데이터베이스에 들어가서 데이터베이스 접속 -> 전자지갑 다운로드 버튼을 눌러 전자지갑을 다운로드 받아야 합니다.

 

전자지갑을 받아 원하는 경로에 넣었고, SQL Developer도 다운받았다면, 실행시켜 줍니다.

  1. 왼쪽 상단에 +버튼을 눌러 새 접속을 생성합니다.
  2. 아까 만들었던 자율운영 DB의 이름을 입력합니다.
  3. 사용자 이름은 ADMIN이고, 비밀번호는 아까 제가 DB 생성할 때 따로 적어두라고 했던 그 비밀번호를 입력합니다.
  4. 접속 유형으로 클라우드 전자지갑을 고른 뒤, 찾아보기를 통해 파일을 넣습니다. 이때, 다운로드 받았던 전자지갑 압축파일을 그대로 넣으면 됩니다.( 윈도우의 경우 .zip)
  5. 테스트 버튼을 눌러 연결을 확인한 후 접속을 누르면 끝입니다.

이제 DB를 생성하고 원격 DB 접속도 성공하였습니다. 바로 스프링 부트 프로젝트랑 연동하러 가보겠습니다.

 

참고 사항

혹시 위 과정들이 번거롭고 깔기 귀찮다면, 기존 아마존 RDS처럼 인텔리제이에서 바로 연결하는 방법도 있었습니다.

- https://yongc.tistory.com/65 

 

오라클 클라우드(OCI) 자율 운영 데이터베이스 연결하기

이번에 개인 프로젝트를 진행하면서 무료로 사용할 수 있는 오라클 클라우드의 자율운영 데이터베이스(오라클 DB)를 사용하게 되었습니다. 인텔리제이에서 개발하면서 내부 테이블 확인 등 쿼

yongc.tistory.com

위 포스팅을 참고하여 연결하시면 되겠습니다.


스프링 부트 프로젝트와 DB 연동

이제 application.yml 파일에 DB 인증 관련 정보를 적어야 합니다. 이에 앞서 간단하게 제가 yml을 이용해 개발환경을 분리한것을 보여드리겠습니다.

 

왜 분리했냐구요?

저는 로컬에서는 H2를 계속 사용하고 싶고, 배포시에는 오라클을 사용하고 싶기 때문에 분리하게 되었습니다.

 

개발과 배포환경 분리

 

우선, application.yml 파일 입니다.

spring:
  profiles:
    group:
      "dev-profile": "dev,jwt"
      "prod-profile": "prod,jwt"
    active: dev-profile

 

의미는 아래와 같습니다.

  • dev-profile (개발 환경) : application-dev.yml, application-jwt.yml를 포함하여 빌드 및 실행
  • prod-profile (배포환경) : application- prod.yml, application-jwt.yml를 포함하여 빌드 및 실행
  • active : dev-profile -> 별다른 지정이 없을때, 기본으로 실행되는 프로필(환경)

application-dev.yml  파일에는 h2데이터 베이스에 관련한 설정이 포함되어 있습니다. 아래와 같습니다.

# application-dev.yml
spring:
  config:
    activate:
      on-profile: dev
  banner:
    location: dev-banner.txt


  # H2 Driver
  datasource:
    url: jdbc:h2:tcp://localhost/~/ridetogether
    username: sa
    password: 1234
    driver-class-name: org.h2.Driver

  data:
    web:
      pageable:
        default-page-size: 20  #페이징 할 때 기본값, 20개씩 조회

  servlet:
    multipart:
      max-request-size: 5MB  #업로드 파일 크기 총량 제한
      max-file-size: 2MB     #업로드 파일 크기 제한

  jpa:
    show_sql: true
    hibernate:
          ddl-auto: create
    properties:
      hibernate:
        format_sql: true
        use_sql_comments: true
        highlight_sql: true
        default_batch_fetch_size: 100

logging.level:
  org.hibernate.SQL: debug
  org.hibernate.orm.jdbc.bind: trace #??? ?? 3.x, hibernate6

server:
  servlet:
    encoding:
      charset: UTF-8

 

application-prod.yml에는 오라클 자율운영 데이터베이스에 연결할 정보들을 입력하도록 하겠습니다.

   datasource:
  # 아래는 지갑이 위치한 로컬 파일 경로
#    url: jdbc:oracle:thin:@{DB 이름}?TNS_ADMIN=/{전자 지갑 파일 이름}
  # 배포할 서버에 지갑이 위치한 파일 경로
    url: jdbc:oracle:thin:@{DB 이름}?TNS_ADMIN={파일 경로}/{전자 지갑 파일 이름} 
    username: admin
    password: 아까 DB만들때 작성한 비밀번호
    driver-class-name: oracle.jdbc.OracleDriver
  data:
    web:
      pageable:
        default-page-size: 20  #페이징 할 때 기본값, 20개씩 조회

  servlet:
    multipart:
      max-request-size: 5MB  #업로드 파일 크기 총량 제한
      max-file-size: 2MB     #업로드 파일 크기 제한

  jpa:
    show_sql: true
#    hibernate:
#      ddl-auto: create
    properties:
      hibernate:
        format_sql: true
        use_sql_comments: true
        highlight_sql: true
        default_batch_fetch_size: 100

logging.level:
  org.hibernate.SQL: debug
  org.hibernate.orm.jdbc.bind: trace #??? ?? 3.x, hibernate6

server:
  servlet:
    encoding:
      charset: UTF-8

 

먼저 url에는 아래와 같은 형식으로 작성해야 합니다. 이때 주의 할 점은, 이번에는 .zip파일이 아니라, 압축을 풀고 나서 그 파일의 경로를 적어줘야 합니다.

  • jdbc:oracle:thin:@{DB 이름}?TNS_ADMIN={전자지갑 디렉토리 경로}/Wallet

아까 다운받은 전자지갑 안에 tnsnames.ora 파일을 열어서 나오는 빨간색 동그라미 부분을 DB 이름 부분에 넣고, 경로를 넣어줍니다.

 

저의 경우엔 배포할 오라클 서버에  전자지갑을 /home/ubuntu/scp/Wallet_RideTogetherDB 경로에 위치시켰기 때문에, 이렇게 작성하였습니다.

  • jdbc:oracle:thin:@ridetogetherdb_high?TNS_ADMIN=/home/ubuntu/scp/Wallet_RideTogetherDB

윈도우 사용자라면, jdbc:oracle:thin:@ridetogetherdb_high?TNS_ADMIN=C:\\Users\\{사용자이름}\\.oci\\Wallet_RideTogetherDB 이런식으로 작성하시면 되겠습니다.

 

참고로 high와 medium. low에 대해 간략하게 설명을 하자면,

 

1. high는 최고 성능, 가장 빠른 응답 속도를 가졌지만 동시 실행가능한 SQL문이 3개입니다.

2. medium은 high보다 많은 동시 SQL을 수행할 수 있지만 high보다는 성능이 낮습니다.

3. low는 가장 많은 동시 SQL을 지원하지만 각 SQL문 마다 최소 수준의 리소스를 제공합니다.

 

지금 현재는 서비스를 출시한게 아니라, 프론트와 협업으로만 작게 사용할 것이기 때문에 high를 사용하도록 합니다.

의존성 추가

이어서, 설정을 완료 했으니 오라클 DB를 사용하기 위해 필요한 의존성을 주입받아야 합니다.

runtimeOnly 'com.oracle.database.jdbc:ojdbc11'
implementation 'com.oracle.database.security:osdt_cert'
implementation 'com.oracle.database.security:oraclepki'
implementation 'com.oracle.database.security:osdt_core'

 

이 의존성들을 build.gradle에 추가해줍니다. 그리고 항상 의존성 추가를 한 후에는 reload를 깜빡하지 말고 해주셔야 합니다.

 

 

이제 끝입니다. 위에 yml 파일을 보면, 주석처리된 
#    hibernate:
#      ddl-auto: create

이 부분을 볼 수 있는데, 처음부터 이렇게 프로그램을 실행하게 되면, DB에는 아무런 테이블이 없기 때문에 테이블을 찾을 수 없다고 오류를 생성합니다.

 

create는 테이블을 새로 생성해주기 때문에,  첫 실행시에는 주석을 제거하고 실행하여 테이블을 생성시켜야 오류가 생기지 않습니다.

 

이렇게 DB 연동까지 모두 마쳤습니다. 다음 시간엔, 빌드하는법 간단히 알아보고 대망의 버킷을 사용하는 법을 알아보겠습니다.

(버킷이 진짜 말도 안되게 노가다였음)

 

부정확하거나 부족한 정보, 안되는 부분있으면 댓글로 남겨주시면 감사하겠습니다. 다 만들고 써서 그런지 무언가 빠트린거같은 불안함이 생기네요..ㅜㅜ 


참고

https://kedric-me.tistory.com/entry/Oracle-Cloud-Comehear-Cloud-%EC%9D%B4%EC%A0%84%EA%B8%B0AWS-OCI-2

 

[Oracle Cloud] Comehear Cloud 이전기(AWS > OCI) - (2)

들어가며 이전 글까지 Oracle cloud 환경에 기존 스프링 부트 프로젝트를 배포해보았다. 인스턴스 생성부터 배포까지 성공적이었지만 아직 기존 프로젝트의 환경은 aws의 s3, rds 를 바라보고있었다.

kedric-me.tistory.com

https://velog.io/@pjs901/%EC%98%A4%EB%9D%BC%ED%81%B4-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-6-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0-%E5%AE%8C

 

오라클 클라우드 #6 (프로젝트 배포하기) - 完

web server, WAS, DB까지 서버의 기본 구색을 어느 정도 갖췄다.이제 로컬에서 열심히 두들겨서 만든 코드를 배포할 차례이다.원격 클라우드 저장소를 접속하기 위해 putty로 SSH 프로토콜을 이용했던

velog.io

https://hstory0208.tistory.com/entry/Spring-%EB%B0%B0%ED%8F%AC-%ED%99%98%EA%B2%BD-%EB%B3%84%EB%A1%9C-%EC%84%A4%EC%A0%95%ED%8C%8C%EC%9D%BC-%EB%B6%84%EB%A6%AC%ED%95%98%EA%B8%B0-%ED%94%84%EB%A1%9C%ED%95%84

 

[Spring] 배포 환경 별로 설정파일 분리하기 (프로필)

개발환경과 운영환경의 설정 분리 하나의 애플리케이션을 여러 다른 환경에서 사용해야 할 때가 있다. 예를 들어 개발환경과 운영환경이 필요할 경우 어플리케이션이 개발환경 DB에 접근하는

hstory0208.tistory.com