2023. 4. 11. 09:07ใ์ธํ๋ฐ/์คํ๋ง ๋ถํธ - ํต์ฌ ์๋ฆฌ์ ํ์ฉ
์๋ธ๋ฆฟ ์ปจํ ์ด๋ ์ด๊ธฐํ๋? (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 ์ฌ๊ธฐ์ ํด๋น ์ฝ๋๋ฅผ ์ง์ ์ง์ ํด์ค์ผ ํ๋๋ฐ,
์ ํ๋ฆฌ์ผ์ด์ ์ด๊ธฐํ๋ ๊ทธ๋ฅ ํน์ ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค๊ณ ๊ทธ๋ฅ ๊ตฌํํ๋ฉด ๋๋ค.
- ์์กด์ฑ
์ ํ๋ฆฌ์ผ์ด์ ์ด๊ธฐํ๋ ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ์๊ด์์ด ์ํ๋ ๋ชจ์์ผ๋ก ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค ์ ์์ด์ ์ ํ๋ฆฌ์ผ์ด์ ์ด๊ธฐํ ์ฝ๋๊ฐ ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ๋ํ ์์กด์ ์ค์ผ ์ ์๋ค.
'์ธํ๋ฐ > ์คํ๋ง ๋ถํธ - ํต์ฌ ์๋ฆฌ์ ํ์ฉ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์คํ๋ง MVC ์๋ธ๋ฆฟ ์ปจํ ์ด๋ ์ด๊ธฐํ WebApplicationInitalizer (0) | 2023.04.13 |
---|---|
์คํ๋ง ์ปจํ ์ด๋ ๋ฑ๋ก (0) | 2023.04.13 |
์๋ธ๋ฆฟ ์ปจํ ์ด๋ ์ด๊ธฐํ๋? (0) | 2023.04.10 |
IntelliJ์์ ํฐ์บฃ ์ค์ ํ๋ ๋ฐฉ๋ฒ (0) | 2023.04.10 |
Jar ์ War ์ฐจ์ด์ ์ ? War ํ์ผ ๋ฐฐํฌํ๋ ๋ฐฉ๋ฒ (0) | 2023.04.07 |