์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ ์ดˆ๊ธฐํ™”, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ดˆ๊ธฐํ™”

2023. 4. 11. 09:07ใ†์ธํ”„๋Ÿฐ/์Šคํ”„๋ง ๋ถ€ํŠธ - ํ•ต์‹ฌ ์›๋ฆฌ์™€ ํ™œ์šฉ

728x90

 

์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ ์ดˆ๊ธฐํ™”๋ž€? (tistory.com)

 

์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ ์ดˆ๊ธฐํ™”๋ž€?

WAS๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์‹œ์ ์— ํ•„์š”ํ•œ ์ดˆ๊ธฐํ™” ์ž‘์—…๋“ค( ์„œ๋น„์Šค์— ํ•„์š”ํ•œ ํ•„ํ„ฐ์™€ ์„œ๋ธ”๋ฆฟ์„ ๋“ฑ๋ก, ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ, ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ ๋“ฑ๋ก ๋“ฑ..) ์ด ์žˆ๋Š”๋ฐ WAS๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ดˆ๊ธฐํ™” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด, WAS

hyejin.tistory.com

WAS ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์‹œ์ ์— ํ•„์š”ํ•œ ์ดˆ๊ธฐํ™” ์ž‘์—…๋“ค์ด ์žˆ๋Š”๋ฐ ์˜ˆ์ „์—๋Š” ์ด๋ฅผ web.xml์„ ์ด์šฉํ•ด์„œ ์ดˆ๊ธฐํ™”ํ–ˆ์ง€๋งŒ, ์ง€๊ธˆ์€ ์„œ๋ธ”๋ฆฟ ์ŠคํŽ™์—์„œ ์ž๋ฐ” ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•œ ์ดˆ๊ธฐํ™”๋„ ์ง€์›ํ•˜๊ณ  ์žˆ๋‹ค. 

 

 

ServletContainerInitializer

: ์„œ๋ธ”๋ฆฟ์€ ServletContainerInitializer ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ด์„œ ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ ์ดˆ๊ธฐํ™” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ณ , onStartup() ์‹คํ–‰ ์‹œ์ ์— ์ด ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์„œ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ๋“ค์„ ์ดˆ๊ธฐํ™” ํ•˜๊ฑฐ๋‚˜ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

์ €๋ฒˆ ๊ธ€์—์„œ๋Š” ์„œ๋ธ”๋ฆฟ์„ @WebServlet ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•ด์„œ ๋“ฑ๋กํ–ˆ์—ˆ๋Š”๋ฐ ์ด๋ฒˆ์—๋Š” ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ ์ดˆ๊ธฐํ™” ์‹œ์ ์— ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ์ง์ ‘ ๋“ฑ๋กํ•ด์ค€๋‹ค. 

 

HelloServlet

public class HelloServlet extends HttpServlet
{
   @Override
   protected void service(HttpServletRequest req, HttpServletResponse resp) throws IOException
   {
      System.out.println("HelloServlet.service");
      resp.getWriter().println("hello servlet!!");
   }
}

HelloServlet์„ ๋งŒ๋“ค๊ณ  ์ด ์„œ๋ธ”๋ฆฟ์„ ๋“ฑ๋กํ•˜๊ณ , ์‹คํ–‰ํ•˜๋ฉด ๋กœ๊ทธ๋กœ๋Š” "HelloServlet.service"๊ฐ€ ์ถœ๋ ฅ๋˜๊ณ  http ์‘๋‹ต์œผ๋กœ "hello servlet!!"์ด ์ถœ๋ ฅ๋œ๋‹ค. 

 

 

<์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ดˆ๊ธฐํ™”>

์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๋Š” ์ข€ ๋” ์œ ์—ฐํ•œ ์ดˆ๊ธฐํ™” ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๋Š”๋ฐ ์ด๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ดˆ๊ธฐํ™”๋ผ๊ณ  ํ•œ๋‹ค. 

 

AppInit 

public interface AppInit
{
   void onStartup(ServletContext servletContext);
}

-> ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ดˆ๊ธฐํ™”๋ฅผ ์ง„ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‚ด์šฉ๊ณผ ํ˜•์‹์€ ์ƒ๊ด€์—†์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋จผ์ € ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค. 

 

 

AppInitV1Servlet

public class AppInitV1Servlet implements AppInit
{
   @Override
   public void onStartup(ServletContext servletContext)
   {
      System.out.println("AppInitV1Servlet.onStartup");
      
      // ์ˆœ์ˆ˜ ์„œ๋ธ”๋ฆฟ ์ฝ”๋“œ ๋“ฑ๋ก
      ServletRegistration.Dynamic helloServlet = servletContext.addServlet("helloServlet", new HelloServlet());
      helloServlet.addMapping("/hello-servlet");
   }
}

-> ๊ทธ๋ฆฌ๊ณ  AppInit ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ด ์‹ค์ œ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค. 

์—ฌ๊ธฐ์„œ ์ด์ œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ์œ„์—์„œ ๋งŒ๋“ค์—ˆ๋˜ HelloServlet ์„ ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋กํ•œ๋‹ค. 

/hello-servlet์„  ํ˜ธ์ถœํ•˜๋ฉด HelloServlet์ด ์‹คํ–‰๋˜๋„๋ก ๋“ฑ๋กํ–ˆ๋‹ค. 

 

 

โ— ์„œ๋ธ”๋ฆฟ์„ ๋“ฑ๋กํ•˜๋Š” 2๊ฐ€์ง€ ๋ฐฉ๋ฒ• ์ค‘ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ? 

์„œ๋ธ”๋ฆฟ์„ ๋“ฑ๋กํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ์œ„์—์„œ๋„ ๋งํ–ˆ๋“ฏ์ด @WebServlet์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹๊ณผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์ด ์žˆ๋‹ค. 

 

๋จผ์ € @WebServlet์„ ์‚ฌ์šฉํ•˜๋ฉด ์• ๋…ธํ…Œ์ด์…˜ ํ•˜๋‚˜๋กœ ์„œ๋ธ”๋ฆฟ์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ์ง€๋งŒ.. ์œ ์—ฐํ•˜๊ฒŒ ๋ณ€๊ฒฝ์€ ์–ด๋ ต๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. 

์˜ˆ๋ฅผ ๋“ค์–ด /hello-servlet์„ ๊ฒฝ๋กœ๋ฅผ /test ๊ฒฝ๋กœ๋กœ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ๋ณ€๊ฒฝํ•ด์•ผ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค. 

 

๊ทผ๋ฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์€ ์• ๋…ธํ…Œ์ด์…˜์— ๋น„ํ•˜๋ฉด ์ฝ”๋”ฉ์„ ๋” ๋งŽ์ด ํ•ด์•ผํ•˜๊ณ  ๋ถˆํŽธํ•˜์ง€๋งŒ ์œ ์—ฐํ•˜๊ฒŒ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. 

์˜ˆ๋ฅผ ๋“ค๋ฉด /hello-servlet ๊ฒฝ๋กœ๋ฅผ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋ฐ”๊ฟ”์„œ ์™ธ๋ถ€ ์„ค์ •์„ ์ฝ์–ด์„œ ๋“ฑ๋กํ•  ์ˆ˜ ๋„ ์žˆ๊ณ , ์„œ๋ธ”๋ฆฟ ์ž์ฒด๋„ ์กฐ๊ฑด์— ๋”ฐ๋ผ if ๋ฌธ์œผ๋กœ ๋“ฑ๋กํ•˜๊ฑฐ๋‚˜ ๋บ„ ์ˆ˜๋„ ์žˆ๋‹ค. 

 

 

 

<์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ดˆ๊ธฐํ™” ๊ณผ์ •>

 

MyContainerInitV2

@HandlesTypes(AppInit.class)
public class MyContainerInitV2 implements ServletContainerInitializer
{
   
   @Override
   public void onStartup(Set<Class<?>> c, ServletContext ctx) throws ServletException
   {
      System.out.println("MyContainerInitV2.onStartup");
      System.out.println("MyContainerInitV2 c =" + c);
      System.out.println("MyContainerInitV2 ctx = " + ctx);
      
      // class hello.container.AppInitV1Servlet
      for (Class<?> appInitClass : c)
      {
         try
         {
            // new AppInitV1Servlet() ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ
            AppInit appInit = (AppInit) appInitClass.getDeclaredConstructor().newInstance();
            appInit.onStartup(ctx);
         }
         catch (Exception e)
         {
            throw new RuntimeException(e);
         }
         
      }
      
   }
}

1๏ธโƒฃ @HandleTypes ์• ๋…ธํ…Œ์ด์…˜์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ดˆ๊ธฐํ™” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ง€์ •ํ•œ๋‹ค. 

 

2๏ธโƒฃ ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ ์ดˆ๊ธฐํ™” ServletContainerInitializer ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜์–ด์˜จ Set<Class<?>> c ์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ดˆ๊ธฐํ™” ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์ฒด๋“ค์„ ๋ชจ๋‘ ์ฐพ์•„์„œ ํด๋ž˜์Šค ์ •๋ณด๋กœ ์ „๋‹ฌํ•œ๋‹ค. 

-> @HandleTypes๋กœ AppInit ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ „๋‹ฌํ–ˆ์œผ๋ฏ€๋กœ ์ด๋ฅผ ๊ตฌํ˜„ํ•œ AppInitV1Servlet ์ •๋ณด๊ฐ€ ์ „๋‹ฌ๋œ๋‹ค.

(์ฐธ๊ณ ๋กœ ๊ฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์•„๋‹ˆ๋ผ ํด๋ž˜์Šค ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.)

 

3๏ธโƒฃ appInitClass.getDeclaredConstructor().newInstance() 

-> ๋ฆฌํ”Œ๋ ‰์…˜์„ ์‚ฌ์šฉํ•ด์„œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ( ์ด ์ฝ”๋“œ๋Š” new AppInitV1Servlet() ๊ณผ ๊ฐ™๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋„ ๋œ๋‹ค. )

 

4๏ธโƒฃ appInit.onStartup(ctx); 

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ดˆ๊ธฐํ™” ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ์‹คํ–‰ํ•ด์„œ ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด ctx๋„ ํ•จ๊ป˜ ์ „๋‹ฌํ•œ๋‹ค. 

 

 

 

<MyContainerInitV2 ๋“ฑ๋ก>

๋งˆ์ง€๋ง‰์œผ๋กœ MyContainerInitV2๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋ฉด ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ์— ์•Œ๋ ค์ค˜์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— 

resources/META-INF/services/jakarta.servlet.ServletContainerInitializer 

์— ๋“ฑ๋กํ•ด์ค€๋‹ค. 

hello.container.MyContainerInitV2

 

<Tomcat ์‹คํ–‰>

๊ทธ๋ฆฌ๊ณ  WAS๋ฅผ ์‹คํ–‰ํ•ด๋ณด๋ฉด 

์ €๋ฒˆ ๊ธ€์—์„œ ๋“ฑ๋กํ–ˆ๋˜ MyContainerInitV1๊ณผ ์ด๋ฒˆ์— ๋“ฑ๋กํ•œ MyContainerInitV2๊ฐ€ ์‹คํ–‰๋˜์–ด ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ดˆ๊ธฐํ™” ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

http://localhost:9080/hello-servlet

HelloServlet์ด ๋“ฑ๋ก๋˜์–ด /hello-servlet์œผ๋กœ ์š”์ฒญํ•˜๋ฉด ๋กœ๊ทธ๋กœ ํ•ด๋‹น ๋‚ด์šฉ์ด ์ฐํžˆ๊ณ , ์‘๋‹ต๋„ ์˜จ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

<์ดˆ๊ธฐํ™” ์ˆœ์„œ>

1๏ธโƒฃ ๋จผ์ € ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ ์ดˆ๊ธฐํ™” ์‹คํ–‰ ํ›„, 2๏ธโƒฃ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ดˆ๊ธฐํ™”๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. 

 

 

 

โ— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ดˆ๊ธฐํ™”๋ฅผ ํ•˜๋Š” ์ด์œ ? 

๊ฐ•์˜๋ฅผ ๋“ค์œผ๋ฉด์„œ๋„  ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ ์ดˆ๊ธฐํ™”๋งŒ ์žˆ์œผ๋ฉด ๋˜๋Š” ๊ฒƒ ๊ฐ™์€๋ฐ  ๊ตณ์ด ์™œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ดˆ๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•œ์ง€์— ๋Œ€ํ•ด์„œ ์ข€ ๊ถ๊ธˆํ•œ ์ฐธ์ด์—ˆ๋Š”๋ฐ ๋”ฑ ๊ถ๊ธˆํ•œ ๋‚ด์šฉ์— ๋Œ€ํ•ด์„œ ์–ธ๊ธ‰ํ•ด์ฃผ์…”์„œ ์ž‘์„ฑํ•ด๋‘”๋‹ค. 

 

- ํŽธ๋ฆฌํ•จ 

์ƒ๊ฐํ•ด๋ณด๋ฉด ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋ ค๋ฉด ServletContainerInitializer ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์–ด์„œ, resources/META-INF/services/jakarta.servlet.ServletContainerInitializer  ์—ฌ๊ธฐ์— ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ์ง€์ •ํ•ด์ค˜์•ผ ํ•˜๋Š”๋ฐ, 

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ดˆ๊ธฐํ™”๋Š” ๊ทธ๋ƒฅ ํŠน์ • ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ๊ทธ๋ƒฅ ๊ตฌํ˜„ํ•˜๋ฉด ๋œ๋‹ค. 

 

- ์˜์กด์„ฑ 

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ดˆ๊ธฐํ™”๋Š” ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ์— ์ƒ๊ด€์—†์ด ์›ํ•˜๋Š” ๋ชจ์–‘์œผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ดˆ๊ธฐํ™” ์ฝ”๋“œ๊ฐ€ ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•œ ์˜์กด์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90