Self Project(ICN-APP) 일기 #6

최우혁·2021년 7월 10일
0

ICN_APP

목록 보기
6/7

진행상황

굉장히 오랜만에 글을 쓰게 되었다!!

그간 개인적인 일들로 사이드 프로젝트 개발하는데 사용할 시간이 적었던 것 같다.
그럼에도 계속해서 조금씩이라도 해보려고 하다보니 현재 이정도 흐름까지 오게 되었다.

JWT Token을 이용한 인증/인가의 경우, 현재 사용자 인증은 구현을 하였으나, 각각의 사용자에 대한 권한(인가)의 경우는 아직 구현을 하지 않았다.

상황 발생

기존에 사용하던 Database는 Azure의 CloudDB였다.
해당 DB는 작년 7월 경 1년 무료 티어 계정을 활성화하면서 지금까지 요긴하게 사용해왔다.

그러다 1년 무료 기간이 종료가 다가오자 이제는 선택을 할 시간이 되었다.

과금을 하며 진행을 할 것인지, 새로운 무료티어를 찾아 떠날 건지.

먼저 과금을 하며 진행을 하기에는 이 개발을 매일 하진 않을 것이고 시간을 좀 들여가며 여유롭게 진행하고 싶었기에 새로운 무료 티어 DB를 찾기로 했다.

다행히도 기존에 사용하던 oracle cloud VM을 생각하며 Oracle Cloud Console에 들어가니, 무료로 DB를 일정 용량 제공을 해주었다.

옳다구나 싶어서 얼른 DB 인스턴스를 새로 생성을 하고 DB접속을 하려는데, 기존에 IP주소와 사용자 계정 정보를 입력하던 것과는 달리 Wallet이라는 것을 받아서 접속을 하라고 가이드가 되어있다.

Wallet..?

Oracle Wllet이란 Orcle DB에 접속할 때 미리 패스워드를 작성하여 넣어두는 곳이며, 해당 wallet을 통해 Oracle DB에 접속하는 것을 OS 인증이라고 한다

먼저 검색을 해보니 이렇게 설명이 되어있더라...
난 이 방법이 불편할 것 같아서 기존 방식을 하려 하니, 다른 방식으론 접속을 못하는 것 같다...😩😩

그래서 마음을 다잡고 가이드를 따라 가기로 했다.

구현 과정

먼저 콘솔에서 Wallet을 다운 받은 뒤, 프로젝트의 src/main/resources 디렉토리에 추가를 해놨다.
이렇게 해두면 해당 리소스를 읽어서 진행할 수 있을 거라 생각했다.

그리고 dataSource 빈을 생성하여 그 안에 세부 내용을 작성했다.

@Bean
public DataSource dataSource(){
        DriverManagerDataSource ds = new DriverManagerDataSource();
        ds.setDriverClassName(oracle.jdbc.driver.OracleDriver.class.getName());
        String path = System.getProperty("user.dir").replace('\\','/')+"/src/main/resources/Wallet_이름";     
       
        ds.setUrl("jdbc:oracle:thin:@{DB이름}?TNS_ADMIN=" + path);
        ds.setUsername("{사용자 이름}");
        ds.setPassword("{비밀번호}");
        return ds;
    }

그리고 바로 로컬 환경에서 접속 테스트를 진행했다.
바로 성공해버렸쥬???

별거 없다 생각하고 가뿐하게 docker image 빌드하고 컨테이너에 올린 뒤 실행을 시켰다.

그런데 이게 웬걸????

해당 wallet을 찾을 수 없다며 실패를 하더라!!!???😳😳😳

다시 로컬에서 테스트를 했다. -> 성공적이었다.
도커 이미지로 만들기 전, 메이븐 빌드한 파일을 실행 -> 에러 발생.

이게 무슨 상황인가 싶었다. 그렇게 시작된 구글링과 거기서 얻은 수많은 조언들을 조합해본 결과 내가 내린 결론은 이것이었다.

로컬 테스트 환경에선 Wallet 경로가 절대경로로 주어져 실제로 wallet을 찾을 수 있음.
하지만 jar 파일로 결과물이 떨어졌을 땐, 해당 경로가 로컬 경로와는 다를 것이기 때문에 jar 파일을 뜯어서 resource 아래에 있는 wallet 경로를 지정해주자.

@Bean
    public DataSource dataSource(){
        DriverManagerDataSource ds = new DriverManagerDataSource();
        ds.setDriverClassName(oracle.jdbc.driver.OracleDriver.class.getName());
        //String path = System.getProperty("user.dir").replace('\\','/')+"/src/main/resources/Wallet_이름";
        File file = new File("src/main/resources/Wallet_이름");
        String path = file.getAbsolutePath();
        //String path = getClass().getClassLoader().getResource("Wallet_이").toString();
        //path=path.replaceAll("!","");
        ds.setUrl("jdbc:oracle:thin:@{DB이름}?TNS_ADMIN=" + path);
        ds.setUsername("{사용자 이름}");
        ds.setPassword("{비밀번호}");
        return ds;
    } 

그렇게 해서 시작된 다양한 해결방법의 흔적...
하지만 그 무엇도 wallet을 가져올 수 없었다.(실패..)

해결!

근데 결국엔 해결했다.
나는 기존에 이러한 리소스들은 무조건 같이 빌드를 해서 jar파일 내부에서 읽어야 한다고 생각을 했었다.

그런데 좀 더 생각을 해보니, 어차피 도커 이미지로 빌드를 해서 올릴 거라면 도커 이미지를 만들 때, 해당 디렉토리를 같이 넣을 순 없을까? 생각이 들었다.

그래서 dockerfile 작성하는 방법을 다시 한번 읽어보고 마침내 해결을 했다.

FROM openjdk:8-jdk-alpine
ADD {파일명}-0.0.1-SNAPSHOT.jar app.jar
COPY {Wallet 폴더} /var/oracle/wallet
ENV JAVA_OPTS=""
ENTRYPOINT ["java","-jar","/app.jar"]

COPY라는 것을 처음 사용하게 되었고, 해당 명령어는 로컬의 Wallet폴더를 도커 컨테이너가 생성될 때 /var/oracle/wallet이라는 경로에 복사를 한다는 의미라고 한다.

그리고 실제 dataSource 빈에는,

@Bean
    public DataSource dataSource(){
        DriverManagerDataSource ds = new DriverManagerDataSource();
        ds.setDriverClassName(oracle.jdbc.driver.OracleDriver.class.getName());
        String path = "/var/oracle/wallet";
        ds.setUrl("jdbc:oracle:thin:@{DB이름}?TNS_ADMIN=" + path);
        ds.setUsername("{사용자 이름}");
        ds.setPassword("{비밀번호}");
        return ds;
    }

이렇게 생성을 했다!!! (물론 배포를 할 때는 properties파일에 설정 값들을 두고 @value로 읽어올 것이다.)

빌드를 하고 도커 컨테이너를 띄워보니

뵤로롱~~~👌 아주 성공적으로 잘 작동이 된다!!!

이번에 이걸 겪으면서 느낀건,

  1. 오라클은 까다롭다.
  2. 리소스를 무조건 프로젝트 안에 넣어서 같이 빌드할 필요는 없다.

이 두가지였던 것 같다ㅎㅎ

profile
백엔드 주니어입니다🙌

0개의 댓글