기본 콘텐츠로 건너뛰기

java.lang.ClassNotFoundException: ContextLoaderListener 에러 해결 방법 (Eclipse + Tomcat)

[Spring] java.lang.ClassNotFoundException: ContextLoaderListener 에러 해결 완벽 가이드 작성일: 2025. 12. 10 | 분류: Java/Spring Framework Spring MVC 프로젝트를 Eclipse와 Tomcat 환경에서 배포하다 보면 종종 마주치는 악명 높은 에러가 있습니다. 로컬 테스트(Unit Test)에서는 잘 돌아가는데, 서버를 띄우면 갑자기 404 혹은 500 에러와 함께 콘솔에 다음 로그가 찍히는 경우입니다. java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:xxx) ... 이 에러가 발생하면 스프링 컨텍스트가 로드되지 않아 아무런 페이지도 뜨지 않습니다. 이 글에서는 이 에러의 정확한 원인과, Eclipse Deployment Assembly 설정 을 중심으로 한 가장 확실한 해결 방법을 정리합니다. 1. 에러의 원인: "배포된 곳에 파일이 없다" 이 예외(Exception)의 의미는 아주 단순합니다. ⚠️ 문제 상황 Tomcat이 구동되면서 web.xml 을 읽고 리스너를 실행하려는데, org.springframework.web.context.ContextLoaderListener 클래스 파일을 찾을 수 없다는 뜻입니다. 분명히 프로젝트에는 Spring 라이브러리가 추가되어 있는데 왜 못 찾는 걸까요? 원인은 "이클립...

Oracle Calendar

[Oracle] SQL로 달력 만들기: CONNECT BY LEVEL을 활용한 날짜 생성 완벽 가이드 개발을 하다 보면 '데이터가 없는 날짜' 까지 포함해서 조회해야 하는 상황을 자주 마주합니다. 예를 들어 일별 매출 리포트를 뽑는데, 매출이 0원인 날짜는 아예 조회되지 않아 그래프가 뚝뚝 끊기는 현상 같은 것들이죠. 이럴 때 필요한 것이 바로 1일부터 말일까지 꽉 채워진 '달력 테이블(Calendar Dummy Table)' 입니다. 오늘은 오라클(Oracle)의 강력한 계층형 쿼리 기능인 CONNECT BY LEVEL 을 사용하여, 단 3줄의 SQL로 특정 월의 모든 날짜를 생성하는 방법을 심층 분석해 보겠습니다. 1. 핵심 쿼리 분석 가장 먼저, 질문자님께서 공유해주신 코드를 기반으로 핵심 로직을 뜯어보겠습니다. 이 쿼리는 2018년 4월의 1일부터 30일까지를 생성하는 예제입니다. SELECT TO_CHAR(TO_DATE('201804'||LPAD(LEVEL,'2',0), 'YYYYMMDD'),'YYYYMMDD') AS YMD , LEVEL FROM (SELECT TO_DATE('20140601', 'YYYYMMDD') MAKE_DATES FROM DUAL) -- (A) CONNECT BY LEVEL <= TO_CHAR(LAST_DAY(sysdate),'DD') -- (B) 이 쿼리가 작동하는 원리는 다음과 같습니다. (A) DUAL 집합: CONNECT BY 를 수행하기 위한 모태가 되는 1건짜리 데이터입니다. (실제 날짜 값은 바깥에서 하드코딩 되어 있으므로 여기선 단순히 Row Source 역할만 합니다.) ...

SFTP 파일 업로드 및 다운로드

🔒 Java JSch 활용: SFTP 파일 업로드/다운로드 유틸리티 완벽 분석 JSch(Java Secure Channel)는 Java에서 SSH2를 구현한 라이브러리로, 안전한 SFTP 통신을 가능하게 합니다. 파일 다운로드, 업로드, 그리고 파일 전송에 필요한 디렉터리 생성 로직까지 포함된 핵심 유틸리티 코드를 분석해 보겠습니다. 1. 🔑 SFTP 접속 공통 로직 다운로드 및 업로드 함수 모두 공통적으로 **`GetProperties`**를 사용하여 접속 정보를 불러온 후, JSch를 통해 SSH 세션을 설정합니다. 특히 `StrictHostKeyChecking`을 `no`로 설정하는 부분은 최초 접속 시 호스트 키 검사를 생략하여 편리하게 접속하도록 합니다 (보안상 운영 환경에서는 신중하게 고려해야 할 설정입니다). // JSch 초기화 및 세션 설정 JSch jsch = new JSch(); session = jsch.getSession(ID, IP, Integer.parseInt(PORT)); session.setPassword(PWD); // StrictHostKeyChecking 설정 java.util.Properties config = new java.util.Properties(); config.put("StrictHostKeyChecking", "no"); session.setConfig(config); session.connect(); // SFTP 채널 열기 channel = session.openChannel("sftp"); channel.connect(); channelSftp = (ChannelSftp) channel; 2. ⬇️ 파일 다운로드 로직 분석 (`download`...

Oracle 전체 테이블 삭제 및 DB 링크 복제 자동화: PL/SQL 실전 스크립트 정리

Oracle DB 전체 테이블 삭제 및 DB 링크로 테이블·데이터 복사 자동화하기 개발·운영 환경을 초기화하거나, 다른 서버의 스키마를 그대로 복제해야 할 때 “전체 테이블 삭제 → DB 링크를 이용한 테이블/데이터 복사” 작업이 자주 필요합니다. 이 글에서는 Oracle 데이터베이스 기준으로 PL/SQL 루프 + EXECUTE IMMEDIATE 를 활용해 전체 테이블 삭제와 DB 링크를 통한 테이블/데이터 복사를 자동화하는 방법 을 정리합니다. 실무에서 바로 쓸 수 있는 예제 코드와, 꼭 확인해야 할 주의사항까지 함께 담았습니다. 📚 목차 Oracle DB 전체 테이블 삭제 (user_tables 기반) DB 링크로 테이블 구조만 복사하기 DB 링크로 테이블 데이터까지 복사하기 실무에서 자주 하는 튜닝·주의사항 1. Oracle DB 전체 테이블 삭제 (user_tables 기반) 개발 환경을 초기화하거나, 테스트용 스키마를 리셋할 때 user_tables 기준으로 현재 스키마의 모든 테이블을 DROP 하는 패턴입니다. 아래 예제는 PL/SQL 블록 + 커서 루프 로 구현한 기본 형태입니다. BEGIN FOR c IN (SELECT table_name FROM user_tables) LOOP EXECUTE IMMEDIATE 'DROP TABLE ' || c.table_name || ' CASCADE CONSTRAINTS'; END LOOP; END; / 1-1. 코드 설명 user_tables : 현재 접속한 유저가 소유한 테...

[Spring Security] SecurityContext로 강제 로그인 처리하기 (SSO·백오피스 연동 팁)

[Spring Security] SecurityContext로 강제로 로그인 처리하기 (SSO·백오피스 연동) [Spring Security] SecurityContext로 강제로 로그인 처리하기 (SSO·백오피스 연동) 내부 시스템이나 SSO 연동 , 또는 이미 별도 인증 과정을 거친 뒤 Spring Security 세션만 강제로 만들어야 하는 상황 이 종종 있습니다. 이 글에서는 SecurityContext 와 UsernamePasswordAuthenticationToken 을 사용해 프로그램적으로 로그인(강제 로그인) 처리 하는 방법을 예제와 함께 정리합니다. 1. 왜 강제 로그인(프로그램 로그인)이 필요할까? 대표적인 사용 시나리오는 다음과 같습니다. 사내 SSO 서버에서 이미 인증을 완료했고, 결과로 내려온 ID로만 Spring Security 컨텍스트를 세팅 하고 싶을 때 별도 로그인 페이지 없이, 백오피스·관리자 화면에서 바로 내부 계정으로 진입 시켜야 할 때 테스트·운영 도구 등에서 특정 계정으로 자동 로그인 이 필요할 때 ⚠️ 단, 이런 강제 로그인은 보안적으로 매우 주의 해야 합니다. 외부에서 이 로직에 접근할 수 없도록 IP 제한, 별도 권한 체크, 토큰 검증 등을 반드시 거쳐야 합니다. 2. 기존 강제 로그인 코드 이해하기 질문에서 주신 예제 코드를 조금 다듬어서 먼저 살펴보겠습니다. 2-1. 예제 코드 SecurityContext securityContext = SecurityContextHolder.getContext(); UsernamePasswordAuthenticationToken result = null; List<Gra...

jQuery dynamicInput으로 파일·텍스트 입력 필드 동적 추가/삭제 구현하기

jQuery dynamicInput 플러그인으로 파일·텍스트 입력필드 동적 추가/삭제 구현하기 폼에 첨부파일이나 텍스트 입력 필드를 동적으로 추가/삭제 해야 할 때, 매번 HTML을 복붙하거나 인덱스를 신경 쓰는 것은 상당히 번거롭습니다. 이 글에서는 jQuery로 구현한 dynamicInput 플러그인을 이용해서 추가 , 삭제 버튼만으로 입력 필드를 편리하게 관리하는 방법을 정리해 보겠습니다. 1. dynamicInput 플러그인 개념 $.fn.dynamicInput 은 jQuery 플러그인 형태로 구현된 함수로, 다음과 같은 기능을 제공합니다. 파일 입력( type="file" ) 또는 텍스트 입력( type="text" )을 동적으로 추가/삭제 최대 개수(max) 설정으로 무한 추가 방지 기존 첨부파일 리스트( viewData )를 보여주고, 삭제 버튼으로 논리 삭제 처리 실제 삭제 대상은 hidden 필드 값으로 서버에 전송 기본 아이디어는 다음과 같습니다. 대상 영역에 플러그인을 초기화한다. ( $("#addFileZone").dynamicInput({...}) ) 플러그인 내부에서 추가/삭제 버튼 과 입력 필드 그룹 을 자동으로 생성한다. 버튼 클릭 시, 설정에 따라 입력 필드 DOM을 추가하거나 삭제한다. 2. 개선된 dynamicInput 플러그인 코드 아래 코드는 파일 타입만 지원하던 기존 코드 에서 확장해서, 첨부파일( file )과 텍스트( text ) 모두 처리할 수 있도록 보완한 버전입니다. $.fn.dynamicInput = function(opt){ var t = $(this); // 플러그인을 적용할 대상 컨테이너 var btnBody = $(document.createElement('span')); // 추가/삭제 버튼 영...

jQuery 플러그인 패턴 템플릿 완전 정리: $.fn.pluginName 예제와 사용법

jQuery 플러그인 패턴 템플릿 | pluginName 기본 구조와 사용법 jQuery 플러그인 패턴 템플릿: pluginName 기본 구조 완벽 정리 jQuery를 사용하다 보면 공통 기능을 플러그인 으로 만들어서 재사용하고 싶을 때가 많습니다. 이때 매번 구조를 처음부터 짜기보다는, 플러그인 패턴 템플릿 을 하나 만들어 두면 매우 편리합니다. 이 글에서는 아래와 같은 pluginName jQuery 플러그인 템플릿 코드 를 기반으로, 각 부분이 어떤 역할을 하는지, 어떻게 수정해서 나만의 플러그인을 만들 수 있는지 SEO 친화적인 설명과 함께 정리합니다. jQuery 플러그인 기본 템플릿 코드 (function($) { // 플러그명 (생성자 역할) $.pluginName = function(element, options) { // 기본 옵션 var defaults = { foo: 'bar', onFoo: function() {} }; var plugin = this; // 플러그인 설정 객체 plugin.settings = {}; var $element = $(element), element = element; // 초기화 plugin.init = function() { // 사용자 옵션과 기본 옵션 병합 plugin.settings = $.extend({}, defaults, options); }; // public 메서드 (외부에서 호출 가능) plugin.foo_public_method = function() { ...