<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>민우의 블로그</title>
    <link>https://miniminichipchip.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sat, 9 May 2026 07:26:54 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>미니미니칩칩</managingEditor>
    <item>
      <title>Spring MVC</title>
      <link>https://miniminichipchip.tistory.com/48</link>
      <description>&lt;div class=&quot;markdown-body&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;어플리케이션을 세 가지 영역, 즉 모델(Model), 뷰(View), 컨트롤러(Controller)로 구분하여 작업을 분리하는 웹 어플리케이션 개발 방법론&lt;/li&gt;
&lt;li&gt;'로직과 화면을 분리'하는 스타일의 개발 방식인 &lt;b&gt;모델 2&lt;/b&gt; 방식으로 처리&lt;/li&gt;
&lt;li&gt;서로 간의 결합도를 최소화하고 유지보수성을 높이며 개발의 효율성을 향상&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image.png&quot; data-origin-width=&quot;1009&quot; data-origin-height=&quot;441&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/barNqb/btsOxEopH8o/AoeSKfDGczp34cIK6HR6L1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/barNqb/btsOxEopH8o/AoeSKfDGczp34cIK6HR6L1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/barNqb/btsOxEopH8o/AoeSKfDGczp34cIK6HR6L1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbarNqb%2FbtsOxEopH8o%2FAoeSKfDGczp34cIK6HR6L1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1009&quot; height=&quot;441&quot; data-filename=&quot;image.png&quot; data-origin-width=&quot;1009&quot; data-origin-height=&quot;441&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;h3 data-ke-size=&quot;size23&quot;&gt;주요 컴포넌트&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;DispatcherServlet&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클라이언트의 &lt;b&gt;모든 Request를 우선적으로 받아 처리&lt;/b&gt;하는 서블릿&lt;/li&gt;
&lt;li&gt;&lt;b&gt;HandlerMapping&lt;/b&gt;에게 &lt;b&gt;클라이언트의 요청을 처리할 Controller에 대한 검색을 요청&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;HandlerMapping으로부터 &lt;b&gt;클라이언트 요청과 매핑되는 핸들러 객체를 다시 리턴&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Request에 대해&lt;/b&gt; 실제 클라이언트의 요청을 &lt;b&gt;어느 컨트롤러로 매핑시킬 것인지 배치하는 역할&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;HandlerAdapter
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DispatcherServlet이 찾아낸 &lt;b&gt;Controller의 Handler 메서드를 호출&lt;/b&gt;하는 역할&lt;/li&gt;
&lt;li&gt;다양한 방식의 Controller(예: &lt;code&gt;@Controller&lt;/code&gt; 어노테이션, &lt;code&gt;Controller&lt;/code&gt; 인터페이스)를 일관된 방식으로 처리&lt;/li&gt;
&lt;li&gt;Controller 구현 방식에 상관없이 DispatcherServlet이 유연하게 Controller 호출 가능하도록 추상화된 인터페이스 제공&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-java&quot;&gt;// Handler Adapter가 제공하는 단순한 인터페이스
public interface HandlerAdapter {
      // handler == Controller
  boolean supports(Object handler);     // &quot;이 핸들러 처리할 수 있어?&quot;
  ModelAndView handle(..., Object handler);  // &quot;처리해줘!&quot;
}&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;HandlerInterceptor
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Request가 Controller에 매핑되기 전 &lt;b&gt;앞단에서 부가적인 로직을 추가&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;여러 컨트롤러에서 같은 관심사를 갖고 반복되어 사용하는 코드를 제거하고, 다수의 컨트롤러에 동일한 기능을 제공&lt;/li&gt;
&lt;li&gt;주로 &lt;b&gt;세션, 쿠키, 권한 인증 로직&lt;/b&gt;에 많이 사용&lt;/li&gt;
&lt;li&gt;해당 인터페이스는 &lt;b&gt;&lt;code&gt;preHandle()&lt;/code&gt;&lt;/b&gt;, &lt;b&gt;&lt;code&gt;postHandle()&lt;/code&gt;&lt;/b&gt;, &lt;b&gt;&lt;code&gt;afterCompletion()&lt;/code&gt;&lt;/b&gt; 이라는 세 메소드를 제공&lt;b&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image 1.png&quot; data-origin-width=&quot;786&quot; data-origin-height=&quot;495&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RoLaJ/btsOzcc617r/OK5znykGJ4ODikYR52QMok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RoLaJ/btsOzcc617r/OK5znykGJ4ODikYR52QMok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RoLaJ/btsOzcc617r/OK5znykGJ4ODikYR52QMok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRoLaJ%2FbtsOzcc617r%2FOK5znykGJ4ODikYR52QMok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;619&quot; height=&quot;390&quot; data-filename=&quot;image 1.png&quot; data-origin-width=&quot;786&quot; data-origin-height=&quot;495&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Controller&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자의 요청과 Model과 View 사이에서 상호 작용을 관리하는 컴포넌트&lt;/li&gt;
&lt;li&gt;Request에 대해 &lt;b&gt;어떤 로직(Service)으로 처리할 것인지를 결정 및 호출&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Service Bean을 스프링 컨테이너로부터 주입&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ViewResolver&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Service (Business Logic)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;알맞은 정보를 가공하는 과정 &amp;rarr; 비즈니스 로직을 수행한다.&lt;/li&gt;
&lt;li&gt;'비즈니스 로직을 수행'하고 데이터베이스에 접근하는 DAO를 이용해서 '결과값'을 받아온다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Repository (Data Access)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Entity에 의해 생성된 DB에 접근하는 메서드에 대한 인터페이스&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;DB&lt;/li&gt;
&lt;li&gt;Model&lt;/li&gt;
&lt;li&gt;View&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;장점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;분리된 계층 구조를 통한 유지보수 및 확장성 향상&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;느슨한 결합&lt;/b&gt;: 인터페이스를 통한 의존성 주입&lt;/li&gt;
&lt;li&gt;컴포넌트 기반 아키텍처로 높은 재사용성 및 테스트 용이성&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;참고자료&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ITYL 6기 수업자료&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://velog.io/@inssg/Spring-MVC-API-%EA%B3%84%EC%B8%B5&quot;&gt;https://velog.io/@inssg/Spring-MVC-API-%EA%B3%84%EC%B8%B5&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://amy-it.tistory.com/106&quot;&gt;https://amy-it.tistory.com/106&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://hudi.blog/spring-handler-interceptor/&quot;&gt;https://hudi.blog/spring-handler-interceptor/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://velog.io/@jybin96/Controller-Service-Repository-%EA%B0%80-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C&quot;&gt;https://velog.io/@jybin96/Controller-Service-Repository-가-무엇일까&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ksy0214k.tistory.com/156&quot;&gt;https://ksy0214k.tistory.com/156&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;</description>
      <category>Java/Spring</category>
      <author>미니미니칩칩</author>
      <guid isPermaLink="true">https://miniminichipchip.tistory.com/48</guid>
      <comments>https://miniminichipchip.tistory.com/48#entry48comment</comments>
      <pubDate>Thu, 12 Jun 2025 17:12:50 +0900</pubDate>
    </item>
    <item>
      <title>Spring Bean</title>
      <link>https://miniminichipchip.tistory.com/47</link>
      <description>&lt;div class=&quot;markdown-body&quot;&gt;
&lt;h1&gt;Spring Bean&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Spring IoC(Inversion of Control) 컨테이너에 의해 관리되는 자바 객체&lt;/li&gt;
&lt;li&gt;재사용 가능한 소프트웨어 컴포넌트&lt;/li&gt;
&lt;li&gt;객체를 직접 new 키워드로 생성하지 않고, Spring Container가 대신 Life Cycle 관리&lt;/li&gt;
&lt;li&gt;즉, 스프링 간 객체가 의존관계를 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;@Bean 어노테이션을 사용한 빈 등록&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;@Configuration - 설정 클래스&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Spring 설정 정보를 담는 클래스임을 표시하는 어노테이션&lt;/li&gt;
&lt;li&gt;컨테이너 초기화 시점에 해당 클래스 내용이 해석&lt;/li&gt;
&lt;li&gt;내부에 @Bean 메서드들을 포함할 수 있음&lt;/li&gt;
&lt;li&gt;Bean에 추가 설정을 주지 않는 이상, 무조건 &lt;b&gt;싱글톤&lt;/b&gt; 보장&lt;/li&gt;
&lt;li&gt;XML 설정 파일을 Java 코드로 대체&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;@Bean - Bean 등록&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메서드가 컨테이너에 등록한 Bean을 생성함을 표시하는 어노테이션&lt;/li&gt;
&lt;li&gt;예시 코드 (&lt;b&gt;@Configuration&lt;/b&gt; 클래스 정의 &amp;rarr; &lt;b&gt;@Bean&lt;/b&gt; 메서드 생성)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;java&quot;&gt;&lt;code&gt;@Configuration
public class ProjectConfig {

// 이 클래스는 Spring 설정을 담고 있습니다
// Bean 정의들을 포함
    @Bean
    Parrot parrot() {
        var p = new Parrot();
        p.setName(&quot;Koko&quot;);
        return p;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컨텍스트 초기화 및 빈 추출&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-java&quot;&gt;  public class Main {
      public static void main(String[] args) {
          var context = new AnnotationConfigApplicationContext(ProjectConfig.class);

          Parrot p = context.getBean(Parrot.class);
          System.out.println(p.getName()); // 출력: Koko
      }
  }&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;@Component - 자동으로 Bean으로 등록할 클래스임을 표시&lt;/h2&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;653&quot; data-origin-height=&quot;245&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rL06w/btsOuhTeqY8/MYY2qyg4v9N7pOI97WY5o1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rL06w/btsOuhTeqY8/MYY2qyg4v9N7pOI97WY5o1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rL06w/btsOuhTeqY8/MYY2qyg4v9N7pOI97WY5o1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrL06w%2FbtsOuhTeqY8%2FMYY2qyg4v9N7pOI97WY5o1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;653&quot; height=&quot;245&quot; data-origin-width=&quot;653&quot; data-origin-height=&quot;245&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;@ComponentScan이 이 어노테이션을 찾아서 자동으로 Bean 등록&lt;/li&gt;
&lt;li&gt;&lt;b&gt;@ComponentScan - 자동으로 Bean으로 등록하도록 지시&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;지정된 패키지에서 @Component, @Service, @Repository, @Controller 등을 스캔&lt;/li&gt;
&lt;li&gt;찾은 클래스들을 자동으로 Spring Container에 Bean으로 등록&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&quot;자동 Bean 등록&quot;의 핵심 메커니즘&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;@Component // 빈 이름: parrot (클래스명의 camelCase)
public class Parrot {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;@Configuration
@ComponentScan(basePackages = &quot;org.scoula.domain&quot;)  
// org.scoula.domain 패키지와 하위 패키지에서 @Component, @Service, @Repository 등을 찾아서 Bean으로 등록
public class ProjectConfig3 {

   // 별도의 @Bean 메소드 없이도 @ComponentScan이 자동으로 Bean들을 등록해줌
   // org.scoula.domain 패키지의 모든 @Component 계열 어노테이션이 붙은 클래스들이 
   // Spring Container에 Bean으로 등록됨
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;@PostContruct&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bean이 생성되고 의존성 주입이 완료된 후 자동으로 실행될 메소드를 지정하는 어노테이션&lt;/li&gt;
&lt;li&gt;Bean 생성 직후 &lt;b&gt;한 번만&lt;/b&gt; 자동 실행&lt;/li&gt;
&lt;li&gt;의존성 주입이 완료된 상태에서 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;@Component
public class Parrot {
    private String name;

    @PostConstruct
    public void init() {
        this.name = &quot;Kiki&quot;;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  스프링 빈 간의 관계 설정&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;IoC Container&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Spring Container&lt;/b&gt; : IoC Container를 Spring ****방식으로 구현한 실제 시스템&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Dependency Injection&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Bean Wiring&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;aside&gt;
&lt;pre class=&quot;asciidoc&quot;&gt;&lt;code&gt;**IoC Container (제어의 역전)**

    &amp;darr; Spring에서 구현

**Spring Container (Spring 구현체)**

    &amp;darr; 사용하는 방법

**DI (의존성 주입 패턴)**

    &amp;darr; 실제 실행 과정

**Bean Wiring (Spring의 연결 작업)**&lt;/code&gt;&lt;/pre&gt;
&lt;/aside&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. @Bean 메서드 간 직접 호출 방식&lt;/h3&gt;
&lt;pre class=&quot;java&quot;&gt;&lt;code&gt;@Configuration
public class ProjectConfig {

    @Bean
    public Parrot parrot() {
        Parrot p = new Parrot();
        p.setName(&quot;Koko&quot;);
        return p;
    }

    @Bean
    public Person person() {
        Person p = new Person();
        p.setName(&quot;Ella&quot;);
        **p.setParrot(parrot()); // Parrot 빈을 반환하는 메서드 직접 메서드 호출**
        return p;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 매개변수를 통한 의존성 주입&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;코드가 더 명확함&lt;/li&gt;
&lt;li&gt;스프링이 자동으로 의존성 해결&lt;/li&gt;
&lt;li&gt;&lt;b&gt;메서드 직접 호출보다 권장되는 방식&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;java&quot;&gt;&lt;code&gt;@Configuration
public class ProjectConfig {

    @Bean
    public Parrot parrot() {
        Parrot p = new Parrot();
        p.setName(&quot;Koko&quot;);
        return p;
    }

    @Bean
    public Person person(**Parrot parrot**) { **// 매개변수로 빈 주입**
        Person p = new Person();
        p.setName(&quot;Ella&quot;);
        **p.setParrot(parrot);**
        return p;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. @Autowired - 필드 기반 의존성 주입&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;지정된 &lt;b&gt;필드/메서드(setter, 생성자)&lt;/b&gt;에 적절한 Bean을 찾아서 자동으로 주입&lt;/li&gt;
&lt;li&gt;스프링 컨테이너에서 &lt;b&gt;타입이 맞는 Bean을 찾아서 자동 연결&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 생성자 기반 의존성 주입&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;더 안전한 방식 &lt;code&gt;final&lt;/code&gt; 필드 사용 가능하여 불변성 보장&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;가장 권장되는 방식&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. Setter 기반 의존성 주입&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;@Qualifier - 대상 지정&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;같은 타입의 Bean이 여러 개 있을 때 특정 Bean을 선택해서 주입받기 위한 어노테이션&lt;/li&gt;
&lt;li&gt;Bean 이름을 직접 지정하여 &lt;b&gt;모호함 해결&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;kotlin&quot;&gt;&lt;code&gt;public class Person3 {
    private String name = &quot;Ella&quot;;
    private final Parrot parrot;

    public Person(@Qualifier(&quot;parrot2&quot;) Parrot parrot) {
        this.parrot = parrot;
    }
    ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;참고자료&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ITYL 6기 수업자료&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev-wnstjd.tistory.com/440&quot;&gt;https://dev-wnstjd.tistory.com/440&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://steady-coding.tistory.com/594&quot;&gt;https://steady-coding.tistory.com/594&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://velog.io/@geon_km/Spring-%EB%A6%AC%ED%94%8C%EB%A0%89%EC%85%98Reflection-Feat.-Di-%EB%A7%8C%EB%93%A4%EA%B8%B0&quot;&gt;https://velog.io/@geon_km/Spring-리플렉션Reflection-Feat.-Di-만들기&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;</description>
      <category>Java/Spring</category>
      <author>미니미니칩칩</author>
      <guid isPermaLink="true">https://miniminichipchip.tistory.com/47</guid>
      <comments>https://miniminichipchip.tistory.com/47#entry47comment</comments>
      <pubDate>Mon, 9 Jun 2025 22:01:10 +0900</pubDate>
    </item>
    <item>
      <title>JSP</title>
      <link>https://miniminichipchip.tistory.com/46</link>
      <description>&lt;div class=&quot;markdown-body&quot;&gt;
&lt;h1&gt;JSP&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;JSP란?&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;자바 언어를 사용하여 서버 측에서 웹 페이지를 동적으로 생성하는 기술&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;태그 기반 웹 컴포넌트&lt;/b&gt;: &lt;code&gt;.jsp&lt;/code&gt; 확장자를 가진 태그 기반의 웹 컴포넌트&lt;/li&gt;
&lt;li&gt;&lt;b&gt;서버 사이드 스크립팅:&lt;/b&gt; 클라이언트가 브라우저에 페이지를 요청하면 서버에서 JSP를 실행하여 &lt;b&gt;동적&lt;/b&gt;인 웹 페이지를 생성하고 클라이언트로 전송&lt;/li&gt;
&lt;li&gt;&lt;b&gt;자동 서블릿 변환&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;MVC 패턴 View 역할&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;JSP 동작과정&lt;/h2&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;552&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CF8Kw/btsOhmVh9VI/9hxGbATD4hkwkZtD1ikD81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CF8Kw/btsOhmVh9VI/9hxGbATD4hkwkZtD1ikD81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CF8Kw/btsOhmVh9VI/9hxGbATD4hkwkZtD1ikD81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCF8Kw%2FbtsOhmVh9VI%2F9hxGbATD4hkwkZtD1ikD81%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;716&quot; height=&quot;552&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;552&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;웹 브라우저 &amp;rarr; 웹 서버 &amp;rarr; JSP 컨테이너 &amp;rarr; &lt;code&gt;*.jsp&lt;/code&gt; &amp;rarr;* &lt;code&gt;.java&lt;/code&gt; &amp;rarr; &lt;code&gt;*.class&lt;/code&gt; &amp;rarr; 웹 서버 &amp;rarr; 웹 브라우저&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Servlet &lt;i&gt;vs&lt;/i&gt; JSP&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;width: 67px;&quot;&gt;&lt;b&gt;분류&lt;/b&gt;&lt;/th&gt;
&lt;th style=&quot;width: 370px;&quot;&gt;&lt;b&gt;서블릿&lt;/b&gt;&lt;/th&gt;
&lt;th style=&quot;width: 415px;&quot;&gt;&lt;b&gt;JSP&lt;/b&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 67px; text-align: center;&quot;&gt;&lt;b&gt;형식&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 370px; text-align: center;&quot;&gt;&lt;b&gt;Java 코드 &amp;sup; HTML 코드 (Java에 HTML 코드 포함)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 415px; text-align: center;&quot;&gt;&lt;b&gt;HTML 코드 &amp;sup; Java 코드 (HTML에 Java 코드 포함)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 67px; text-align: center;&quot;&gt;&lt;b&gt;특징&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 370px; text-align: center;&quot;&gt;Java 코드 내에 HTML 코드가 삽입되는 형태로, HTML 작성 작업 복잡&lt;/td&gt;
&lt;td style=&quot;width: 415px; text-align: center;&quot;&gt;HTML 코드 내에 Java 코드가 삽입되는 형태로, 서블릿에 비해 HTML 코드 작성이 쉽다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 67px; text-align: center;&quot;&gt;&lt;b&gt;목적&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 370px; text-align: center;&quot;&gt;Java 코드를 이용한 Business Logic 처리에 적합하며, MVC 패턴의 Controller 역할&lt;/td&gt;
&lt;td style=&quot;width: 415px; text-align: center;&quot;&gt;Tag를 이용한 Presentation Logic 처리에 적합하며, MVC 패턴의 View 역할&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;역할 분담&lt;/b&gt;: Servlet은 주로 비즈니스 로직 처리와 요청 제어에, JSP는 화면 출력과 프레젠테이션 로직에 집중하여 MVC 패턴의 장점 활용&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;참고자료&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ITYL 6기 수업자료&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://m.blog.naver.com/3246902/221659042559?view=img_10&quot;&gt;https://m.blog.naver.com/3246902/221659042559?view=img_10&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://hrcony8753.tistory.com/6&quot;&gt;https://hrcony8753.tistory.com/6&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;</description>
      <category>Server</category>
      <author>미니미니칩칩</author>
      <guid isPermaLink="true">https://miniminichipchip.tistory.com/46</guid>
      <comments>https://miniminichipchip.tistory.com/46#entry46comment</comments>
      <pubDate>Thu, 29 May 2025 15:35:41 +0900</pubDate>
    </item>
    <item>
      <title>Servlet</title>
      <link>https://miniminichipchip.tistory.com/45</link>
      <description>&lt;div class=&quot;markdown-body&quot;&gt;
&lt;h1&gt;Servlet&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Server + Applet의 합성어 (Applet = Application + let (작은) = 작은 애플리케이션)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;자바 서블릿&lt;/b&gt;(Java Servlet) : 자바를 사용하여 웹페이지를 동적으로 생성하는 서버측 프로그램&lt;/li&gt;
&lt;li&gt;&lt;b&gt;웹 컨테이너에서 실행되는 자바 기반 웹 컴포넌트&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;클라이언트 &lt;b&gt;요청 처리 후 동적 응답(HTML) 생성&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;멀티스레드 환경에서 효율적 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 배포 서술자(web.xml)을 이용한 서블릿 등록/매핑&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;web.xml&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;웹 애플리케이션 배포 서술자(Deployment Descriptor)&lt;/li&gt;
&lt;li&gt;웹 애플리케이션의 설정 정보를 담은 XML 파일&lt;/li&gt;
&lt;li&gt;서블릿, 필터, 리스너 등의 구성 요소 등록 및 매핑&lt;/li&gt;
&lt;li&gt;Tomcat 등의 웹 컨테이너가 시작 될 때 읽음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;web-app xmlns=&quot;http://xmlns.jcp.org/xml/ns/javaee&quot;
         xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
         xsi:schemaLocation=&quot;http://xmlns.jcp.org/xml/ns/javaee
         http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd&quot;
         version=&quot;4.0&quot;&amp;gt;

  &amp;lt;!-- Servlet 등록
    - Servlet 컴포넌트 클래스 정보를 웹 컨테이너에게 알려줌
    - 클래스 정보가 길기 때문에 별칭(helloServlet) 등록
  --&amp;gt;
  &amp;lt;servlet&amp;gt;
    &amp;lt;servlet-name&amp;gt;helloServlet&amp;lt;/servlet-name&amp;gt;
    &amp;lt;servlet-class&amp;gt;org.package.HelloServlet&amp;lt;/servlet-class&amp;gt;
  &amp;lt;/servlet&amp;gt;

  &amp;lt;!-- Servlet 매핑
    - &quot;/hello-servlet&quot; 주소 요청 시
      웹 컨테이너에 등록된 Servlet 중 별칭이 &quot;helloServlet&quot;인 클래스를 찾음
      -&amp;gt; Servlet Container가 해당 클래스를 객체로 만들어서 관리(Servlet Life Cycle)
  --&amp;gt;
  &amp;lt;servlet-mapping&amp;gt;
    &amp;lt;servlet-name&amp;gt;helloServlet&amp;lt;/servlet-name&amp;gt;
    &amp;lt;url-pattern&amp;gt;/hello-servlet&amp;lt;/url-pattern&amp;gt;
  &amp;lt;/servlet-mapping&amp;gt;
&amp;lt;/web-app&amp;gt;

&amp;lt;!-- web.xml 수정 후에는 반드시 웹서버를 재기동 필요 --&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. &lt;code&gt;@WebServlet&lt;/code&gt; 어노테이션을 이용한 서블릿 등록/매핑&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;XML 파일 대신 자바 코드에 직접 설정&lt;/li&gt;
&lt;li&gt;코드와 설정의 통합 관리&lt;/li&gt;
&lt;li&gt;&lt;b&gt;동적 로딩&lt;/b&gt;: 서버 재시작 없이 반영 (개발 모드)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;scala&quot;&gt;&lt;code&gt;@WebServlet(&quot;/hello-servlet&quot;)
// 복수 매핑: @WebServlet(name=&quot;helloServlet&quot;, urlPatterns={&quot;/xxx&quot;, &quot;/yyy&quot;})
// value 속성 사용 : @WebServlet(name=&quot;helloServlet&quot;, value={&quot;/aaa&quot;, &quot;/bbb&quot;})
public class HelloServlet extends HttpServlet {
    // 서블릿 코드
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;서블릿 핵심 API&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Apache + Tomcat 요청/응답 구조&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;웹 컨테이너에서 URL 요청에 맞는 Servlet을 실행&lt;/li&gt;
&lt;li&gt;요청 처리 결과를 HTML 형태로 구성하여 클라이언트에게 응답&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;  **[웹 브라우저]** &amp;harr; **[Apache httpd]** &amp;harr; **[Tomcat]** &amp;harr; **[Database]**
                 HTTP 요청/응답   웹 컨테이너  데이터 처리&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1029&quot; data-origin-height=&quot;538&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ogpxI/btsOiaNxZfM/qUWYjlPA731LUAVqMlTmOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ogpxI/btsOiaNxZfM/qUWYjlPA731LUAVqMlTmOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ogpxI/btsOiaNxZfM/qUWYjlPA731LUAVqMlTmOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FogpxI%2FbtsOiaNxZfM%2FqUWYjlPA731LUAVqMlTmOk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;571&quot; height=&quot;299&quot; data-origin-width=&quot;1029&quot; data-origin-height=&quot;538&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;HttpServletRequest&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HTTP 요청의 모든 정보(클라이언트 요청, 쿠키, 세션 등)를 제공하는 인터페이스&lt;/li&gt;
&lt;li&gt;&lt;b&gt;HttpServletRequest 주요 메서드&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;height: 183px;&quot; data-ke-align=&quot;alignCenter&quot;&gt;
&lt;thead&gt;
&lt;tr style=&quot;height: 23px;&quot;&gt;
&lt;th style=&quot;height: 23px;&quot;&gt;&lt;b&gt;메서드&lt;/b&gt;&lt;/th&gt;
&lt;th style=&quot;height: 23px;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;getHeader(String name)&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;HTTP 헤더 값 조회&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;getParameter(String name)&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;요청 파라미터 값 조회&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;getParameterNames()&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;모든 파라미터 이름 조회&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;getRequestURI()&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;요청 URI 조회&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;getServletPath()&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;서블릿 경로 조회&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;getSession()&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;세션 객체 조회&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;setAttribute(String, Object)&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;속성 설정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;getAttribute(String)&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;속성 조회&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;HttpServletResponse&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HTTP 응답의 내용(HTML, JSON 등), 헤더, 쿠키, 상태 코드 등을 설정하여 제공하는 인터페이스&lt;/li&gt;
&lt;li&gt;Servlet으로 들어온 요청은 텍스트(HTML)로 응답을 보내기 때문에 출력 스트림을 받기 위해 주로 response로부터 &lt;code&gt;writer&lt;/code&gt; 객체를 얻어서 내보낸다&lt;/li&gt;
&lt;li&gt;HttpServletResponse &lt;b&gt;주요 메서드&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;table data-ke-align=&quot;alignCenter&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;메서드&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;setContentType(String)&lt;/td&gt;
&lt;td&gt;응답 콘텐츠 타입 설정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;getWriter()&lt;/td&gt;
&lt;td&gt;문자 출력 스트림&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;getOutputStream()&lt;/td&gt;
&lt;td&gt;바이너리 출력 스트림&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;sendRedirect(String)&lt;/td&gt;
&lt;td&gt;리다이렉트 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;addHeader(String, String)&lt;/td&gt;
&lt;td&gt;응답 헤더 추가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;setStatus(int)&lt;/td&gt;
&lt;td&gt;HTTP 상태 코드 설정&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;생명주기(Life Cycle)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Servlet 생명주기 &lt;i&gt;(JSP도 같음)&lt;/i&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;779&quot; data-origin-height=&quot;609&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHfovX/btsOhfu6Tpb/hcViyQxACqQE8IJH7WqvJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHfovX/btsOhfu6Tpb/hcViyQxACqQE8IJH7WqvJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHfovX/btsOhfu6Tpb/hcViyQxACqQE8IJH7WqvJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHfovX%2FbtsOhfu6Tpb%2FhcViyQxACqQE8IJH7WqvJ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;597&quot; height=&quot;609&quot; data-origin-width=&quot;779&quot; data-origin-height=&quot;609&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;클라이언트가 URL을 이용채 서버에 요청 시 &lt;b&gt;HTTP Request&lt;/b&gt;를 &lt;b&gt;Servlet Container&lt;/b&gt;로 전송&lt;/li&gt;
&lt;li&gt;&lt;b&gt;HTTP Request&lt;/b&gt;를 전송 받은 &lt;b&gt;Servlet Container&lt;/b&gt;는 &lt;b&gt;HttpServletRequest&lt;/b&gt;(요청), &lt;b&gt;HttpServletResponse&lt;/b&gt;(응답) 객체를 생성&lt;/li&gt;
&lt;li&gt;DD (배포서술자, Deployment Descriptor, &lt;b&gt;web.xml)&lt;/b&gt;를 이용해&lt;br /&gt;요청 URL을 분석하여 &lt;b&gt;어떤 Servlet Class가 요청을 처리할지 찾음&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;요청이 들어오면 Servlet 클래스가 로딩되어 &lt;b&gt;Servlet 객체 생성&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;서버가 &lt;b&gt;메소드를&lt;/b&gt; init()을 호출하여 &lt;b&gt;Servlet을 초기화&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;service() 메소드가 호출되어 Servlet이 &lt;b&gt;브라우저의 요청을 처리&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;service() 메소드는 요청 유형에 따라 해당하는 &lt;b&gt;HTTP 요청(GET, POST 등)을 처리&lt;/b&gt;하는 메서드(doGet(), doPost() 등)를 호출&lt;br /&gt;&amp;rarr; 해당 메서드에서 응답을 위한 동적 콘텐츠 생성 코드(java, html)를 작성&lt;/li&gt;
&lt;li&gt;&lt;b&gt;HttpServletResponse&lt;/b&gt; 객체를 이용해 클라이언트에게 응답을 돌려줌\&lt;/li&gt;
&lt;li&gt;서버가 destroy() 메소드를 호출하여 &lt;b&gt;Servlet을 제거&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; &lt;b&gt;동일한 로직과 결과를 반복적으로 수행하는 작업은 init() 메서드에서 한 번만 처리&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;각 메서드 역할&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;init() 메서드&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;호출 시점&lt;/b&gt;: 서블릿 인스턴스 최초 생성 시 1번만&lt;/li&gt;
&lt;li&gt;&lt;b&gt;용도&lt;/b&gt;: 초기화 작업 (DB 연결, 설정 파일 로딩)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;service() 메서드&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;호출 시점&lt;/b&gt;: 클라이언트 요청마다 매번&lt;/li&gt;
&lt;li&gt;&lt;b&gt;용도&lt;/b&gt;: 응답을 위한 동적 콘텐츠 생성&lt;/li&gt;
&lt;li&gt;&lt;b&gt;분기&lt;/b&gt;: HTTP 메서드에 따라 doGet(), doPost() 호출&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;destroy() 메서드&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;호출 시점&lt;/b&gt;: 서블릿 인스턴스 소멸 시 1번만(코드 변경 등의 상황으로 재배포될 때)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;용도&lt;/b&gt;: 리소스 정리 (DB 연결 해제, 파일 닫기)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;참고자료&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ITYL 6기 수업자료&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ko.wikipedia.org/wiki/%EC%9E%90%EB%B0%94_%EC%84%9C%EB%B8%94%EB%A6%BF&quot;&gt;https://ko.wikipedia.org/wiki/자바_서블릿&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mrlazydev.tistory.com/entry/JSPServlet%EC%84%9C%EB%B8%94%EB%A6%BF%EC%9D%B4%EB%9E%80?category=1070022&quot;&gt;https://mrlazydev.tistory.com/entry/JSPServlet서블릿이란?category=1070022&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://wodonggun.github.io/study/%EC%95%84%ED%8C%8C%EC%B9%98-%ED%86%B0%EC%BA%A3-%EC%B0%A8%EC%9D%B4.html&quot;&gt;https://wodonggun.github.io/study/아파치-톰캣-차이.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://velog.io/@green9930/HttpServletRequest-HttpServletResponse-%EC%A0%95%EB%A6%AC&quot;&gt;https://velog.io/@green9930/HttpServletRequest-HttpServletResponse-정리&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://victorydntmd.tistory.com/154&quot;&gt;https://victorydntmd.tistory.com/154&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://kadosholy.tistory.com/47&quot;&gt;https://kadosholy.tistory.com/47&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;</description>
      <category>Server</category>
      <author>미니미니칩칩</author>
      <guid isPermaLink="true">https://miniminichipchip.tistory.com/45</guid>
      <comments>https://miniminichipchip.tistory.com/45#entry45comment</comments>
      <pubDate>Thu, 29 May 2025 15:30:08 +0900</pubDate>
    </item>
    <item>
      <title>WA (Web Application)</title>
      <link>https://miniminichipchip.tistory.com/44</link>
      <description>&lt;div class=&quot;markdown-body&quot;&gt;
&lt;h1&gt;WA (Web Application)&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;HTTP와 Client-Server 아키텍처&lt;/h3&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image.png&quot; data-origin-width=&quot;2440&quot; data-origin-height=&quot;988&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kQnBP/btsOhewdmML/nUkXtKpO6leEq4Oyu8sMdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kQnBP/btsOhewdmML/nUkXtKpO6leEq4Oyu8sMdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kQnBP/btsOhewdmML/nUkXtKpO6leEq4Oyu8sMdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkQnBP%2FbtsOhewdmML%2FnUkXtKpO6leEq4Oyu8sMdk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;477&quot; height=&quot;193&quot; data-filename=&quot;image.png&quot; data-origin-width=&quot;2440&quot; data-origin-height=&quot;988&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;HTTP&lt;/b&gt;: Client-Server Model 기반 Protocol&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Client&lt;/b&gt;: Service를 Request하는 사용자&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Server&lt;/b&gt;: 특정 Service를 제공하는 컴퓨터
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Web Server, DB Server..&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Web 통신 구조&lt;/h3&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image 1.png&quot; data-origin-width=&quot;689&quot; data-origin-height=&quot;290&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TLjTK/btsOhIw1DYs/HRHy8AdafQYEgXhhwNrqk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TLjTK/btsOhIw1DYs/HRHy8AdafQYEgXhhwNrqk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TLjTK/btsOhIw1DYs/HRHy8AdafQYEgXhhwNrqk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTLjTK%2FbtsOhIw1DYs%2FHRHy8AdafQYEgXhhwNrqk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;689&quot; height=&quot;290&quot; data-filename=&quot;image 1.png&quot; data-origin-width=&quot;689&quot; data-origin-height=&quot;290&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;br /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Web Server&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;정적 콘텐츠 제공&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;HTML, CSS, JS, image 등&lt;/li&gt;
&lt;li&gt;&lt;b&gt;예시&lt;/b&gt;: Apache HTTP Server, Ngnix, IIS&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;WAS (Web Application Server)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;동적 컨텐츠 제공&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;미들웨어 서버&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Servlet/JSP 실행, 비즈니스 로직 처리, DB 연동&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;예시&lt;/b&gt;: Apache Tomcat, JBoss/WildFly, JEUS&lt;/li&gt;
&lt;li&gt;핵심 기능
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;웹 컨테이너&lt;/b&gt; : 서블릿/JSP 실행 환경&lt;/li&gt;
&lt;li&gt;&lt;b&gt;트랜잭션 관리&lt;/b&gt; : 데이터 일관성 보장&lt;/li&gt;
&lt;li&gt;&lt;b&gt;커넥션 풀&lt;/b&gt; : 데이터베이스 연결 관리&lt;/li&gt;
&lt;li&gt;&lt;b&gt;보안 처리&lt;/b&gt; : 인증/인가 기능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;aside&gt;  &lt;b&gt;Web Sever&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt; vs &lt;/span&gt;&lt;b&gt;WAS&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Web Server가 필요한 이유?&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정적 컨텐츠만 처리하도록 기능을 분배하여 서버의 부담을 줄일 수 있다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;WAS가 필요한 이유?&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Web Server만을 이용한다면 사용자가 원하는 요청에 대한 결과값을 모두 미리 만들어 놓고 서비스를 해야 한다.&lt;/li&gt;
&lt;li&gt;WAS를 통해 요청에 맞는 데이터를 DB에서 가져와서 비즈니스 로직에 맞게 그때 그때 결과를 만들어서 제공함으로써 자원을 효율적으로 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;하나의 Server에서 모두 관리할 순 없을까?&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;성능 최적화, 부하 방지&lt;/b&gt; (정적, 동적 콘텐츠 요청을 분리)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;보안 강화&lt;/b&gt; (Web Server가 WAS 직접 접근 차단)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;확장성&lt;/b&gt; (여러 WAS 연결 가능)&lt;/li&gt;
&lt;li&gt;즉, 자원 이용의 효율성 및 장애 극복, 배포 및 유지보수의 편의성 을 위해 Web Server와 WAS를 분리&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;URL (Uniform Resource Locator) &lt;i&gt;vs&lt;/i&gt; &lt;b&gt;URI (&lt;/b&gt;Uniform Resource Identifier)&lt;/h3&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bigjhr/btsOh5MicmF/qd2M2yXoqS38tuJ2QcAdD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bigjhr/btsOh5MicmF/qd2M2yXoqS38tuJ2QcAdD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bigjhr/btsOh5MicmF/qd2M2yXoqS38tuJ2QcAdD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbigjhr%2FbtsOh5MicmF%2Fqd2M2yXoqS38tuJ2QcAdD1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;367&quot; height=&quot;215&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위치(&lt;code&gt;URL&lt;/code&gt;) &lt;i&gt;vs&lt;/i&gt; 위치+이름 &amp;rarr; 식별자(&lt;code&gt;URI&lt;/code&gt;)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;URL은 일종의 URI이다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;URL은 URI이지만, 모든 URI가 URL인 것은 아니다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;dts&quot;&gt;&lt;code&gt;-- URL 예시
http://www.naver.com:80/index.html
└─┬──┘└────┬───────┘└┬┘└───┬────┘
프로토콜 서버 주소   포트  파일 경로

-- URI 예시
http://www.example.com:8080/board/list?page=1&amp;amp;size=10#top
└─┬──┘└─────┬─────────┘└┬─┘└────┬────┘└─────┬───────┘└┬┘
프로토콜  서버 주소     포트   경로     쿼리 문자열  Fragment&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;HTTP Request &amp;amp; Response&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HTTP Response Status Code
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;2xx&lt;/b&gt;: 성공 ✅&lt;/li&gt;
&lt;li&gt;&lt;b&gt;3xx&lt;/b&gt;: 리다이렉션  &lt;/li&gt;
&lt;li&gt;&lt;b&gt;4xx&lt;/b&gt;: 클라이언트 오류 ❌&lt;/li&gt;
&lt;li&gt;&lt;b&gt;5xx&lt;/b&gt;: 서버 오류  &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/th&gt;
&lt;th&gt;&lt;b&gt;의미&lt;/b&gt;&lt;/th&gt;
&lt;th&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;200&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;OK&lt;/td&gt;
&lt;td&gt;요청 성공, 정상 처리됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;201&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Created&lt;/td&gt;
&lt;td&gt;새로운 리소스가 성공적으로 생성됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;302&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Found&lt;/td&gt;
&lt;td&gt;임시 리다이렉션, 다른 URL로 이동&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;400&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Bad Request&lt;/td&gt;
&lt;td&gt;잘못된 요청, 문법 오류&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;401&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Unauthorized&lt;/td&gt;
&lt;td&gt;인증 필요, 로그인이 안된 상태&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;403&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Forbidden&lt;/td&gt;
&lt;td&gt;접근 금지, 권한 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;404&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Not Found&lt;/td&gt;
&lt;td&gt;요청한 리소스를 찾을 수 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;405&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Method Not Allowed&lt;/td&gt;
&lt;td&gt;허용되지 않는 HTTP 메서드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;500&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Internal Server Error&lt;/td&gt;
&lt;td&gt;서버 내부 오류&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;502&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Bad Gateway&lt;/td&gt;
&lt;td&gt;게이트웨이 오류&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Web Application&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;웹 브라우저를 통해 접근하여 사용하는 인터넷 기반 애플리케이션&lt;/li&gt;
&lt;li&gt;핵심 특징
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;플랫폼 독립성&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;브라우저만 있으면 언제 어디서든 사용 가능&lt;/li&gt;
&lt;li&gt;별도 설치 불필요 (설치형 프로그램과 차이점)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;요청-응답 구조&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;클라이언트&lt;/b&gt;: URL 요청 전송&lt;/li&gt;
&lt;li&gt;&lt;b&gt;서버&lt;/b&gt;: HTML 형태로 응답 전송&lt;/li&gt;
&lt;li&gt;&lt;b&gt;브라우저&lt;/b&gt;: HTML을 해석하여 화면에 표시&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;동적 처리&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;정적 콘텐츠&lt;/b&gt;: 미리 만들어진 HTML, CSS, 이미지&lt;/li&gt;
&lt;li&gt;&lt;b&gt;동적 콘텐츠&lt;/b&gt;: 요청에 따라 실시간 생성 (JSP/Servlet)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;JSP/Servlet Architecture&lt;/h3&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;842&quot; data-origin-height=&quot;495&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/djCvhL/btsOhiyFyQx/TXiscpbfnfi6Ma3ViwU1c0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/djCvhL/btsOhiyFyQx/TXiscpbfnfi6Ma3ViwU1c0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/djCvhL/btsOhiyFyQx/TXiscpbfnfi6Ma3ViwU1c0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdjCvhL%2FbtsOhiyFyQx%2FTXiscpbfnfi6Ma3ViwU1c0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;665&quot; height=&quot;391&quot; data-origin-width=&quot;842&quot; data-origin-height=&quot;495&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;br /&gt;
&lt;aside&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1️⃣ &lt;b&gt;클라이언트 &amp;rarr; 웹 서버&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자가 브라우저에서 &lt;b&gt;요청(Request)&lt;/b&gt; 전송&lt;/li&gt;
&lt;li&gt;URL을 통해 특정 페이지나 기능 호출&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2️⃣ &lt;b&gt;웹 서버에서 판단&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;정적 콘텐츠&lt;/b&gt; &amp;rarr; 직접 응답&lt;/li&gt;
&lt;li&gt;&lt;b&gt;동적 처리 필요&lt;/b&gt; &amp;rarr; 서블릿 컨테이너로 전달&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3️⃣ &lt;b&gt;서블릿 컨테이너 처리&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;web.xml&lt;/b&gt; 파일 참조하여 URL 매핑 확인&lt;/li&gt;
&lt;li&gt;해당하는 &lt;b&gt;서블릿 객체&lt;/b&gt; 호출&lt;/li&gt;
&lt;li&gt;서블릿에서 비즈니스 로직 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4️⃣ &lt;b&gt;서블릿 &amp;harr; 스레드 관리&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 요청마다 &lt;b&gt;별도 스레드&lt;/b&gt;로 처리&lt;/li&gt;
&lt;li&gt;동시 접속자 처리 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5️⃣ &lt;b&gt;응답(Response) 생성&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;처리 결과를 &lt;b&gt;HTML&lt;/b&gt; 형태로 생성&lt;/li&gt;
&lt;li&gt;웹 서버를 통해 클라이언트에게 전달&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Web Component&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;웹사이트나 애플리케이션에서 UI를 모듈화하고 재사용할 수도록 해주는 웹 표준 기술&lt;/li&gt;
&lt;li&gt;즉, &lt;b&gt;웹 애플리케이션을 구성하는 실행 가능한 소프트웨어 단위&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;웹 컨테이너에서 실행되는 프로그램 모듈&lt;/li&gt;
&lt;li&gt;HTTP 요청을 처리하고 응답을 생성하는 역할&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Servlet Component&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;역할&lt;/b&gt;: HTTP 요청을 처리하는 자바 클래스&lt;/li&gt;
&lt;li&gt;&lt;b&gt;특징&lt;/b&gt;: 비즈니스 로직 중심, 프로그래밍 방식&lt;/li&gt;
&lt;li&gt;&lt;b&gt;예시&lt;/b&gt;: 로그인 처리, 데이터 조회, API 응답&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;JSP Component&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;역할&lt;/b&gt;: 동적 웹 페이지 생성하는 템플릿&lt;/li&gt;
&lt;li&gt;&lt;b&gt;특징&lt;/b&gt;: HTML 중심, 화면 표시 중심&lt;/li&gt;
&lt;li&gt;&lt;b&gt;예시&lt;/b&gt;: 게시판 목록, 상품 상세 페이지&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Web Container&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;웹 컴포넌트(서블릿, JSP)를 실행하고 관리하는 런타임 환경&lt;/li&gt;
&lt;li&gt;Servlet 컨테이너 + JSP 컨테이너를 포함하는 상위 개념
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;서블릿 컨테이너 (Servlet Container)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서블릿의 생명주기를 관리하는 실행 환경&lt;/li&gt;
&lt;li&gt;서블릿 생성, 초기화, 실행, 소멸 담당&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;JSP 컨테이너 (JSP Container)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;JSP 파일을 서블릿으로 변환하고 실행하는 환경&lt;/li&gt;
&lt;li&gt;JSP &amp;rarr; 서블릿 변환 &amp;rarr; 컴파일 &amp;rarr; 실행 과정 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;시작점 (main() 메서드) 존재 X &amp;rarr; 컨테이너가 필요할 때 마다 호출&lt;/li&gt;
&lt;li&gt;&lt;b&gt;역할&lt;/b&gt;: &lt;b&gt;생명주기 관리, 이벤트 처리, 리소스 관리&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;예시:&lt;/b&gt; Tomcat, Resin, WebLogic&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Model2 Architecture (MVC 패턴)&lt;/h3&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;250&quot; data-origin-height=&quot;287&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qaJ3O/btsOhgndcpA/makwU7pEYLdrTYwoQJjhD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qaJ3O/btsOhgndcpA/makwU7pEYLdrTYwoQJjhD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qaJ3O/btsOhgndcpA/makwU7pEYLdrTYwoQJjhD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqaJ3O%2FbtsOhgndcpA%2FmakwU7pEYLdrTYwoQJjhD1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;250&quot; height=&quot;287&quot; data-origin-width=&quot;250&quot; data-origin-height=&quot;287&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Controller&lt;/b&gt;: Servlet (요청 처리 및 흐름 제어)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Model&lt;/b&gt;: JavaBean (비즈니스 로직 및 데이터)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;View&lt;/b&gt;: JSP (사용자 인터페이스)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;JSP 역할 세분화&lt;/b&gt; : 기존 JSP가 Controller와 View 기능을 모두 담당했지만,&lt;br /&gt;Model2 JSP는 View만 담당, Servlet 클래스가 Controller를 담당한다.&lt;br /&gt;&amp;rarr; &lt;b&gt;Model1과 Model2의 차이점!!&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;676&quot; data-origin-height=&quot;204&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l18Jg/btsOhhGsxbN/ItCNknva8IXc6Bzozb1jZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l18Jg/btsOhhGsxbN/ItCNknva8IXc6Bzozb1jZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l18Jg/btsOhhGsxbN/ItCNknva8IXc6Bzozb1jZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl18Jg%2FbtsOhhGsxbN%2FItCNknva8IXc6Bzozb1jZk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;676&quot; height=&quot;204&quot; data-origin-width=&quot;676&quot; data-origin-height=&quot;204&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;br /&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;참고 자료&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ITYL 6기 수업자료&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://velog.io/@seosu2000/Client-Server-%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80&quot;&gt;https://velog.io/@seosu2000/Client-Server-란-무엇인가&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://velog.io/@letthere/%EC%9B%B9-%ED%86%B5%EC%8B%A0-%EA%B0%9C%EC%9A%94&quot;&gt;https://velog.io/@letthere/웹-통신-개요&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.elancer.co.kr/blog/detail/74&quot;&gt;https://www.elancer.co.kr/blog/detail/74&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.educba.com/servlet-architecture/&quot;&gt;https://www.educba.com/servlet-architecture/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://hoit1302.tistory.com/43&quot;&gt;https://hoit1302.tistory.com/43&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/JSP_model_2_architecture&quot;&gt;https://en.wikipedia.org/wiki/JSP_model_2_architecture&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;</description>
      <category>Server</category>
      <author>미니미니칩칩</author>
      <guid isPermaLink="true">https://miniminichipchip.tistory.com/44</guid>
      <comments>https://miniminichipchip.tistory.com/44#entry44comment</comments>
      <pubDate>Thu, 29 May 2025 15:14:58 +0900</pubDate>
    </item>
    <item>
      <title>Invalid package name; it's impossible to create a Java class inside</title>
      <link>https://miniminichipchip.tistory.com/42</link>
      <description>&lt;div class=&quot;markdown-body&quot;&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 상황&lt;/h2&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;741&quot; data-origin-height=&quot;157&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YKkSp/btsN9L7IDcJ/8pN1iADq9kTM4y2kMF6Z51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YKkSp/btsN9L7IDcJ/8pN1iADq9kTM4y2kMF6Z51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YKkSp/btsN9L7IDcJ/8pN1iADq9kTM4y2kMF6Z51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYKkSp%2FbtsN9L7IDcJ%2F8pN1iADq9kTM4y2kMF6Z51%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;741&quot; height=&quot;157&quot; data-origin-width=&quot;741&quot; data-origin-height=&quot;157&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;Invalid package name; it's impossible to create a Java class inside&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;스프링 프로젝트에서 디렉토리 구성 중 &lt;code&gt;Enum&lt;/code&gt; 디렉토리를 생성하는데에 에러가 났다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;✨해결 방법&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;에러 그대로 &lt;code&gt;Enum&lt;/code&gt;은 Java class로 사용할 수 없는 명칭이었다.&lt;/li&gt;
&lt;li&gt;그래서 디렉토리명을 &lt;code&gt;Enums&lt;/code&gt;로 수정해서 만들었다.&lt;/li&gt;
&lt;li&gt;자바의 &lt;b&gt;Lexical Structure로, 자바 언어를 구성하는 가장 기본적인 규칙과 문법 요소들에 포함되는 단어였다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;자바의 &lt;b&gt;예약어&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;abstract&lt;/code&gt; &lt;code&gt;continue&lt;/code&gt; &lt;code&gt;for&lt;/code&gt; &lt;code&gt;new&lt;/code&gt; &lt;code&gt;switch&lt;/code&gt;&lt;br /&gt;&lt;code&gt;assert&lt;/code&gt; &lt;code&gt;default&lt;/code&gt; &lt;code&gt;if&lt;/code&gt; &lt;code&gt;package&lt;/code&gt; &lt;code&gt;synchronized&lt;/code&gt;&lt;br /&gt;&lt;code&gt;boolean&lt;/code&gt; &lt;code&gt;do&lt;/code&gt; &lt;code&gt;goto&lt;/code&gt; &lt;code&gt;private&lt;/code&gt; &lt;code&gt;this&lt;/code&gt;&lt;br /&gt;&lt;code&gt;break&lt;/code&gt; &lt;code&gt;double&lt;/code&gt; &lt;code&gt;implements&lt;/code&gt; &lt;code&gt;protected&lt;/code&gt; &lt;code&gt;throw&lt;/code&gt;&lt;br /&gt;&lt;code&gt;byte&lt;/code&gt; &lt;code&gt;else&lt;/code&gt; &lt;code&gt;import&lt;/code&gt; &lt;code&gt;public&lt;/code&gt; &lt;code&gt;throws&lt;/code&gt;&lt;br /&gt;&lt;code&gt;case&lt;/code&gt; &lt;code&gt;enum&lt;/code&gt; &lt;code&gt;instanceof&lt;/code&gt; &lt;code&gt;return&lt;/code&gt; &lt;code&gt;transient&lt;/code&gt;&lt;br /&gt;&lt;code&gt;catch&lt;/code&gt; &lt;code&gt;extends&lt;/code&gt; &lt;code&gt;int&lt;/code&gt; &lt;code&gt;short&lt;/code&gt; &lt;code&gt;try&lt;/code&gt;&lt;br /&gt;&lt;code&gt;char&lt;/code&gt; &lt;code&gt;final&lt;/code&gt; &lt;code&gt;interface&lt;/code&gt; &lt;code&gt;static&lt;/code&gt; &lt;code&gt;void&lt;/code&gt;&lt;br /&gt;&lt;code&gt;class&lt;/code&gt; &lt;code&gt;finally&lt;/code&gt; &lt;code&gt;long&lt;/code&gt; &lt;code&gt;strictfp&lt;/code&gt; &lt;code&gt;volatile&lt;/code&gt;&lt;br /&gt;&lt;code&gt;const&lt;/code&gt; &lt;code&gt;float&lt;/code&gt; &lt;code&gt;native&lt;/code&gt; &lt;code&gt;super&lt;/code&gt; &lt;code&gt;while&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;변수명을 지정할땐 주의해서 선언하는 편이였는데, 디렉토리명을 선언할때는 주의하지 못했던 것 같다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;참고자료&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.9&quot;&gt;https://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.9&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;</description>
      <category>Troubleshooting</category>
      <author>미니미니칩칩</author>
      <guid isPermaLink="true">https://miniminichipchip.tistory.com/42</guid>
      <comments>https://miniminichipchip.tistory.com/42#entry42comment</comments>
      <pubDate>Fri, 23 May 2025 00:41:17 +0900</pubDate>
    </item>
    <item>
      <title>[Java] 람다식</title>
      <link>https://miniminichipchip.tistory.com/40</link>
      <description>&lt;h2&gt;람다식&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;데이터 처리부에 제공되는 함수 역할을 하는 매개변수를 가진 중괄호 블록&lt;/li&gt;
&lt;li&gt;자바에선 람다식을 익명 구현 객체로 변환&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;(x, y) -&amp;gt; {
    int result = x + y;
    return result;
}&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;함수형 인터페이스&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;인터페이스가 단 하나의 추상 메소드를 가지는 것&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@FunctionalInterface&lt;/code&gt; 어노테이션으로 함수형 인터페이스임을 보장할 수 있음&lt;/li&gt;
&lt;li&gt;실행문이 하나일 경우에만 중괄호를 생략할 수 있음, 실행문 대신 return문이 하나만 있어도 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;메소드 참조&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;메소드 참조로 매개변수의 정보 및 리턴 타입을 알아내 람다식에서 불필요한 매개변수 제거&lt;/li&gt;
&lt;li&gt;메소드 참조로 단순화 기능&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;// 정적 메소드 -&amp;gt; 클래스 :: 메소드
// 인스턴스 메소드 -&amp;gt; 참조변수 :: 메소드

(left, right) -&amp;gt; Math.max(left,right);
Math :: max;&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;람다식에서 제공되는 a 변수의 메소드를 호출해서 b 매개변수를 매개값으로 사용&lt;/li&gt;
&lt;li&gt;a의 클래스 이름 뒤에 :: 기호를 붙이고 메소드 이름을 기술할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;// 클래스 :: instanceMethod

(a, b) -&amp;gt; { a.instanceMethod(b); }&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;생성자 참조&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;객체를 생성하는 것. 람다식이 단순히 객체를 생성하고 return 하도록 구성되면 람다식을 생성자 참조로 대치 가능&lt;/li&gt;
&lt;li&gt;클래스 이름 뒤에 :: 기호를 붙이고 new 연산자를 기술&lt;/li&gt;
&lt;li&gt;생성자가 여러개 오버로딩된 경우, 컴파일러는 함수형 인터페이스의 추상 메소드와 동일한 매개변수 타입과 개수를 가지고 있는 생성자를 찾아 실행. 생성자가 없으면 컴파일 오류 발생.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;// 클래스 :: new

(a, b) -&amp;gt; { return new 클래스(a, b); }&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;참고자료&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ITYL 6기 수업자료&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Java</category>
      <author>미니미니칩칩</author>
      <guid isPermaLink="true">https://miniminichipchip.tistory.com/40</guid>
      <comments>https://miniminichipchip.tistory.com/40#entry40comment</comments>
      <pubDate>Wed, 7 May 2025 11:39:43 +0900</pubDate>
    </item>
    <item>
      <title>[Java] 컬렉션 자료구조</title>
      <link>https://miniminichipchip.tistory.com/39</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;컬렉션 프레임워크&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;546&quot; data-origin-height=&quot;218&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dme6q2/btsNF9gw3Zk/Kxa7ZAoEZycBE9Zm85joMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dme6q2/btsNF9gw3Zk/Kxa7ZAoEZycBE9Zm85joMk/img.png&quot; data-alt=&quot;주요 인터페이스 간의 상속 관계&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dme6q2/btsNF9gw3Zk/Kxa7ZAoEZycBE9Zm85joMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdme6q2%2FbtsNF9gw3Zk%2FKxa7ZAoEZycBE9Zm85joMk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;546&quot; height=&quot;218&quot; data-origin-width=&quot;546&quot; data-origin-height=&quot;218&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;주요 인터페이스 간의 상속 관계&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;img src=&quot;https://hudi.blog/static/1bacac1babc556100455a8c64e7658da/e6c4b/2.png&quot; alt=&quot;img&quot; /&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컬렉션 프레임워크&amp;nbsp;&amp;rarr; Collection 인터페이스, Map 인터페이스&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;List&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Set&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;HashSet&lt;/code&gt; : 동등 객체를 저장하지 않음, hashCode() 리턴 값이 같아도 동일한 객체로 판단해 저장하지 않음&lt;/li&gt;
&lt;li&gt;&lt;code&gt;TreeSet&lt;/code&gt; : 이진 트리를 기반으로 한 Set 컬렉션&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Map&lt;/b&gt; :
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;키는 중복 저장할 수 없지만, 값은 중복 저장할 수 있음.&lt;/li&gt;
&lt;li&gt;기존의 저장된 키와 동일된 키로 값을 저장하면 새로운 값으로 대치&lt;/li&gt;
&lt;li&gt;&lt;code&gt;HashMap&lt;/code&gt; : hashCode() 리턴 값이 같으면 동일 키로 보고 중복 저장을 허용하지 않음&lt;/li&gt;
&lt;li&gt;&lt;code&gt;HashTable&lt;/code&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;동기화된 메소드로 구성돼, 멀티 스레드가 동시에 Hashtable의 메소드들을 실행 불가.&lt;/li&gt;
&lt;li&gt;멀티 스레드 환경에서도 안전하게 객체를 추가, 삭제할 수 있다.&lt;/li&gt;
&lt;li&gt;자식 클래스로 키와 값을 String 타입으로 제한한 Properties가 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;TreeMap&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Comparable과 Comparator&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;TreeSet에 저장되는 객체와 TreeMap에 저장되는 키 객체를 정렬&lt;/li&gt;
&lt;li&gt;Comparable 인터페이스에서 정의된 &lt;code&gt;compareTo()&lt;/code&gt;를 재정의해서 비교 결과를 정수 값으로 리턴&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;public class Person implements Comparable&amp;lt;Person&amp;gt; { 
    public String name; 
    public int age; 
    public Person(String name, int age) { 
        this.name = name; 
        this.age = age; } 

    @Override 
    public int compareTo(Person o) { 
        if(age &amp;lt; o.age) return -1; 
        else if(age == o.age) return 0; 
        else return 1; } 
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;비교 기능이 없는 Comparable 비구현 객체를 저장하려면 비교자 Comparator를 제공&lt;/li&gt;
&lt;li&gt;비교자는 &lt;code&gt;compare()&lt;/code&gt; 메소드를 재정의해서 비교 결과를 정수 값으로 리턴&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;LIFO, FIFO (Stack, Queue)&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQmtj7%2FbtqW1r87luR%2FkPuILqm5LlQrtkXCndkRg1%2Fimg.png&quot; alt=&quot;img&quot; /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;동기화된 컬렉션&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;동기화된 메소드로 구성된 Vector와 Hashtable은 멀티 스레드 환경에서 안전하게 요소를 처리&lt;/li&gt;
&lt;li&gt;Collections의 &lt;code&gt;synchronizedXXX()&lt;/code&gt; 메소드: 동기화된 메소드로 래핑
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;List&amp;lt;T&amp;gt; list = Collections.synchronizedList(new ArrayList&amp;lt;T&amp;gt;());&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;수정할 수 없는 컬렉션&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;저장된 요소를 변경하고 싶지 않을 때 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;lasso&quot;&gt;&lt;code&gt;// List 불변 컬렉션 생성
List&amp;lt;String&amp;gt; immutableList1 = List.of(&quot;A&quot;, &quot;B&quot;, &quot;C&quot;);

List&amp;lt;String&amp;gt; list = new ArrayList&amp;lt; &amp;gt;(); 
list.add(&quot;A&quot;); 
list.add(&quot;B&quot;); 
list.add(&quot;C&quot;);

// copyOf() 를 이용해 기존 컬렉션을 복사
List&amp;lt;String&amp;gt; immutableList2 = List.copyOf(list);&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;참고자료&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ITYL 6기 수업자료&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://inpa.tistory.com/entry/JCF-%F0%9F%A7%B1-Collections-Framework-%EC%A2%85%EB%A5%98-%EC%B4%9D%EC%A0%95%EB%A6%AC&quot;&gt;https://inpa.tistory.com/entry/JCF-%F0%9F%A7%B1-Collections-Framework-%EC%A2%85%EB%A5%98-%EC%B4%9D%EC%A0%95%EB%A6%AC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://tcpschool.com/java/java_collectionFramework_concept&quot;&gt;https://tcpschool.com/java/java_collectionFramework_concept&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://hudi.blog/java-collection-framework-1/&quot;&gt;https://hudi.blog/java-collection-framework-1/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://jang-sn.tistory.com/44&quot;&gt;https://jang-sn.tistory.com/44&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Java</category>
      <author>미니미니칩칩</author>
      <guid isPermaLink="true">https://miniminichipchip.tistory.com/39</guid>
      <comments>https://miniminichipchip.tistory.com/39#entry39comment</comments>
      <pubDate>Wed, 30 Apr 2025 10:46:13 +0900</pubDate>
    </item>
    <item>
      <title>[Java] Multi Thread</title>
      <link>https://miniminichipchip.tistory.com/38</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Multi Thread&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;303&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/y7H9w/btsNCxJXIz2/Fm0Kq29mDBK33gjKAnipsK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/y7H9w/btsNCxJXIz2/Fm0Kq29mDBK33gjKAnipsK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/y7H9w/btsNCxJXIz2/Fm0Kq29mDBK33gjKAnipsK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fy7H9w%2FbtsNCxJXIz2%2FFm0Kq29mDBK33gjKAnipsK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;303&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;303&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;프로세스 : 운영체제는 실행 중인 프로그램을 관리&lt;br /&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;&lt;b&gt;멀티 스레드&lt;/b&gt; : 두 개의 코드 실행 흐름. 두 가지 이상의 작업을 처리, 프로그램 내부의 멀티 태스킹&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;멀티 프로세스&lt;/b&gt; : 프로그램 단위의 멀티 태스킹&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;메인 스레드&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sNDxa/btrXWJAd50Y/gqUyRDDhGIEStw2xVoHyH0/img.png&quot; alt=&quot;img&quot; /&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;main() 메소드의 첫 코드부터 순차적으로 실행&lt;/li&gt;
&lt;li&gt;추가 작업 스레드를 만들어서 실행시킬 수 있으나, 작업 스레드가 계속 실행 중이라면 프로세스는 종료되지 않음&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;autohotkey&quot;&gt;&lt;code&gt;Thread thread = new Thread(Runnable target);&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;java&quot;&gt;&lt;code&gt;class Task implements Runnable {
    @Override
    public void run() {
    // 스레드가 실행할 코드
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Thread 클래스를 상속한 다음 run() 메소드를 재정의 해서 자식 클래스를 생성할 수 있음
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Thread 익명 자식 객체를 사용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;scala&quot;&gt;&lt;code&gt;class WorkerThread extends Thread {
    public void run() {

    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;스레드 상태&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZG7as/btrX1mKJepI/bdxdB7bWfKpWKLK329kx6k/img.png&quot; alt=&quot;img&quot; /&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실행 대기 상태&lt;/li&gt;
&lt;li&gt;실행 상태
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU 스케쥴링에 따라 CPU를 점유하고 run() 메소드를 실행&lt;/li&gt;
&lt;li&gt;스케쥴링에 의해 다시 실행 대기 상태로 돌아갔다가 다른 스레드가 실행 상태 반복&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;종료 상태
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실행할 코드 없이 스레드의 실행을 멈춘 상태&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;일시정지 상태&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스레드가 실행할 수 없는 상태&lt;/li&gt;
&lt;li&gt;스레드가 다시 실행상태로 돌아가기 위해서는 일시 정지 상태에서 실행 대기 상태로 가야함&lt;/li&gt;
&lt;li&gt;Thread 클래스의 &lt;code&gt;sleep()&lt;/code&gt; 메소드&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p 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&gt;&lt;code&gt;join()&lt;/code&gt; 메서드 : 해당 스레드가 종료할 때까지 대기하다가 스레드가 종료하면 실행을 재개&lt;/li&gt;
&lt;/ul&gt;
&lt;p 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&gt;&lt;code&gt;yield()&lt;/code&gt; 메서드 : 실행되는 스레드는 실행 대기 상태로 돌아가고, 다른 스레드가 실행되도록 양보&lt;/li&gt;
&lt;li&gt;무의미한 반복을 막아 프로그램 성능 향상&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;스레드 동기화&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://mblogthumb-phinf.pstatic.net/MjAxODEyMjFfMjg2/MDAxNTQ1NDAxNTcyNjcy.287Mr3JGry4BQj11b_kgUEuB18u7bj8Sb8c5htum_-sg.3bWWLrEOvN9LY2X53fQk1htziHID-cW0ZbkcjlTqnkAg.PNG.sooftware/image.png?type=w800&quot; alt=&quot;img&quot; /&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;동기화 메소드, 블록 : 스레드 작업이 끝날 때까지 객체에 잠금을 걸어 스레드가 사용 중인 객체를 다른 스레드가 변경할 수 없게 함
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인스턴스와 정적 메소드에 &lt;code&gt;synchronized&lt;/code&gt; 키워드&lt;/li&gt;
&lt;li&gt;메소드 실행 즉시 잠금이 일어나고, 실행이 끝나면 잠금 풀림&lt;/li&gt;
&lt;li&gt;메소드 일부 영역 실행 시 객체 잠금을 걸고 싶다면 동기화 블록을 만듦&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;oxygene&quot;&gt;&lt;code&gt;public synchronized void method() {
    // 단 하나의 스레드만 실행하는 영역
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;스레드 제어&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;두 스레드 교대 실행 시 공유 객체는 두 스레드가 작업할 내용을 각각 동기화 메소드로 정함&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wait()&lt;/code&gt;와 &lt;code&gt;notify()&lt;/code&gt; : 한 스레드 작업 완료시 notify()로 일시 정지 상태에 있는 다른 스레드를 실행 대기 상태로 만들고, wait()로 자신은 일시 정지 상태로 만듦&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p 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&gt;사용하던 리소스(파일, 네트워크 연결)를 정리하고, &lt;code&gt;run()&lt;/code&gt; 메소드를 빨리 종료해야함&lt;/li&gt;
&lt;li&gt;스레드가 일시 정지 상태에 있을 때 &lt;code&gt;InterruptedException&lt;/code&gt; 예외 발생, 예외 처리로 메소드를 정상 종료&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;데몬 스레드&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주 스레드의 작업을 돕는 보조적인 역할을 수행하는 스레드&lt;/li&gt;
&lt;li&gt;예시 : 워드 프로세서의 자동 저장, 미디어 플레이어의 동영상 및 음악 재생, 가비지 컬렉터&lt;/li&gt;
&lt;li&gt;주 스레드가 데몬이 될 스레드의 &lt;code&gt;setDaemon(true)&lt;/code&gt;를 호출&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;public static void main(String[] args) {
    AutoSaveThread thread = new AutoSaveThread();
    thread.setDaemon(true);
    thread.start();
    ...&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;스레드풀&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;작업 처리에 사용되는 스레드 개수를 제한하고, 작업 큐에 들어오는 작업들을 스레드가 하나씩 맡아 처리하는 방식&lt;/li&gt;
&lt;li&gt;작업 처리가 끝난 스레드는 다시 작업 큐에서 새로운 작업을 가져와 처리&lt;/li&gt;
&lt;li&gt;작업량이 증가해도 스레드의 개수가 늘어나지 않아 성능의 급격한 저하 방지&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;참고자료&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ITYL 6기 수업자료&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://thebook.io/080367/0024/&quot;&gt;https://thebook.io/080367/0024/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://thd9780.tistory.com/m/112&quot;&gt;https://thd9780.tistory.com/m/112&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://m.blog.naver.com/sooftware/221424562029&quot;&gt;https://m.blog.naver.com/sooftware/221424562029&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Java</category>
      <author>미니미니칩칩</author>
      <guid isPermaLink="true">https://miniminichipchip.tistory.com/38</guid>
      <comments>https://miniminichipchip.tistory.com/38#entry38comment</comments>
      <pubDate>Tue, 29 Apr 2025 12:55:57 +0900</pubDate>
    </item>
    <item>
      <title>[Java] 제네릭</title>
      <link>https://miniminichipchip.tistory.com/37</link>
      <description>&lt;h2&gt;제네릭&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;결정되지 않은 타입을 파라미터로 처리&lt;/li&gt;
&lt;li&gt;제네릭 타입 선언부에 다이아몬드 연산자인 &amp;#39;&amp;lt; &amp;gt;&amp;#39; 부호가 붙고, 그 사이에 타입 파라미터들이 위치&lt;/li&gt;
&lt;li&gt;보통 타입 파라미터를 &lt;code&gt;&amp;lt;T&amp;gt;&lt;/code&gt; 기호로 대체시킴, 클래스나 메소드를 설계할 때 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;public class Box&amp;lt;T&amp;gt; { 
    public T content; 
}&lt;/code&gt;&lt;/pre&gt;
&lt;br&gt;

&lt;p&gt;&lt;strong&gt;제네릭 메소드&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;타입 파라미터를 가지고 있는 메소드, 타입 파라미터가 메소드 선언부에 정의&lt;/li&gt;
&lt;li&gt;리턴 타입 앞에 &amp;#39;&amp;lt; &amp;gt;&amp;#39; 기호 추가하고 타입 파라미터 정의 후 리턴 타입과 매개변수 타입에서 사용&lt;/li&gt;
&lt;li&gt;&lt;code&gt;제한된 타입 파라미터&lt;/code&gt;, &lt;code&gt;와일드카드 타입 파라미터&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;참고자료&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ITYL 6기 수업자료&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EC%A0%9C%EB%84%A4%EB%A6%ADGenerics-%EA%B0%9C%EB%85%90-%EB%AC%B8%EB%B2%95-%EC%A0%95%EB%B3%B5%ED%95%98%EA%B8%B0&quot;&gt;https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EC%A0%9C%EB%84%A4%EB%A6%ADGenerics-%EA%B0%9C%EB%85%90-%EB%AC%B8%EB%B2%95-%EC%A0%95%EB%B3%B5%ED%95%98%EA%B8%B0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Java</category>
      <author>미니미니칩칩</author>
      <guid isPermaLink="true">https://miniminichipchip.tistory.com/37</guid>
      <comments>https://miniminichipchip.tistory.com/37#entry37comment</comments>
      <pubDate>Tue, 29 Apr 2025 11:15:18 +0900</pubDate>
    </item>
  </channel>
</rss>