전편인 'ORACLE DB 외부에서 접근 가능하게 설정하기 (실패편)'에 이어서-
오늘은 드디어 세팅에 성공한 흔적을 정리해보려고 한다.
(실패편, 성공편 총 2편 중 본 글은 2편 성공편임)
이번 편이 이전의 '실패편'에 이은 성공편인 만큼,
단순히 성공 시 어떻게 설정했는지만 서술하는 데에 그치지 않고,
'왜 실패했었는가? -> 그래서 어떻게 성공하게 되었는가?' 에 초점을 맞춰 정리해 보려고 한다.
전편(실패편)에서 tnsnames.ora 세팅과 관련해서 실패했던 이유는 크게 두가지 측면이 있었다.

보통 오라클 DB에서의 SID명은
1) 오라클 SQL Developer 설치 시점에 정하거나,
2) Oracle Net Configuration Assistant(=Net CA) 를 사용한다면

위와 같은 과정을 거칠 때, 입력한 서비스명이 SID로 사용되게 되는데,
저번 편에서 실패했던 이유는,
이 SID를 단순 웹프로젝트에서의 변수명이나 프로퍼티명처럼 착각하고,
서버가 임의로 SID를 지정하면, 클라이언트가 해당 SID명을 그대로 받아 쓸 수 있을 줄 알았던 것이 첫번째 문제였다.
즉, 정해진 SID를 사용해야 한다.
참고 : SID를 알아내는 방법
- 기본적으로 윈도우에서 실행되는 'OracleService###' 라는 이름의 '서비스' 에서 '###'부분이 (따로 변경하지 않았다면) '서비스ID(=SID:Service ID)' 일 확률이 높다.
- 확실한 방법은
1) (윈도우 기준) '관리자 권한으로 실행한 명령 프롬프트'를 켜서,
2) dba 권한으로 로그인( sqlplus sys as sysdba -> db의 루트 관리자 로그인 ) 한 뒤,
3) 쿼리문 ( SELECT instance_name, status FROM v$instance; ) 을 날려 직접적으로 확인하는 방법이 있다.
(INSTANCE_NAME 으로 'XE' 가 찍힌다)
두 번째 문제는 HOST 에 관한 착각이었는데,
이 HOST명 또한 전 글 실패편에서 이런저런 시도를 할 때는
1) HOST명은 'WINDOWS에서 대충 설정해둔 컴퓨터 이름' 이라고 착각했었고,
2) 'localhost로 잡아서 사용 시 HOST명이 컴퓨터 이름이었으니, HOST 부분에 IP 주소를 쓰면 외부 연결이 되는 게 아닐까'
라고 단순히 쉽게 생각했던 부분이 있었다.
하지만 이 역시도 그런 단순한 부분이 아니었고..
참고 : 명령 프롬프트에서 'ipconfig /all' 명령어를 실행한 화면
공부한 결과 요약 :
(위 스샷의 Windows IP 구성에서) '호스트 이름'은 내 PC를 식별하고 다른 네트워크 장치나 컴퓨터가 내 PC를 찾을 때 사용된다.
내 PC에 할당된 IP 주소와 연결되어 있으며, DNS (Domain Name System)을 통해 호스트 이름을 IP 주소로 해석할 수 있게 된다.
(= PC에 원격으로 접속하려는 경우 호스트 이름을 사용하여 접속할 수 있다.)
는 것이다.

성공한 방법은..
오라클 SQL Developer 설치 시에 자동 생성된 tnsnames.ora 파일을 그대로 사용하는 것이었다...
SID와 HOST모두 제대로 들어가 있던 것을,
괜히 외부에서 접속 가능하게 한답시고 임의로 바꾼 것이 문제였다.
전편(실패편)에서 listener.ora 설정과 관련해서 실패했던 이유도 크게 다르지 않았다.
(* ↑ 실패한, 잘못 설정된 listener.ora 파일 스샷임)
위의 listener.ora 파일에서도,
1) 쓸데없이 HOST 를 바꾸고,
2) SID '(SID_NAME = BS11 (SERVICE_NAME = BS11))'를 임의로 설정하고..
했던 것이 문제였다.

listener.ora 파일 또한, 설치 시 자동 생성된 listener.ora 파일을 그대로 사용하는 것이 답이었다.
처음에(실패한 방법에서)는 HOST와 SID를 내가 임의로 바꾸면서,
뭔가 '기본 값이 바뀌었으니 매핑을 해줘야겠다'는 생각에 이런저런 설정을 건드렸었는데,
알고보면 (위 스샷에서 빨간 박스 안) 'DEFAULT_SERVICE_LISTENR = XE' 단 한줄로
(위에서부터 쭉 봐왔던) SID(* 저의 경우는 'XE')를 디폴트로 잡아줌으로써,
외부에서 연결되는 클라이언트의 요청 중에서 특별히 명시된 서비스 이름이 없을 때,
자연히 XE라는 서비스에 대한 연결을 수행하게끔 리스너 설정이 완료되는 것이었다.
그러면 (나와 같은 초보 개발자들은) 이쯤에서
'뭐 죄다 기본 설정값들을 그대로 쓰면, 그냥 localhost로 혼자 쓸 때랑 다를 게 없네?'
'대체 외부 연결은 뭘로 어떻게 잡나?' 라는 생각이 들 수 있는데,
그것에 대한 해답이 바로 '포트 포워딩' 이었다.
참고 : 포트 포워딩(Port Forwarding)이란? (* 출처 : ChatGPT 질의 결과)
포트 포워딩은 네트워크에서 사용되는 중요한 개념 중 하나로, 네트워크 디바이스(일반적으로 라우터 또는 방화벽)를 통해 외부 네트워크 또는 인터넷에서 내부 네트워크의 특정 포트로 들어오는 연결을 전달하거나 특정 내부 호스트로 리디렉션하는 프로세스를 의미합니다.
일반적으로 내부 네트워크에 있는 여러 장치들은 내부 IP 주소와 포트를 가지고 있으며, 외부 네트워크에서 내부 네트워크로 연결하려면 외부에서 내부 장치의 IP 주소 및 포트에 접근해야 합니다. 이때 포트 포워딩을 사용하면 외부에서 특정 포트로 들어오는 연결을 내부 네트워크의 특정 IP 주소와 포트로 전달하거나 리디렉션할 수 있습니다.
무슨 말인가?
간단하게 말하면, 네트워크로 연결하려는 위치를 '특정' 해준다는 뜻이다.
이해를 돕기 위해 그림으로 표현하면,

기본적인 네트워크 망 구성이 위와 같을 때,

포트 포워딩이 되어있지 않다면,
어떤 특정 서비스를 외부와 연결하려 해도 접근이 어디서 어떻게 이뤄져야 하는지 정의가 되지 않아
네트워크 연결이 불가능해 진다는 것을 의미한다.
따라서 포트포워딩을 해줘야만

외부에서 오는 연결이 내가 원하는 서비스로 연결될 수 있게 된다.
(당연하게도) 포트 포워딩은 자기가 사용하는 네트워크의 구조에 맞게 해줘야 한다.
제 경우는 쓰고있는 망이 아래 그림처럼 되어 있어서

2번의 포트포워딩을 해주었다.


참고 : ip주소와 포트번호
- IP 주소: 네트워크 상의 '기기를 식별하기 위한 숫자'이다.
이 주소는 전 세계의 모든 컴퓨터와 기기에 부여되며, 인터넷 상에서 기기 간의 통신을 가능하게 한다.
- 포트 번호: 한 '기기 내부의 서비스나 응용 프로그램을 식별하기 위한 숫자'이다.
컴퓨터나 서버 내의 응용 프로그램이나 서비스에 임의의 '포트 번호'를 부여하고, 해당 포트 번호(창구 역할)를 사용하여 데이터를 주고받을 수 있다. 이를 통해 한 기기에서 여러 서비스가 동시에 제공되더라도, 데이터를 올바른 응용 프로그램으로 라우팅할 수 있다.
외부에서의 접근을 허용한다는 것은 보안 상 위험이 따르는 일이라,
WINDOWS 에서도 보안 상 외부에서의 접근은 기본적으로 막아두고 있다.
사용자의 특정 필요에 의해 접근을 허용해야 할 경우는 따로 규칙을 설정하여 문을 열어줘야 한다.
1) 먼저 Windows Defender 방화벽 설정에 가서 왼쪽 메뉴 중 '고급 설정' 을 클릭하고

2) '인바운드 규칙' - '새 규칙' 클릭 후

3) 사용할(=포트포워딩한) 포트에 대한 규칙을 설정.


-> '다음'을 누른 뒤, 연결을 허용할 조건 및 향후에 이 규칙이 어떤 규칙인지 알아볼 수 있는 설명을 덧붙이고 완료.
위의 '3-2. 포트 포워딩 방법' 에서 알아본 대로,
나의 네트워크에 접근한 외부자가 내가 의도한 서비스까지 도달할 수 있도록
내가 사용하는 네트워크 구조에 맞게 포트포워딩 해준다.
문을 열고, 의도한 서비스까지 도달할 수 있게 특정시켰다면,
이제 드디어 외부에서 나의 네트워크로 접근을 해볼 차례이다.
(접근을 허용할 서버 쪽의 컴퓨터에서) 네이버 검색창에 '내 ip'라고 검색하면

외부에 노출되는 (서버 컴퓨터가 사용하고 있는) ip 주소를 알 수 있고,
이 주소를 (접속할 클라이언트의 컴퓨터에서) '호스트 이름'으로 입력해

외부의 클라이언트가 서버의 서비스로 접근할 수 있게 된다.
참고 : Oracle SQL Developer의 '사용자 이름' 및 '비밀번호'
- 당연하게도, 서버(DB서비스 제공자)가 DBA(데이터베이스 관리자) 권한으로 사용자명을 생성하고, 필요한 권한 부여까지 해주어야 사용이 가능해 진다.
- 외부에서도 DB에 접속 가능하도록 설정하는 경우, DBA(데이터베이스 관리자) 권한 사용자(ex> system / oracle )이 노출되지 않도록 주의를 기울여야 할 것이다.
오라클 DB 서비스와 관련된 파일들(tnsnames.ora, listener.ora)이 변경된 경우, '서비스'를 재시작 해주어야 한다.
'서비스'는 WINDOWS 단에서 실행되고, 개별 응용 프로그램인 Oracle SQL Developer의 종료와는 별개로, 자동으로 재시작 되지 않기 때문에 수동으로 재시작 해주어야 한다.
방법은 2가지가 있다.

서비스 창을 열고, 안에 커서를 둔 뒤 'O'를 몇번 누름 -> Oracle.. 어쩌고 하는 서비스가 나옴

재시작 순서 :
Oracle'##버전##'TNSListener 종료 -> OracleService'##지정이름##' 종료 -> OracleService'##지정이름##' 실행 -> Oracle'##버전##'TNSListener 실행

명령 프롬프트를 관리자 권한으로 실행 후,
OracleService'##지정이름##' 시작 및 중지
(* '지정 이름'이 XE인 경우)
Oracle'##버전##'TNSListener 시작 및 중지
읽어주셔서 감사합니다.