Oracle Cloud
의 Autonomous Database
를 어플리케이션에서 사용할 때 이전에는 전자지갑을 통해서만 연결해봤었는데
새로 생성해보려니 전자지갑 없이 적절한 TLS URL format으로 접속할 수 있다고 나오길래 그대로 문서를 보며 적용해보고 기록했다.
간단하게 생각하면 AWS의 RDS
인데 Oracle 19c 버전으로 고정된 클라우드 데이터베이스 시스템이라고 생각하면 될 것 같다.
DBMS와 버전은 고정되버리지만 평생 OCPU 1, 20GB 스토리지의 DB 인스턴스를 두개를 무료로 사용할 수 있다는 점이 큰 장점이다.
트랜잭션 처리 항목을 선택하고
항상 무료 토글을 활성화하자! 항상 무료일 경우 무료가 아닌 옵션에 대한 선택지 선택이 제한된다.
잠시 기다리면 데이터베이스가 활성화되고 사용가능해진다.
위 콘솔의 네트워크 칸의 액세스 제어 목록 편집
을 클릭해 편집해준다.
IP주소, CIDR 블록 등으로 데이터베이스 접근을 제한해줄 수 있다. 여기서는 테스트용이니 모든 주소를 허용했다.
상세한 정보는 여기 공식문서에서 확인할 수 있다.
Mutual-TLS
DB 인스턴스를 생성할 때 확인할 수 있었는데 기본적으로 자율운영 데이터베이스는 Mutual-TLS(mTLS)로 커넥션하게끔 구성되어있다.
Using mTLS authentication requires that you supply Oracle database credentials including the Oracle wallets or Java KeyStore (JKS) files when connecting to the database.
서버와 클라이언트 간 양방향으로 SSL/TLS 통신을 보호하는 방법으로, 서로의 인증서를 확인하고 공개키를 교환하여 통신을 암호화하기 위한 방식인데 이 때 클라이언트 측(애플리케이션)에서는 서비스가 제공해주는 전자지갑(Wallet)을 사용해야 한다.
해당 구성의 Wallet 을 다운 받고 애플리케이션에서 DB연결 시 사용해야 한다. 키 파일들이 포함되어있는 것으로 보아 해당 파일을 활용해 데이터베이스 서버에서 클라이언트에 대한 검증이 추가된 TLS 통신을 하는 것이라고 보인다.
TLS without Wallet
After the creation of an Autonomous Database, mutual TLS is enabled as a default option.
기본적으로 mTLS 설정이 되어있기 때문에 추가적인 설정이 필요하다.
콘솔의 네트워크 항목에서 mTLS(상호 TLS) 인증 편집
을 클릭해 mTLS(상호 TLS ) 인증 필요
을 해제 해준다.
One-Way TLS가 접속이 가능한 경우는 다음과 같다.
TLS 인증이 더 사용하기 쉽고, 향상된 접속 대기 시간을 제공하며,
다음 중 하나라도 접속에 true인 경우 클라이언트 인증서(전자 지갑)를 다운로드할 필요가 없습니다.
- JDK 8(u163+) 이상의 JDBC Thin 클라이언트(버전 12.2.0.1 이상)를 사용하고 있습니다.
- Python python-oracledb 드라이버를 사용하고 있습니다.
- ODP.NET 버전 19.14 이상 또는 21.5 이상을 사용하고 있습니다.
- Oracle Client 라이브러리 버전 19.14 이상 또는 21.5 이상과
함께 Oracle Call Interface 기반 드라이버를 사용하고 있습니다
여기서는 첫번째 항목에 부합할 것이기 때문에 사용할 수 있다.
Spring boot 설정하기
Springboot 2.7.13
, Gradle
기준으로 연결을 테스트했다.
여기서는 간단하게 JPA로 쿼리 테스트해볼 예정이고 어떤 방식을 사용해 테스트하던 jdbc 의존성과 설정만 잘 해주면 된다.
// build.gradle
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation ('com.oracle.database.jdbc:ojdbc8-production:21.9.0.0') {
exclude group: 'com.oracle.database.ha', module: 'simplefan'
exclude group: 'com.oracle.database.ha', module: 'ons'
}
}
// application.properties
spring.datasource.driverClassName=oracle.jdbc.driver.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@(description= .....)
spring.datasource.username=PP0309
spring.datasource.password=1Q2w3e4r!!!!
spring.jpa.hibernate.ddl-auto=update
사용자는 ADMIN을 사용하지 말고 되도록 새로 생성해 사용하는 것이 좋을 것 같다.
Connect
, Resource
권한이면 사용하는데는 충분한 것 같다.
연결 URL 정보
URL 정보의 경우 콘솔에서 데이터 베이스 접속을 클릭하면 연결정보가 있으며 복사해서 사용하면 된다.
High, Low 등등은 여러 환경에서 Database가 사용될 때에 대한 병렬 처리 우선순위와 관련되어있다. 여기서 확인해볼 수 있다.
이 연결 정보들은 전자 지갑의 tnsnames.ora
에 포함되어있는 것들로 전자지갑을 활용하더라도 결국 이 정보를 이용해 연결하게 된다. RDS에서도 경로와 포트가 필요했던 것 처럼?
서비스에서 명시한 일부 환경에서는 상호 TLS 인증 없이 커넥션할 수 있으면 되기 때문에 이 방법을 권장하는게 아닌가 생각한다.
연결 테스트하기
애플리케이션을 실행했을 때 별다른 오류가 없다면 연결이 잘 된 것이다. 실제 삽입,조회도 잘 되나 간단하게 테스트해보자
// entity, repository
@Entity
public class Hello {
@Id
@GeneratedValue
private Long id;
private String hello;
public Long getId() {
return id;
}
public String getHello() {
return hello;
}
public Hello() {
}
public Hello(String hello) {
this.hello = hello;
}
}
public interface HelloRepository extends JpaRepository<Hello, Long> {
}
// controller
@RestController
public class HelloController {
private final HelloRepository helloRepository;
public HelloController(HelloRepository helloRepository) {
this.helloRepository = helloRepository;
}
@GetMapping("/hello")
public ResponseEntity<List<Hello>> getAllHello() {
return ResponseEntity.ok(helloRepository.findAll());
}
@PostMapping("/hello")
public ResponseEntity<Long> setHello(@RequestBody String hello) {
Hello helloRes = helloRepository.save(new Hello(hello));
return ResponseEntity.ok(helloRes.getId());
}
}