<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>모르면 알 때까지</title>
    <link>https://galerigman.tistory.com/</link>
    <description>모르면 알때까지 학습하자</description>
    <language>ko</language>
    <pubDate>Thu, 11 Jun 2026 17:55:20 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>모알</managingEditor>
    <image>
      <title>모르면 알 때까지</title>
      <url>https://tistory1.daumcdn.net/tistory/3271382/attach/e33f710948d546b0881dd92152bc13aa</url>
      <link>https://galerigman.tistory.com</link>
    </image>
    <item>
      <title>GTM(Google Tag Manager) - 간단 이해</title>
      <link>https://galerigman.tistory.com/11</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;GTM(Google Tag Manager) - 웹사이트나 앱에 들어가는 여러 추적 코드, 태그를 개발자가 매번 코드 수정하지 않아도 관리자가 화면에서 추가, 수정, 배포할 수 있게 해주는 도구&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GTM의 핵심 구조&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;태그 - 실제로 실행되는 코드( 무엇을 실행할 것인가? )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;트리거 - 태그가 언제 실행될지 정하는 조건( 언제 실행될 것 인가? )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수 - 태그나 트리거에서 쓰는 값( 어떤 값을 사용할 것인가? )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한마디로 GTM은 &quot;어떤 태그를, 어떤 조건에서 어떤 값을 사용해서 실행할지&quot; 관리하는 도구다.&lt;/p&gt;</description>
      <category>공부/GTM</category>
      <author>모알</author>
      <guid isPermaLink="true">https://galerigman.tistory.com/11</guid>
      <comments>https://galerigman.tistory.com/11#entry11comment</comments>
      <pubDate>Mon, 1 Jun 2026 23:18:22 +0900</pubDate>
    </item>
    <item>
      <title>web.xml 대해서</title>
      <link>https://galerigman.tistory.com/10</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;java 웹 애플리케이션&lt;/u&gt;의 설정 파일&lt;/b&gt;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;┗ java 웹 애플리케이션 : 웹 브라우저를 통해 사용자가 주고받는 요청을 처리하는 프로그램(백엔드를 java로 구현)&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;왜 필요하지?&lt;/b&gt;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. &lt;u&gt;Servlet&lt;/u&gt;과 URL 매핑&lt;/b&gt;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;┗&lt;span&gt;&lt;u&gt; Servlet&lt;/u&gt; : 웹페이지를 동적으로 생성하는 서버 측 프로그램(java 기반 웹 처리기)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;※ Servlet 프로그램 구체적인 가동 모습&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;java 파일 &amp;gt; 컴파일(class) &amp;gt; 톰캣서버에 저장 &amp;gt; 톰캣서버 구동 &amp;gt; 프로그램 동작 대기&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&amp;gt; 요청 전달(ex. https://www.test.com 입력)&amp;nbsp; &amp;gt; 톰캣 서버 특정 Servlet 프로그램을 메모리에 올려서 실행&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&amp;gt; 로직 수행 &amp;gt; 결과 전송&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;[추가적인 사항]&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;매번 요청 전달이 된다고 Servlet 프로그램이 메모리에 매번 올리지 않는다.&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;톰캣이 켜질 때 딱 한번 객체를 생성해서 메모리에 올림( &lt;u&gt;싱글톤 패턴&lt;/u&gt; ) - 재사용&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;┗&lt;span&gt;&lt;u&gt; 싱글톤 패턴&lt;/u&gt; : 어떤 클래스의 인스턴스가 딱 1개만 생성되도록 보장하는 디자인 패턴&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;service() 메소드를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;u&gt;쓰레드&lt;/u&gt;만 갈아끼우면서 호출&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;싱글톤 패턴을 왜 사용해야할까?&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;1~10명정도는 크게 상관없을 거 같은데 10,000명 혹은 10,000,000명이 동시에 들어와서 작업을 한다고 하면&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;싱글톤이 아니면 매번 요청 &amp;gt; 메모리 생성 &amp;gt; 작업 끝나면 가비지 컬렉터가 수거 이 동작을 존재하는 명만큼 작업을 해야되서&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;느려지거나 멈춰버린다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;그래서 하나의 인스턴스를 만들어서 순서에 따라서 스레드만 교체해서 실행하면 메모리 절약이 된다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;여기서 순서는 큐 &amp;gt; 락&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 필터 설정&lt;/b&gt;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;대표적인 활용 : &lt;u&gt;인코딩&lt;/u&gt; 설정(UTF-8), 로그인 여부 확인하는 인증 필터 등&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;┗ &lt;u&gt;인코딩&lt;/u&gt; : 다른 환경의 컴퓨터가 읽기 쉽게 데이터의 형태(포맷) 변환(용량이 줄수도 늘수도 있음) - 반대개념(디코딩)&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;? 갑자기 드는 생각 ?&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;인코딩과 컴파일의 차이는?&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;인코딩은 &lt;b&gt;&lt;i&gt;데이터&lt;/i&gt;&lt;/b&gt;를 컴퓨터가 읽기 좋게 변환하는 과정이라면&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;특징 : 변환 규칙을 알면 누구나 디코딩을 완벽하게 돌릴 수 있음&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;컴파일은 사람이 작성한 &lt;b&gt;&lt;i&gt;소스코드&lt;/i&gt;&lt;/b&gt;(하이레벨)를 컴퓨터가 읽기 쉬운 기계어(로우레벨)로 변환&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;특징 : 컴퓨터가 읽어야 하기 때문에 빠른 경로로 실행할 수 있도록 복잡한 연산 과정이 포함됨. 완벽한 소스코드로 디컴파일 하는 것이 매우 어려움&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 애플리케이션 초기화 파라미터 및 &lt;u&gt;리스너&lt;/u&gt; 설정&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;┗&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;u&gt;리스너(Listener)&lt;/u&gt;: 웹 애플리케이션이 시작되거나 종료될 때 특정 이벤트를 감지해서 실행하는 하나의 클래스 파일&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;리스너 사용방법( 제일 많이 사용되는 리스너 )&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-pm-slice=&quot;1 1 []&quot;&gt;ServletContextListener - 서버가 켜지고 꺼질 때를 포착&lt;/li&gt;
&lt;li data-pm-slice=&quot;1 1 []&quot;&gt;HttpSessionListener - 접속하거나 나갈 때 포착&lt;/li&gt;
&lt;li data-pm-slice=&quot;1 1 []&quot;&gt;HttpSessionAttributeListener - 데이터를 넣거나 삭제할 때 포착&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;위 3가지 안에 많은 메소드 들이 존재하는데 원하는 메소드를&amp;nbsp;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;내가 만든 새로운 리스너 안에서 메소드 오버라이드해서 사용함&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어&lt;/p&gt;
&lt;pre id=&quot;code_1779201277096&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import javax.servlet.annotation.WebListener;

@WebListener // 과거에는 web.xml에 등록했으나, 요즘은 이 어노테이션 하나로 등록 끝!
public class UserCounterListener implements HttpSessionListener { &amp;lt;!-- UserCounterListener 클래스가  HttpSessionListener  인터페이스 구현 --&amp;gt;

    private static int activeUsers = 0;

    // 세션이 생성될 때 (새로운 사용자가 접속했을 때)
    @Override
    public void sessionCreated(HttpSessionEvent se) { &amp;lt;!-- HttpSessionListener안에  sessionCreated 메소드 존재 --&amp;gt;
        activeUsers++;
        System.out.println(&quot;새로운 사용자가 접속했습니다. 현재 접속자: &quot; + activeUsers + &quot;명&quot;);
    }

    // 세션이 소멸될 때 (로그아웃하거나 브라우저를 닫아서 세션이 끊겼을 때)
    @Override
    public void sessionDestroyed(HttpSessionEvent se) { &amp;lt;!-- HttpSessionListener안에  sessionDestroyed 메소드 존재 --&amp;gt;
        if (activeUsers &amp;gt; 0) {
            activeUsers--;
        }
        System.out.println(&quot;사용자가 나갔습니다. 현재 접속자: &quot; + activeUsers + &quot;명&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;┗&lt;/span&gt; &lt;u&gt;implements&lt;/u&gt; : 인터페이스 구현한다는 의미&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;implements는 인터페이스에 있는 메소드의 규칙을 그대로 가져와서 오버라이드 해서 만드는 방식( 이름, 리턴타입, 파라미터 )&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;extend와 차이점은?&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;extend는 상속받은 부모 클래스의 메소드를 가져와서 바로 사용하거나 오버라이드해서 변경해서 사용 가능&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;요리로 비유하면&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;implements - 레시피( 정해진 결과물/기능 구현한다. 단, 구현 방식은 클래스마다 다를 수 있다. )&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;extends - 밀키트를 그대로 사용하거나 다른 방식으로 변형한 요리( 정석적인 방법 또는 완전 새로운 방법 )&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;? 갑자기 드는 생각 ?&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;웹 컴포넌트( Listener, Filter, Interceptor ) 실행 순서와 각각의 차이는?&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;1. 순서&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;사용자 요청 &amp;gt; Listener &amp;gt; Filter &amp;gt; Interceptor &amp;gt; 컨트롤러&lt;/s&gt;( 돌아올 때는 역순 )&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;제미나이 정정 : [사용자 요청] -&amp;gt; [Filter] -&amp;gt; [&lt;u&gt;DispatcherServlet&lt;/u&gt; (서블릿 시작)] -&amp;gt; [Interceptor] -&amp;gt; [Controller]&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;┗&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt; &lt;u&gt;DispatcherServlet : 스프링 MVC( Spring MVC ) 프레임워크의 핵심 엔진&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;Dispatcher뜻 : 보내다, 파견하다, 배차원&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;즉, 클라이언트에서 들어온 요청을 가장먼저 받아서 처리할 수 있는 적절한 컨트롤러에 나누어주는 중앙 배달원&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;DispatcherServlet&amp;nbsp; 왜 생겨나게 됬을까?&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;디스패치 서블릿이 없던 시절&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;web.xml에 매번 등록(기능이 100개면 100개 다 등록)&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;비효율을 줄이고자 만들어지게 됨&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;리스너는 요청의 흐름 위에 존재하는게 아니다.&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;특정 사건(이벤트)에만 독자적으로 실행&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;그리고 Filter는 &lt;u&gt;스프링 context&lt;/u&gt;안으로 들어오기 전에 동작한다&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;┗&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt; &lt;u&gt;스프링 context :&amp;nbsp;&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;Interceptor는 &lt;u&gt;스프링 컨테이너&lt;/u&gt; 내부에서 동작&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;┗&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt; &lt;u&gt;스프링 컨테이너 :&amp;nbsp;&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;2. 차이점&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&quot;기술이 어느 영역에 속해 있는가&quot; 가 기준&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;- 리스너(Listener)&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;영역 : 웹 애플리케이션(WAS)자체의 시작과 종료&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;- 필터(Filter)&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;영역 : 웹 컨테이너&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;- 인터셉터(Interceptor) - 스프링에만 존재&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;영역 : 스프링 컨테이&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;정적처리 : 단순 저장된 파일 보여주기(&lt;u&gt;Web Server&lt;/u&gt;)&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;┗&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;u&gt; Web Server&lt;/u&gt; : 정적 자원을 그대로 돌려주는 서버&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;동적처리 : 인풋에 따라 결과 값이 다르게 보여주기(&lt;u&gt;WAS&lt;/u&gt;)&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;┗&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;u&gt; WAS(Web Application Server)&lt;/u&gt; : 비즈니스 로직을 실행해서 그때 그때마다 다르게 결과값을 만들어 내는 서버&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;web.xml의 간단한 구조&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779201319758&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;web-app xmlns=&quot;http://xmlns.jcp.org/xml/ns/javaee&quot; version=&quot;3.1&quot;&amp;gt;

    &amp;lt;!-- 1. 한글 깨짐 방지를 위한 인코딩 필터 설정 --&amp;gt;
    &amp;lt;filter&amp;gt;
        &amp;lt;filter-name&amp;gt;encodingFilter&amp;lt;/filter-name&amp;gt;
        &amp;lt;filter-class&amp;gt;org.springframework.web.filter.CharacterEncodingFilter&amp;lt;/filter-class&amp;gt;
        &amp;lt;init-param&amp;gt;
            &amp;lt;param-name&amp;gt;encoding&amp;lt;/param-name&amp;gt;
            &amp;lt;param-value&amp;gt;UTF-8&amp;lt;/param-value&amp;gt;
        &amp;lt;/init-param&amp;gt;
    &amp;lt;/filter&amp;gt;
    &amp;lt;filter-mapping&amp;gt;
        &amp;lt;filter-name&amp;gt;encodingFilter&amp;lt;/filter-name&amp;gt;
        &amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt; &amp;lt;!-- 모든 요청에 적용 --&amp;gt;
    &amp;lt;/filter-mapping&amp;gt;

    &amp;lt;!-- 2. 서블릿 등록 및 URL 매핑 --&amp;gt;
    &amp;lt;servlet&amp;gt;
        &amp;lt;servlet-name&amp;gt;homeServlet&amp;lt;/servlet-name&amp;gt;
        &amp;lt;servlet-class&amp;gt;com.example.HomeServlet&amp;lt;/servlet-class&amp;gt; &amp;lt;!-- 2. 해당 패키지의 Servlet 실행 --&amp;gt; 
    &amp;lt;/servlet&amp;gt;
    &amp;lt;servlet-mapping&amp;gt;
        &amp;lt;servlet-name&amp;gt;homeServlet&amp;lt;/servlet-name&amp;gt;
        &amp;lt;url-pattern&amp;gt;/home&amp;lt;/url-pattern&amp;gt; &amp;lt;!-- 1. /home으로 들어오면 실행 --&amp;gt;
    &amp;lt;/servlet-mapping&amp;gt;

    &amp;lt;!-- 3. 웰컴 파일 (기본 메인 페이지) 지정 --&amp;gt;
    &amp;lt;welcome-file-list&amp;gt;
        &amp;lt;welcome-file&amp;gt;index.jsp&amp;lt;/welcome-file&amp;gt; &amp;lt;!-- 1. 순차적으로 실행 --&amp;gt;

        &amp;lt;welcome-file&amp;gt;index.jsp&amp;lt;/welcome-file&amp;gt;
    &amp;lt;/welcome-file-list&amp;gt;

&amp;lt;/web-app&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;최신 기술을 사용하는 곳에서는 못볼 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;이유는 2가지이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;1. Servlet 3.0으로 오면서 @(어노테이션)으로&amp;nbsp; 대신할 수 있기 때문&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;2. Spring Boot의 대세화&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;하지만 레거시 시스템 유지보수는 종종 만날 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;(내가 겪어왔던 프로젝트에서는 거의 존재했다 왜냐면 공공기관이거나 대기업에서도 레거시 시스템을 운용하기 때문이다.)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>프로그래밍/JAVA</category>
      <author>모알</author>
      <guid isPermaLink="true">https://galerigman.tistory.com/10</guid>
      <comments>https://galerigman.tistory.com/10#entry10comment</comments>
      <pubDate>Mon, 1 Jun 2026 23:00:09 +0900</pubDate>
    </item>
  </channel>
</rss>