오전
서블릿 리스너란 ?
이벤트가 발생하면 실행
- 청취자라는 정의가 있음.
- 특정 이벤트가 발생하길 계속 기다린다.
- 서블릿,필터 처럼 @WebListener 으로 사용한다.
리스너가 이벤트가 발생할 때 동시에 특정행동을 하는데 , 이것을 이벤트 핸들링 이라고 한다.
그래서 리스너는 이벤트 핸들러라고 불리기도 한다.
서블릿 리스너 객체의 종류
리스너 객체의 종류에는 크게는 2가지가 있다.
ServletContextListener 와 ServletContextAttributeListener
이렇게 두가지로 나뉘는데 비슷해보이긴 한데 두가지의 차이점은 Listener 는 시작과 종료시 실행되는 이벤트를 처리 , Attribute 는 말 그대로 ServletContext 에 속성이 추가,제거,변경 CRUD 될 때 호출됨.
이외에도 몇가지가 있음.
- HttpSessionListener
- 세션 생성과 소멸시 이벤트를 처리 담당
- 주요 메서드: sessionCreated, sessionDestroyed
- 사용 예시: 사용자 세션 수 추적, 세션 만료 관리
- HttpSessionAttributeListener
- 설명: 세션에 속성이 추가, 제거, 변경될 때 호출된다능.
- 주요 메서드: attributeAdded, attributeRemoved, attributeReplaced
- 사용 예시: 세션별 사용자 데이터 추적
- 설명: 객체가 세션에 바인딩되거나 언바인딩될 때 호출된다능.
- 주요 메서드: valueBound, valueUnbound
- 사용 예시: 세션에 바인딩된 객체의 상태 관리
- 설명: 세션 ID가 변경될 때 호출된다능 (특히 보안 등으로 인해 세션 ID가 새로 생성될 때 유용).
- 주요 메서드: sessionIdChanged
- 사용 예시: 세션 ID 변경 추적
- 설명: 요청이 들어오거나 완료될 때 이벤트가 발생한다능.
- 주요 메서드: requestInitialized, requestDestroyed
- 사용 예시: 요청별 로깅, 리소스 정리
- 설명: 요청 속성이 추가, 제거, 변경될 때 호출된다능.
- 주요 메서드: attributeAdded, attributeRemoved, attributeReplaced
- 사용 예시: 요청 내 데이터의 변경 추적
대표적인 리스너 메서드
- contextInitialized(ServletContextEvent sce) : 웹 어플 시작시 동시에 호출되고, 웹 어플리케이션의 모든 필터 또는 서블릿이 초기화 되기 전에 호출되는 메서드.
- contextDestroyed(ServletContextEvent sce) : 웹 어플 종료시에 호출되고 웹 어플리케이션의 모든 필터 또는 서블릿이 종료된 이후 호출되는 메서드
리소스란 ? (중요 개념)
리소스는 웹 어플이 동작하는데 필요한 다양한 외부요소들을 말한다.
외부요소라는건 , 애플리케이션 내부가 아닌 애플리케이션 바깥에 있으면서 필요한 데이터를 제공하거나 기능을 보조하는 자원들을 말한다.
그러니까 지금 내가 작성하고있는 코드말고 다른 곳에서 받아와서 사용하는 그런것들을 말하는듯하다. 예를 들어 데이터베이스 같은것은 mysql , 오라클 같은 DBMS 에서 따로 관리하면서 내가 받아와서 사용하는거기 때문에 외부요소라고 볼 수 있지.
리소스는 여러 종류가 있는데 ,
- 데이터베이스 : 말 그대로 데이터베이스를 말함. mysql 같은데에서 존재하는 데이터
- 외부 API 및 웹서비스 : 외부에서 제공하는 기능 ex) 날씨 정보 , 지도 정보 , 카카오맵 같은거
- 파일 및 네트워크 자원 : 외부에 있는 파일이나 서버의 데이터
- 환경 변수 및 설정 파일 : 서버 환경이나 시스템에서 제공하는 설정 값이나 정보
- JNDI 리소스 : 자바에서 이름 기반의 자원 접근을 위한 API
- JNDI 는 자원의 위치를 찾고 자원에 대한 정보를 얻으며, 자원을 생성하거나 참조한다.
※대표적으로 많이 사용하는 리소스가 커넥션 풀이다.
커넥션 풀이 없으면 매번 커넥션을 얻어서 자원을 낭비하게 되기 때문에 커넥션 풀을 만들어서 커넥션을 재사용하는게 효율적이다.
JNDI란 ?
JNDI 는 애플리케이션의 자원들을 이름으로 찾아서 사용할 수 있도록 해주는 API인데
이를 통해서 복잡한 자원관리 없이 애플리케이션을 개발할 수 있게 된다
Context ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/MyDataSource");
Connection conn = ds.getConnection();
JNDI 를 사용하여 커넥션 풀을 검색하고 이를 통해서 데이터 베이스를 얻는다.
context.xml : web application 이 사용할 리소스를 정의하고 TomCat 이 해당 리소스에 접근할 수 있도록 설정하는역할을 한다. 이 파일을 통해 데이터베이스 연결설정, 환경변수, 리소스 경로 등을 지정해서 애플리케이션이 쉽게 활용할 수있도록 한다.
context.xml 과 web.xml 의 차이
- web.xml : 서블릿 , 필터 , 리스너 설정
- url 패턴 매핑
- 에러 페이지 설정
- jsp 매핑 설정
- context.xml : context 설정 파일
- 일반적으로 서버 설정 디렉터리의 conf 폴더 (예: TOMCAT_HOME/conf/context.xml)
- 애플리케이션 단위로 설정할 때는 웹 애플리케이션의 META-INF 폴더 내 (META-INF/context.xml)
- 데이터베이스 연결설정 , 환경 변수 설정 , 전역 리소스 및 자원 정의
정리
- *web.xml*은 특정 웹 애플리케이션의 구성을 정의하며, 서블릿, 필터, 리스너 매핑 및 보안 설정에 사용됩니다.
- *context.xml*은 데이터베이스와 같은 전역 리소스 및 환경 설정을 정의하며, 여러 애플리케이션이 공유할 설정이나 자원 접근 설정을 포함합니다.
간단히 web.xml 은 구성 , context.xml 은 설정 이라고 생각하자.
JNDI : Java Naming Directory Interface : 디렉터리 서비스에서 제공하는 데이터 및 객체를 발견하고 참고하기 위한 자바 API
어노테이션을 정의할 때 경로 설정
/* : 모든 요청 처리(모든경로,/WEB_INF 등..) : 모든 하위 폴더에 대해 경로를 설정한다.
@WebFilter("/*")
public class MyFilter implements Filter{
}
모든 경로를 설정하기 때문에 애플리케이션의 모든 요청은 MyFilter 를 거쳐가게 된다.
/ : 모든요청처리(프로젝트 경로기준) : 간단하게 현재 루트 경로만 설정한다고 생각.
/index/fwmef/index.jsp 일 때 가장 처음 index 만 지원하고 하위 경로는 서블릿이나 필터가 매칭되지 않는다.
프로젝트 기본경로 설정
수업내용 때 아주 자주많이 사용하는 문법인데, 프로젝트 자체에 경로를 설정할 때 쓰는 구문이다.
${pageContext.request.contextPath}/index.jsp 이런식의 구문을 많이 사용했는데 이게 뭐냐면
웹에서 상대적인 경로를 나타내는 것이다.
예를 들어 /test 라는 url 에서 js나 jsp 를 실행하려고 하는데 절대 경로인
/test/js/js1.js 이렇게 지정을 하면 무조건 test 안에 있을 때만 js 파일이 실행되는데
/test/context/js/js1.js 이렇게 주소가 조금만 바뀌어도 절대 경로는 경로를 그대로 인식하기 때문에 파일을 찾을 수 없어 404 에러가 뜬다.
이때 ${pageContext.request.contextPath}/js/testJs2.js 이렇게 지정을 하면 변경되는 path 값을 자동으로 넣어주기 때문에 따로 경로를 수정하지 않아도 된다.
비슷하게 사용되는 메서드들이다.
${pageContext.request.requestURL} : 전체 URL
${pageContext.request.scheme} : http
${pageContext.request.serverName} : localhost
${pageContext.request.serverPort} : 포트번호
${pageContext.request.requestURI} : 요청 URI
${pageContext.request.servletPath} : 파일명
DataSource란 ?
DataSource는 JDBC에서 데이터베이스 연결을 효율적으로 관리하기 위한 객체로, 커넥션 풀을 통해 데이터베이스 연결을 재사용하며 성능을 높이고, JNDI를 통해 쉽게 참조할 수 있어 유연한 연결 관리를 가능하게 합니다.
'Developer Note > 국비과정 수업내용 정리&저장' 카테고리의 다른 글
24년 11월 4일 (4) | 2024.11.06 |
---|---|
24년 11월 1일 (3) | 2024.11.05 |
24년 10월 30일 (1) | 2024.11.04 |
24년 10월 29일 (0) | 2024.11.03 |
24년 10월 25일 (0) | 2024.10.25 |