새로운 내용을 공부할 때
새로운 내용의 공부를 시작할 때 용어의 정의를 이해하지 못하거나 정확하게 알지 못한다면 그 용어가 포함된 문장을 이해하지 못합니다.
작은 단어 하나가 내용을 이해하지 못하게 하기 때문에 용어를 정확하게 이해하는 것이 중요합니다.
ServletContextListener와 이벤트
목표 D-day : 38 일
오늘은 제가 제일 이해하지 못했고, 학습이 부족했던 이벤트와 관련된 기능을 학습합니다.
학습목표
- 이벤트 정의와 이벤트 리스너 정의에 새로운 용어를 이해하기
- ServletContextListener 학습하기
이벤트란
단어의 의미로 사건
,행사
,경기
를 의미합니다.
이벤트는 웹 서블릿 컨테이너에서 상태 변경(예: 서블릿 컨텍스트 생성 및 소멸)이나 동작(예: 웹 요청 수신) 처럼 사건이 발생하는 것을 말합니다.
게임 회사에서 새로운 게임을 발매할 경우 이벤트를 합니다. 이벤트를 하는 이유는 새로운 게임을 발매했다고 고객에게 알리기 위한 것처럼 서블릿 컨테이너도 특정 일을 할 때에 이벤트를 합니다. 알리기 위해서 입니다.
이벤트 리스너
이벤트 리스너는 특정 이벤트가 발생했을 때 이를 감지하고 반응하기 위해 태어난 친구입니다.
스프링 쿨러처럼 화재나 온도가 높아지면 이를 감지하고 화재를 소화하기 위한 친구와 같습니다.
웹 개발에서 이벤트 리스너는 애플리케이션의 상태 변경이나 특정 이벤트(예: 세션 생성, 소멸 등)을 감지하고, 이에 맞춰 정의된 동작을 수행합니다.
이벤트 리스너는 이벤트를 발생 시키는 대상을 지켜보다 특정 행동을 하는 것을 감지하고 특정 동작을 처리할 수 있는 인터페이스입니다. 다양한 이벤트를 감시할 수 있도록 설계되었습니다.
ServletContext란
서블릿 컨텍스트를 정의하기 전에 먼저 컨텍스트 용어를 이해해야 합니다.
컨텍스트는 한글로 문맥이라고 하며 위키백과에서 아래와 같이 정의를 했습니다.
문맥은 사건 주변의 프레임이며 적절한 해석을 위해 자원을 제공한다. 그러므로 특정 프레임 안에서 핵심이 되는 일부 사건과 관련해서만 정의가 가능한 상대적 개념이다.
소설에서 문맥은 특정 사건이 발생되면 그 사건을 이해를 돕기 위해 앞이나 뒤에 일들이 설명됩니다. 문맥은 특정 사건을 해석을 돕기 위해 앞 뒤에 일(자원)을 제공한다고 말하는 것처럼 서블릿 컨텍스트를 저 정의에 맞게 변경해보면
서블릿 컨텍스트는 웹 어플리케이션의 프레임이며, 적절한 자원과 환경을 제공합니다. 따라서 특정 애플리케이션 내에서 핵심이 되는이벤트와 관련하여 정의되는 상대적 개념입니다.
한 줄로 정리하면 웹 어플리케이션이 잘 동작하기 위해 자원과 환경을 제공하는 프레임입니다.
ServletContextListener
먼저 리스너는 이벤트 기반 프로그래밍에서 사용되는 개념입니다.
특정 이벤트나 상태 변화를 감지하고 그에 따른 동작을 수행하는 객체나 인터페이스를 의미합니다.
- 스프링 쿨러, 블루투스 이어폰 손 동작, 자동문도 리스너 에 해당됩니다.
리스너는 특정 사건이나 상태 변화의 맥락에 동작하며, 적절한 반응을 제공하기 위해 자원을 활용합니다.
그러므로 리스너는 이벤트와 관련된 문맥 안에서만 정의가 가능합니다.
서블릿 컨텍스트 리스너를 정의해보면
서블릿 컨텍스트의 이벤트를 감지하는 리스너로, 해당 이벤트의 문맥에서 적절한 자원과 기능을 제공합니다.
따라서 서블릿 컨택스트 리스너는 서블릿 애플리케이션의 중요한 생명주기 이벤트와 관련하여 정의되는 상대적 개념입니다.
하지만 감지한다는 표현보다는 이벤트가 발생될 때 동작하는 인터페이스와 기능을 제공하는 객체라고 생각됩니다.
적용하기
서블릿 컨테이너 환경에서 서블릿 컨테이너 리스너를 사용하려면 해당 클래스를 리스너로 등록해야합니다.
등록하는 방법은 web.xml
과 @WebListener
를 활용하는 방법이 있습니다.
스프링 부트에서 @WebListener
를 사용하기 위해서 설정 클래스 위에 @ServletComponentScan
을 추가해야 합니다.
제공하는 기능
-
contextInitialized(ServletContextEvent event)
애플리케이션이 시작할 때 발생합니다. 서블릿 컨텍스트가 초기화하면서 이벤트를 발생합니다.
서블릿에 필요하지만 초기화가 오래 걸리는 DB 연결이나 설정을 할 때 사용합니다.
-
ontextDestroyed(ServletContextEvent event)
서블릿 컨텍스트가 소멸되기 직전에 호출합니다. 자원을 해제하거나 종료 작업을 할 때 유용합니다. 예를 들어 데이터베이스 연결 해제나 파일 자원 정리 등이 있습니다.
정리
-
서블릿 컨텍스트 정의
웹 어플리케이션의 프레임이며, 적절한 자원과 기능을 제공하기 위한 환경을 제공한다.
-
서블릿 컨텍스트 리스너 정의
서블릿 컨텍스트에서 이벤트가 발생하면 이벤트 상황에 대한 로직을 정의할 수 있게 도와주는 객체이다.
느슨한 결합
서블릿 컨텍스트 🔜 이벤트 리스너 🔜 웹 애플리케이션
이벤트 리스너라는 인터페이스를 통해서 서블릿 컨텍스트에 직접 코드를 작성하지 않고 이벤트 처리 로직을 작성할 수 있습니다.
서블릿 컨텍스트가 톰캣, 제티등 변경이 되어도 동일한 표준 인터페이스를 사용하므로 웹 애플리케이션은 로직 변경을 하지 않아도 됩니다.
- 유지보수성이 높아진다.
- 확장하기 편하다.
단점과 한계
- 이벤트와 리스너가 분리되어 있는 구조로 코드의 흐름을 파악하기 어렵습니다. 리스너가 서로 다른 위치에 있는 경우라면 관리도 어렵습니다.
- 관리 비용이 증가할 수 있습니다. 이벤트 리스너의 순서나 많은 리스너가 등록되어 중첩되는 경우에도 성능 저하나 잘못된 리스너 호출이 발생할 수 있습니다.
느슨한 결합은 언제 사용해야 할까
-
변경 가능성이 높은 경우에 해당됩니다.
A 🔜 B 로 직접 의존하여 사용하는 경우 B가 변경되거나 A가 변경되는 경우가 많다면 구현체를 직접 의존 하는 경우 코드 변경이 많아집니다.
A 🔜 인터페이스 🔜 인터페이스 구현체 구조로 만들게 된다면 서로 변경이 되어도 코드 변경할 필요가 없습니다.
-
확장성과 재사용성이 중요할 때에 사용하면 좋습니다.
결제 🔜 현금 결제 구조로 한다면 결제 방식이 추가될 때마다 새로운 결제 방식을 의존해야합니다.
결제 🔜 결제 방식 인터페이스 🔜 현금, 카드사, 자동이체 등 이렇게 느슨한 결합을 사용하는 경우 유용합니다.
느슨한 결합이 필요없는 경우
- 단순한 구조가 필요할 때입니다. 시스템이 단순하고, 결합이 높아도 큰 문제가 없는 경우 느슨한 결합은 오히려 불필요한 복잡하게 만듭니다.
- 구현이 자주 변경되지 않는 경우에 해당됩니다. 특정 동작이 변경될 가능성이 낮고, 명확하게 정의된 프로세스만 수행하기로 결정된 경우에 해당됩니다.
댓글남기기