์Šคํ”„๋ง MVC ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ ์ดˆ๊ธฐํ™” WebApplicationInitalizer

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

728x90

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

 

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

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

hyejin.tistory.com

์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ๋“ฑ๋ก (tistory.com)

 

์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ๋“ฑ๋ก

์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ ์ดˆ๊ธฐํ™”, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ดˆ๊ธฐํ™” (tistory.com) ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ ์ดˆ๊ธฐํ™”, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ดˆ๊ธฐํ™” ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ ์ดˆ๊ธฐํ™”๋ž€? (tistory.com) ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ ์ดˆ๊ธฐํ™”๋ž€? WAS๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์‹œ์ 

hyejin.tistory.com

์ €๋ฒˆ ๊ธ€์—์„œ ๋ณด๋ฉด ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋ ค๋ฉด ๋จผ์ € ServletContainerInitializer ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ ์ดˆ๊ธฐํ™” ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ดˆ๊ธฐํ™”๋ฅผ ์œ„ํ•ด์„œ @HandleTypes ์–ด๋…ธํ…Œ์ด์…˜์„ ์ ์šฉํ•˜๊ณ , ๊ทธ ๋‹ค์Œ /META-INF/services/jakarta.servlet.ServletContainerInitializer ํŒŒ์ผ์— ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ ์ดˆ๊ธฐํ™” ํด๋ž˜์Šค ๊ฒฝ๋กœ๋ฅผ ๋“ฑ๋กํ•ด์คฌ๋‹ค. 

 

์ด ๊ณผ์ •์„ ๊ณ„์† ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๋ฒˆ๊ฑฐ๋กญ๊ณ  ๊ท€์ฐฎ์€ ์ž‘์—…์ด๋‹ค.. 

๊ทผ๋ฐ ์Šคํ”„๋ง MVC๋Š” ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ดˆ๊ธฐํ™” ํ•˜๋Š” ์ž‘์—…์„ ์ด๋ฏธ ๋งŒ๋“ค์–ด์„œ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค!! 

๋”ฐ๋ผ์„œ ๊ฐœ๋ฐœ์ž๋“ค์€ ์ด ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ ์ดˆ๊ธฐํ™” ๊ณผ์ •์€ ํ•˜์ง€ ์•Š์•„๋„ ๋˜๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ดˆ๊ธฐํ™” ์ฝ”๋“œ๋งŒ ์ž‘์„ฑํ•ด์ฃผ๋ฉด ๋œ๋‹ค ใ…Žใ…Ž 

 

 

WebApplicationInitializer 

public interface WebApplicationInitializer {

   /**
    * Configure the given {@link ServletContext} with any servlets, filters, listeners
    * context-params and attributes necessary for initializing this web application. See
    * examples {@linkplain WebApplicationInitializer above}.
    * @param servletContext the {@code ServletContext} to initialize
    * @throws ServletException if any call against the given {@code ServletContext}
    * throws a {@code ServletException}
    */
   void onStartup(ServletContext servletContext) throws ServletException;

}

WebApplicationInitializer๋Š” ์Šคํ”„๋ง์ด ์ง€์›ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ดˆ๊ธฐํ™” ์ฝ”๋“œ๋กœ ์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ดˆ๊ธฐํ™” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ๋ฉด ๋œ๋‹ค. 

 

 

AppInitV3SpringMvc

public class AppInitV3SpringMvc implements WebApplicationInitializer
{
   
   @Override
   public void onStartup(ServletContext servletContext) throws ServletException
   {
      System.out.println("AppInitV3SpringMvc.onStartup");
      
      // ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ
      AnnotationConfigWebApplicationContext appContext = new AnnotationConfigWebApplicationContext();
      appContext.register(HelloConfig.class);
      
      // ์Šคํ”„๋ง MVC ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ ์ƒ์„ฑ, ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ์—ฐ๊ฒฐ
      DispatcherServlet dispatcher = new DispatcherServlet(appContext);
      
      // ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์„ ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋ก (์ด๋ฆ„ ์ฃผ์˜!)
      ServletRegistration.Dynamic servlet = servletContext.addServlet("dispatcherV3", dispatcher);
      
      // ๋ชจ๋“  ์š”์ฒญ์ด ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์„ ํ†ตํ•˜๋„๋ก ์„ค์ •
      servlet.addMapping("/");
   }
}

์ €๋ฒˆ ๊ธ€์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ดˆ๊ธฐํ™” ์ฝ”๋“œ๋กœ ์‚ฌ์šฉํ–ˆ๋˜ ๊ฑธ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์™”๋‹ค. 

๋Œ€์‹  ์—ฌ๊ธฐ์„œ๋Š” AppInit ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์Šคํ”„๋ง์ด ์ œ๊ณตํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ดˆ๊ธฐํ™” ์ธํ„ฐํŽ˜์ด์Šค  WebApplicationInitializer๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค. 

๊ทธ๋ฆฌ๊ณ  ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ์— ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์„ ๋“ฑ๋กํ•  ๋•Œ ์ด๋ฆ„์„ ์ด๋ฒˆ์—” V3 ์œผ๋กœ ํ•ด์ฃผ๊ณ , addMapping์—์„œ๋„ "/" ์œผ๋กœ ์ง€์ •ํ•ด์„œ ๋ชจ๋“  ์š”์ฒญ์ด ํ•ด๋‹น ์„œ๋ธ”๋ฆฟ์„ ํ†ตํ•˜๋„๋ก ํ–ˆ๋‹ค. 

 

http://localhost:9080/hello-spring ์œผ๋กœ ์‹คํ–‰ํ•˜๋ฉด ์ด๋ฒˆ์—” /hello-spring์ด ๋งคํ•‘๋œ ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.

 

โ— ์ง€๊ธˆ ๋ณด๋ฉด ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ๋„ ์—ฌ๋Ÿฌ๊ฐœ๊ณ  ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋„ ์—ฌ๋Ÿฌ๊ฐœ์ธ๋ฐ.. .

๋ณดํ†ต์€ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค๊ณ , ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ๋„ ํ•˜๋‚˜๋งŒ ๋งŒ๋“ค๊ณ , ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์˜ ๊ฒฝ๋กœ ๋งคํ•‘๋„ /๋กœ ํ•ด์„œ ํ•˜๋‚˜์˜ ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์„ ํ†ตํ•ด์„œ ๋ชจ๋“  ๊ฒƒ์„ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•œ๋‹ค!! 

 

 

โ“ ๊ทผ๋ฐ ์–ด๋–ป๊ฒŒ WebApplicationIntializer ๋งŒ ๊ตฌํ˜„ํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ดˆ๊ธฐํ™”๊ฐ€ ๊ฐ€๋Šฅํ•œ๊ฐ€? ์— ๋Œ€ํ•ด์„œ๋Š” ์Šคํ”„๋ง ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ๋œ๋‹ค. 

spring-web ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์—ด์–ด๋ณด๋ฉด ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ ์ดˆ๊ธฐํ™”๋ฅผ ์œ„ํ•œ ๋“ฑ๋ก ํŒŒ์ผ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค!! ์ต์ˆ™ํ•œ ๊ทธ ๊ฒฝ๋กœ์˜ ํŒŒ์ผ์ด๋‹ค. 

๋“ค์–ด๊ฐ€๋ณด๋ฉด SpringServletContainerInitializer ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ ์ดˆ๊ธฐํ™” ํด๋ž˜์Šค๊ฐ€ ๋“ฑ๋ก๋˜์–ด ์žˆ๋Š”๋ฐ ์ด ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด 

@HandleTypes์œผ๋กœ WebApplicationInitailizer๊ฐ€ ๋“ฑ๋ก๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

์Šคํ”„๋ง์ด ์ด๋ ‡๊ฒŒ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ด์ฃผ๋ฉด ์šฐ๋ฆฌ๋Š” ์ด์ œ ์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ด์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค!! 

 

 

 

์Šคํ”„๋ง์ด๋ผ๊ณ  ๊ทธ๋ƒฅ ๋งˆ๋ฒ•์ฒ˜๋Ÿผ ์ง !ํ•˜๊ณ  ๊ธฐ๋Šฅ์ด ์ œ๊ณต๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ฏธ๋ฆฌ ์šฐ๋ฆฌ๊ฐ€ ์ €๋ฒˆ ๊ธ€์—์„œ ์ง์ ‘ ๋งŒ๋“ค์—ˆ๋˜ ์ฝ”๋“œ๋ฅผ ์ œ๊ณตํ•ด์ฃผ๋Š” ๊ฒƒ์ด๊ณ , 

์šฐ๋ฆฌ๋Š” ํŽธํ•˜๊ฒŒ ๊ทธ๊ฑธ ์‚ฌ์šฉ๋งŒ ํ•˜๋ฉด ๋˜๋Š” ๊ฒƒ์ด๋‹ค. 

์Šคํ”„๋ง MVC๊ฐ€ ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ ์ดˆ๊ธฐํ™” ํŒŒ์ผ์— ์ดˆ๊ธฐํ™” ํด๋ž˜์Šค๋ฅผ ๋“ฑ๋กํ•ด๋‘๊ณ , WebApplicationInitializer ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ดˆ๊ธฐํ™” ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ง€์ •ํ•ด๋‘๊ณ  ์ด๊ฒƒ์„ ์ƒ์„ฑํ•ด์„œ ์‹คํ–‰ํ•œ๋‹ค. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90