https://creampuffy.tistory.com/105
이전에 작성했던 오라클 클라우드 DB 인스턴스 접속 방법 글에 대한
문의가 몇몇 있어서 다시 글을 확인해보니..
다시 한 번 정리해보는 게 도움이 될 것 같아서 다시 정리했습니다.
1. 프로젝트 생성
SpringBoot 2.5.5, Gradle, JDK 1.8, yaml 설정으로 생성하였습니다.
로컬은 WINDOWS 10, 서버는 ubuntu 환경입니다.
2. build.gradle
Wallet 방식 접속을 위한 의존성 4개와 Ojdbc, JPA와 lombok, 그리고 web을 추가했습니다.
plugins {
id 'org.springframework.boot' version '2.5.5'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
}
group = 'rich'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
// wallet 방식 접속을 위한 의존성 4개와 ojdbc
implementation 'com.oracle.ojdbc:ucp'
implementation 'com.oracle.database.security:oraclepki'
implementation 'com.oracle.database.security:osdt_core'
implementation 'com.oracle.database.security:osdt_cert'
runtimeOnly 'com.oracle.database.jdbc:ojdbc8'
// jpa
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
// lombok
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
// web
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
test {
useJUnitPlatform()
}
3. application.yml, application-prod.yml
tnsnames.ora
tnsnames.ora 파일의 첫번째 줄의 이름을 저는 RichOracle로 변경하였습니다.
RichOracle = (description=.....
application.yml
url의 thin 뒤에 tnsnames.ora에서 커스터마이징했던 이름인 RichOracle을 적용했고,
TNS_ADMIN 에는 resources 경로 아래에 wallet 폴더를 지정했습니다
spring:
datasource:
username: DB아이디
password: DB비밀번호
driver-class-name: oracle.jdbc.OracleDriver
url: jdbc:oracle:thin:@RichOracle?TNS_ADMIN=./src/main/resources/wallet
application-prod.yml
서버에서 기동시 절대경로를 사용해야 하므로 url 설정만 오버라이딩 되도록 하였습니다.
당연히 서버의 해당 경로에 폴더를 생성하고 파일을 추가해둬야합니다.
프로파일 분리가 불편한 경우, 빌드시점에 URL을 그냥 서버 경로로 변경하여 빌드하면 됩니다.
spring:
datasource:
url: jdbc:oracle:thin:@RichOracle?TNS_ADMIN=/was/wallet
4. DB접속 확인을 위한 코드 추가
애플리케이션 기동시에 히카리 풀을 생성하게 되고, 이것만으로도 DB 연결에 대해 확인할 수 있지만,
보다 확실한 테스트를 위해 샘플을 만듭니다.
해당 DB에는 아래의 Entity와 일치하는 테이블을 미리 만들어서 샘플 값을 조금 넣어둔 상태입니다.
Oracle Entity
package rich.oracletest;
import lombok.Getter;
import lombok.Setter;
import javax.persistence.*;
@Entity
@Table(name = "MYBATIS_ORACLE")
@Getter
@Setter
public class Oracle {
@Id @GeneratedValue
@Column(name = "SEQ_NO")
private Long id;
@Column(name = "NAME")
private String name;
}
OracleRepository
package rich.oracletest;
import org.springframework.data.jpa.repository.JpaRepository;
public interface OracleRepository extends JpaRepository<Oracle, Long> {
}
Controller
package rich.oracletest;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequiredArgsConstructor
public class Controller {
private final OracleRepository oracleRepository;
@GetMapping
public Object home() {
return oracleRepository.findAll();
}
}
5. 엔드포인트 테스트
로컬 기동 테스트입니다.
정상적으로 응답되었습니다.
서버 테스트입니다.
서버에서 기동할때는 프로파일을 설정해줘야합니다.
java -Dspring.profiles.active=prod -jar oracleTest-0.0.1-SNAPSHOT.jar
프로파일 설정이 prod로 정상 적용되었음을 로그로 확인합니다.
이후 생성되는 로그에서 풀 생성이 완료되었음을 확인했다면 DB 접속 성공으로 간주할 수 있습니다.
별도의 오라클 인스턴스에서 curl로 로컬호스트로 GET 요청을 보내어 정상적으로 응답을 확인했습니다.
포트 개방설정까지는 귀찮아서 로컬로 curl 요청을 보낸점 양해부탁드립니다.
다만 서버에서 기동된 애플리케이션의 DB연결이 정상적으로 이루어졌음을 확인하는데에는 충분합니다.
도움이 되셨다면 좋겠습니다.
감사합니다.
'Java & Spring' 카테고리의 다른 글
🖋 Servlet부터 DispatcherServlet까지 (Front Controller 패턴) (0) | 2022.06.20 |
---|---|
🤔 객체지향 생활체조 돌아보기 (우테코 레벨2를 마치며) (0) | 2022.06.17 |
모의면접 복기 (2) - 가비지 컬렉션 Garbage Collection (0) | 2021.09.27 |
문자열 유효성 검증 유틸 메소드 StringUtils.hasText(String) (2) | 2021.09.04 |
스프링부트가 정적 리소스 제공하는 과정 (0) | 2021.08.30 |