한바다
[톰캣실행오류]XE 인스턴스가 리스너에 등록되지 않은 오류 본문
톰캣실행시 오라클 연결 "XE 인스턴스가 리스너에 등록되지 않는 오류가 반복 발생되었다
[오류코드]
ORA-12514: TNS:listener does not currently know of service requested in connect descriptor
[해결방법]
cmd 관리자 권한으로 진행한다
① 리스너 재시작 명령어 실행:
lsnrctl stop
잠시 기다렸다가 다시:
lsnrctl start
② 다시 SQL*PLUS 접속 후 인스턴스 재등록
sqlplus sys/비밀번호 as sysdba
Sql
ALTER SYSEM REGISTER;
③ 리스터 상태 확인
lsnrctl status
리스터가 정상적으로 등록 되었다면 아래와 같은 문장이 보여야 한다!
Service "XE" has 1 instance(s).
Instance "XE", status READY, has 1 handler(s) for this service...
위와 같이 진행 했음에도 계속적으로 xe가 등록되지 않아 XE 인스턴스 수동등록을 시도 하였다
Sql
ALTER SYSTEM SET LOCAL_LISTENER = '';
ALTER SYSTEM REGISTER:
그 다음 exit 명령어로 sql을 빠져나와 다시 리스너 상태( lsnrctl status) 를 확인한다.
그래도 안되어서 xe 설치경로 -tnsnames.ora 파일을 확인 하였다
[폴더위치]
D:\oraclexe\app\oracle\product\11.2.0\server\network\ADMIN

해당 파일을 메모장으로 열어서 아래 내용이 포함되어 있어야 했다.

위와 같이 리스터 XE는 포함되어 등록이 되어 있었다!!
추가로 Oracle 인스턴스 이름 확인 명령어는 아래와 같다
Sql
SELECT instance_name FROM v$instance;
그러나 여전히 XE 서비스가 등록되지 않는 것은 XE 서비스가 리스너에 나타나지 않는 건 데이터베이스 인스턴스가 정상적으로 올라와 있지 않거나, 리스너와 연결되지 않았기 때문이다
그래서 SQL*PLUS에서 다음 명령어를 실행 하였다
Sql
ALTER SYSTEM SET LOCAL_LISTENER='(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))';
ALTER SYSTEM REGISTER;
그 후 sql을 빠져나와 exit 다시 리스너 상태 확인 한다
lsnrctl status
[실행한 CMD 명령어]
SQL> ALTER SYSTEM SET LOCAL_LISTENER='(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))';
System altered.
SQL> ALTER SYSTEM REGISTER;
System altered.
SQL> EXIT
Disconnected from Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
C:\WINDOWS\system32>lsnrctl staus
LSNRCTL for 64-bit Windows: Version 11.2.0.2.0 - Production on 06-4월 -2025 12:38:55
Copyright (c) 1991, 2014, Oracle. All rights reserved.
NL-00853: undefined command "staus". Try "help"
C:\WINDOWS\system32>lsnrctl status
LSNRCTL for 64-bit Windows: Version 11.2.0.2.0 - Production on 06-4월 -2025 12:39:11
Copyright (c) 1991, 2014, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for 64-bit Windows: Version 11.2.0.2.0 - Production
Start Date 06-4월 -2025 12:27:33
Uptime 0 days 0 hr. 11 min. 42 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Default Service XE
Listener Parameter File D:\oraclexe\app\oracle\product\11.2.0\server\network\admin\listener.ora
Listener Log File D:\oraclexe\app\oracle\diag\tnslsnr\DESKTOP-FRJOKT5\listener\alert\log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC1ipc)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=DESKTOP-FRJOKT5)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=1521)))
Services Summary...
Service "CLRExtProc" has 1 instance(s).
Instance "CLRExtProc", status UNKNOWN, has 1 handler(s) for this service...
Service "PLSExtProc" has 1 instance(s).
Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
Service "XEXDB" has 1 instance(s).
Instance "xe", status READY, has 1 handler(s) for this service...
Service "xe" has 1 instance(s).
Instance "xe", status READY, has 1 handler(s) for this service...
The command completed successfully
Service "xe" has 1 instance(s).
Instance "xe", status READY, has 1 handler(s) for this service...
드디어 "xe"가 리스너에 등록이 되었다!!!!
또한 이클립스에서 톰캣 에러 8080포트를 누가 자꾸 쓰고 있다고 하여 아래와 같이 톰캣 포트번호를 변경해주었다
Server>Tomcat v10.1 Server at localhost더블클릭

더블클릭하여 아래와 같이 Overview가 나오면 Port영역에서 HTTP/1.1을 더블 클릭하여 포트번호를 8888 또는 9090,8282등 사용되지 않는 번호로 변경한다. 그리고 변경사항 ctrl+s로 저장한다.

[브라우저 오류 코드]
HTTP 상태 404 - 찾을 수 없음
타입 상태 보고
메시지 요청된 리소스 [/LoginServlet]은 가용하지 않습니다
[코드 수정 부분1]
위 코드에서 /LoginServlet은 브라우저 주소에 쓰이는 경로로 web.xml에서 수동으로 서블릭 등록 필요하다
web.xml은 src/main/webapp/WEB-INF/web.xml 위치에 있어야 한다
위처럼 서블릿 이름과 클래스 경로, URL 패턴을 적어줘야 함!!
[코드 수정 부분2]
위와 같이 web.xml을 수정 해주었는데도 동일한 오류가 발생한 이유는 웹브라우저에서 요청한 URL과
web.xml에 등록된 URL 매핑이 서로 일치하지 않기 때문이였다!!
- 브라우저 주소창에서 접속한 URL은 http://localhost:8888/LoginServlet이고
- web.xml의 URL 매핑설정은 <url-pattern>/LoginServlet</url-pattern>
그러나 현재 프로젝트 이름은 MemberMVC으로 즉 이서블릿은 MemberMVC라는 Context 하위에서 실행되어야 한다!
그리하여 수정한 부분은
login.jsp에서 로그인 요청을 하는 form 태그에 아래와 같은 코드가 입력 되어 있었는데
<form action="../LoginServlet" method="post">
위 코드는 상대 경로를 사용하고 있어서 실행 환경에 따라 LoginServlet을 정확히 찾지 못할 수 있다. 따라서
다음처럼 절대 경로 방식으로 변경해야 한다
<form action="${pageContext.request.contextPath}/LoginServlet" method="post">
▶ pageContext.request.contextPath는 현재 웹 애플리케이션의 컨텍시트 경로, 즉 MemverMVC를 자동으로 가져온다.
결과적으로 브라우저는 다음주소로 요청하게 된다
http://localhost:8888/MemberMVC/LoginServlet
위와 같은 과정으로 작은 프로젝트 내 회원가입과 로그인 성공이 이루어 졌다