2023. 4. 18. 09:15ใ์ธํ๋ฐ/์คํ๋ง ๋ถํธ - ํต์ฌ ์๋ฆฌ์ ํ์ฉ
๋ถํธ ํด๋์ค๋ฅผ ๋ง๋ ๋ค๋ ๊ฒ์ ์ฆ, ์ง๊ธ๊น์ง ์งํํ๋ ๋ด์ฅ ํฐ์บฃ ์คํ, ์คํ๋ง ์ปจํ ์ด๋ ์์ฑ, ๋์คํจ์ฒ ์๋ธ๋ฆฟ ๋ฑ๋ก์ ๋ชจ๋ ๊ณผ์ ์ ํธ๋ฆฌํ๊ฒ ์ฒ๋ฆฌํด์ฃผ๋ ํด๋์ค๋ฅผ ๋ง๋ ๋ค๋ ๊ฒ์ด๋ค.
(๋ถํธ ๋ง๊ทธ๋๋ก ์์์ ํธ๋ฆฌํ๊ฒ ์ฒ๋ฆฌํด์ฃผ๋ ๊ฒ์ด๋ค.)
MySpringApplication
public class MySpringApplication
{
public static void run(Class configClass, String[] args)
{
System.out.println("MySpringApplication.run args = " + List.of(args));
// ํฐ์บฃ ์ค์
Tomcat tomcat = new Tomcat();
Connector connector = new Connector();
connector.setPort(8080);
tomcat.setConnector(connector);
// ์คํ๋ง ์ปจํ
์ด๋ ์ค์
AnnotationConfigWebApplicationContext appContext = new AnnotationConfigWebApplicationContext();
appContext.register(configClass);
// ์คํ๋ง MVC ๋์คํจ์ฒ ์๋ธ๋ฆฟ ์์ฑ, ์คํ๋ง ์ปจํ
์ด๋ ์ฐ๊ฒฐ
DispatcherServlet dispatcher = new DispatcherServlet(appContext);
// ๋์คํจ์ฒ ์๋ธ๋ฆฟ ๋ฑ๋ก
Context context = tomcat.addContext("", "/");
File docBaseFile = new File(context.getDocBase());
if (!docBaseFile.isAbsolute()) {
docBaseFile = new File(
((org.apache.catalina.Host) context.getParent()).getAppBaseFile(), docBaseFile.getPath());
}
docBaseFile.mkdirs();
tomcat.addServlet("", "dispatcher", dispatcher);
context.addServletMappingDecoded("/", "dispatcher");
try
{
tomcat.start();
}
catch (LifecycleException e)
{
throw new RuntimeException(e);
}
}
}
๊ธฐ์กด์ ๋ด์ฅ ํฐ์บฃ ์ค์ ํ๊ณ , ์คํ๋ง ์ปจํ ์ด๋ ์์ฑํด์ ์ด๋ฅผ ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ ๋ฑ๋กํ๊ณ ์ด๋ฌ๋ ์ฝ๋๋ฅผ ๋ชจ์์ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๋ MySpringApplication ํด๋์ค๋ฅผ ๋ง๋ค์๋ค.
๊ทธ ๋ค์ MySpringApplication.run(). ์ ์คํํ๋ฉด ๋ฐ๋ก ๋์ํ๋๋ก ์์ฑํ๋ค.
Class configClass
: ์คํ๋ง ์ค์ ์ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ๋๋ก ํ๋ค.
args
: main(args)๋ฅผ ์ ๋ฌ ๋ฐ์์ ์ฌ์ฉํ๋ ๊ฒ
tomcat.start
: ์ ๋ฒ์๋ ์์ธ๋ฅผ ๋์ก๋๋ฐ ์ด๋ฒ์๋ ์์ธ๋ฅผ catchํด์ runtimeException์ผ๋ก ๋ณ๊ฒฝํ๋ค.
@MySpringBootApplication
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@ComponentScan
public @interface MySpringBootApplication
{
}
์ด๋ ธํ ์ด์ ์ ํ๋ ๋ง๋ค์๊ณ ์ด ์ด๋ ธํ ์ด์ ์ ์ปดํฌ๋ํธ ์ค์บ ๊ธฐ๋ฅ์ ์ถ๊ฐํด๋๊ณ ์์ํ ๋ ์ด ์ด๋ ธํ ์ด์ ์ ๋ถ์ฌ์ ์ฌ์ฉํ๋ฉด ๋๋ค.
๊ทธ ๋ค์ ์ ๋ฒ์ ๋ง๋ค์๋ HelloConfig ํด๋์ค์ @Configuration์ด๋ ธํ ์ด์ ์ ์ฃผ์ ์ฒ๋ฆฌํด์ค๋ค.
MySpringBootMain
@MySpringBootApplication
public class MySpringBootMain
{
public static void main(String[] args)
{
System.out.println("MySpringBootMain.main");
MySpringApplication.run(MySpringBootMain.class, args);
}
}
์ด ํด๋์ค์ ํ์ผ ์์น๋ ์ค์ํ๋ฐ ๊ฐ์ฅ ์์ ํจํค์ง hello์ ์์นํ๋ค.
์ฌ๊ธฐ์ ์์นํด์ผ ํ๋ ์ด์ ๋ @MySpringBootApplication ์ ์ปดํฌ๋ํธ ์ค์บ์ด ์ถ๊ฐ๋์ด ์๋๋ฐ, ์ปดํฌ๋ํธ ์ค์บ์ ๊ธฐ๋ณธ ๋์์ ํด๋น ์ด๋ ธํ ์ด์ ์ด ๋ถ์ ํด๋์ค์ ํ์ฌ ํจํค์ง๋ถํฐ ๊ทธ ํ์ ํจํค์ง๋ฅผ ์ปดํฌ๋ํธ ์ค์บ์ ๋์์ผ๋ก ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ๋ผ์ hello ํ์ ํจํค์ง์ ์๋ HelloController๋ฅผ ์ปดํฌ๋ํธ ์ค์บํ๋ค.
๐ ์ด๋ ๊ฒ ๋ถํธ ํด๋์ค๋ฅผ ๋ง๋ค๋ฉด ๋ด์ฅ ํฐ์บฃ ์คํ, ์คํ๋ง ์ปจํ ์ด๋ ์์ฑ, ๋์คํจ์ฒ ์๋ธ๋ฆฟ, ์ปดํฌ๋ํธ ์ค์บ๊น์ง ๋ชจ๋ ๊ธฐ๋ฅ์ด ํ๋ฒ์ ํธ๋ฆฌํ๊ฒ ๋์ํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ด ๋ถํธ ํด๋์ค๋ ์ด๋์ ๋ง์ด ๋ณธ ๊ฒ ๊ฐ๋ค? ํ ์์๋๋ฐ ์ค์ ๋ก ์คํ๋ง ๋ถํธ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค๋ฉด ํญ์ ํฌํจ๋์ด ์๋ ๊ทธ ๋ฉ์ธ ๋ฉ์๋๊ฐ ์๋ ํด๋์ค์ด๋ค!!!
( ์ด๋ ธํ ์ด์ ์ ์ข ๋ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋์ด์์ ๊ฒ์ธ๋ฐ ๊ธฐ๋ณธ ๋์์ ์์ ๊ฐ๋ค.)