๐ŸƒSpring WAS

์Šคํ”„๋ง ๋ถ€ํŠธ ์ž์ฒด๋Š” WAS๊ฐ€ ์•„๋‹ˆ๋‹ค

2 minute read

๋‚ด์žฅ ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ

  • ์Šคํ”„๋ง ๋ถ€ํŠธ๋Š” Tomcat ์„œ๋ฒ„๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‚ด์žฅ๋˜์–ด ์žˆ๋‹ค.
  • Tomcat์€ ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๋กœ JSP, Servlet, Http ์š”์ฒญ๊ณผ ์‘๋‹ต ๋“ฑ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.

์ˆ˜๋™์œผ๋กœ Tomcat ์‹คํ–‰ํ•ด๋ณด๊ธฐ

@SpringBootApplication  
public class Application {  
  
    public static void main(String[] args) {  
        Tomcat tomcat = new Tomcat();  
        tomcat.setPort(8080);  
        Context context = tomcat.addContext("/", "/");  
  
        HttpServlet servlet = new HttpServlet() {  
            @Override  
            protected void doGet(HttpServletRequest req, HttpServletResponse resp) {  
                PrintWriter writer = resp.getWriter();  
                writer.println("<h1>Hello world!</h1>");  
            }  
        };  
  
        final String servletName = "myServlet";  
        tomcat.addServlet("/", servletName, servlet);  
        context.addServletMappingDecoded("/home", servletName);  
  
        try {  
            tomcat.start();  
            tomcat.getServer().await();  
        } catch (LifecycleException e) {  
            e.printStackTrace();  
        }  
    }  
}  

Auto Configuration์„ ์ด์šฉํ•œ ์Šคํ”„๋ง ๋ถ€ํŠธ์˜ Tomcat ์‹คํ–‰

  • ์œ„์™€ ๊ฐ™์€ ๊ณผ์ •์„ ์Šคํ”„๋ง ๋ถ€ํŠธ๋Š” ์ž๋™์œผ๋กœ ์ง„ํ–‰ํ•ด์ค€๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ๋‹ค๋ฅธ ํฌ์ŠคํŠธ๋กœ๋„ ์ •๋ฆฌํ•œ Auto Configuration์ด ์ด์šฉ๋œ๋‹ค.
  • ServletWebServerFactoryAutoConfiguration์˜ TomcatServletWebServerFactory์—์„œ ์œ„์˜ ์ˆ˜๋™ ์„ค์ •๊ณผ ๊ฐ™์€ ์ผ๋“ค์ด ์ผ์–ด๋‚˜๊ฒŒ ๋œ๋‹ค.
public WebServer getWebServer(ServletContextInitializer... initializers) {  
	Tomcat tomcat = new Tomcat();  
	File baseDir = this.baseDirectory != null ?  
		this.baseDirectory :   
		this.createTempDir("tomcat");  
	tomcat.setBaseDir(baseDir.getAbsolutePath());  
	Connector connector = new Connector(this.protocol);  
	tomcat.getService().addConnector(connector);  
	this.customizeConnector(connector);  
	tomcat.setConnector(connector);  
	tomcat.getHost().setAutoDeploy(false);  
	this.configureEngine(tomcat.getEngine());  
}  

๋‚ด์žฅ ์›น ์„œ๋ฒ„ ๋ณ€๊ฒฝ

  • jetty๋‚˜ undertow์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ์›น ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
  • ๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด์„œ๋Š” ์šฐ์„  Tomcat์— ๋Œ€ํ•œ ์˜์กด์„ฑ๋ถ€ํ„ฐ ์ œ์™ธํ•˜์—ฌ์•ผ ํ•œ๋‹ค.
<dependencies>  
    <dependency>  
        <groupId>org.springframework.boot</groupId>  
        <artifactId>spring-boot-starter-web</artifactId>  
        <exclusions>  
            <!-- Exclude the Tomcat dependency -->  
            <exclusion>  
                <groupId>org.springframework.boot</groupId>  
                <artifactId>spring-boot-starter-tomcat</artifactId>  
            </exclusion>  
        </exclusions>  
    </dependency>  
    <!-- Use Jetty instead -->  
    <dependency>  
        <groupId>org.springframework.boot</groupId>  
        <artifactId>spring-boot-starter-jetty</artifactId>  
    </dependency>  
</dependencies>  

ํฌํŠธ ๋ณ€๊ฒฝ

  • resources/application.properties ํ˜น์€ application.yml์—์„œ ์„ค์ •์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.
  • 0์œผ๋กœ ์„ค์ •์‹œ Random ํฌํŠธ๊ฐ€ ์ง€์ •๋œ๋‹ค. ์„œ๋ฒ„ ์ธ์Šคํ„ด์Šค๋ฅผ ๋™์ ์œผ๋กœ ์—ฌ๋Ÿฌ ๊ฐœ ๋„์šธ๋•Œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
server.port=8443  
  • ์Šคํ”„๋ง ๋ถ€ํŠธ์˜ ๊ธฐ๋™์‹œ ๋กœ๊ทธ๋ฅผ ํ†ตํ•ด์„œ๋„ ํฌํŠธ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ํ™•์ธ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ApplicationListener์˜ onApplicationEvent ๋ฉ”์†Œ๋“œ๋Š” Application์ด ์ƒ์„ฑ๋˜๋ฉด ํ˜ธ์ถœ๋˜๋Š” Callback method์ด๋‹ค.
// ApplicationListener๋Š” ๋‹น์—ฐํ•˜์ง€๋งŒ Bean์ด์–ด์•ผ ํ˜ธ์ถœ๋œ๋‹ค.  
@Component  
public class PortListener implements ApplicationListener<ServletWebServerInitializedEvent> {  
	@Override  
	public void onApplicationEvent(ServletWebServerInitializedEvent servletWebServerInitializedEvent) {  
		WebServer webServer = servletWebServerInitializedEvent.getApplicationContext().getWebServer();  
		System.out.println("port: " + webServer.getPort());  
	}  
}  

HTTPS ์„œ๋ฒ„ ๊ธฐ๋™

  • HTTPS๋Š” ์•Œ๋‹ค์‹œํ”ผ ๋น„๋Œ€์นญํ‚ค๋ฅผ ์ด์šฉํ•œ ๋ณด์•ˆ ํ”„๋กœํ† ์ฝœ์ด๋‹ค. ๋จผ์ € ํ‚ค๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค.
keytool -genkey -alias { ๋ณ„๋ช… } -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 4000  

์Šคํ”„๋ง ๋ถ€ํŠธ์— HTTPS ์„ค์ •ํ•˜๊ธฐ

  • application.properties ํ˜น์€ application.yml ํŒŒ์ผ์— ์•„๋ž˜์™€ ๊ฐ™์ด ์„ค์ •ํ•œ๋‹ค.
server.ssl.key-store=keystore.p12  
server.ssl.key-store-password={ ํ‚ค ์ƒ์„ฑ์‹œ ์„ค์ •ํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ }  
server.ssl.key-store-type=PKCS12  
server.ssl.key-alias={ ํ‚ค ์ƒ์„ฑ์‹œ ์„ค์ •ํ•œ ๋ณ„๋ช… }  
  • ์ด๋ ‡๊ฒŒ ์„ค์ •์‹œ HTTPS(443 ํฌํŠธ)๋กœ ์ ‘์†ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฌผ๋ก  ๊ณต์ธ์ธ์ฆ์„œ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ํฌ๋กฌ ๋“ฑ์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๊ธด ํ•  ๊ฒƒ์ด๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ๊ธฐ์กด์˜ HTTP(80 ํฌํŠธ)๋Š” ์ ‘์†์ด ๋˜์ง€ ์•Š๋Š”๋‹ค. ํ•„์š”ํ•˜๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด Connector๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ํ•ด๊ฒฐ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
@SpringBootApplication  
public class Application {  
	@Bean  
	public ServletWebServerFactory servletContainer() {  
		TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();  
		tomcat.addAdditionalTomcatConnectors(createStandardConnector());  
		return tomcat;  
	}  
  
	private Connector createStandardConnector() {  
		Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");  
		connector.setPort(8080);	// HTTPS์šฉ ํฌํŠธ์™€ ๋‹ค๋ฅด๊ฒŒ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.  
		return connector;  
	}  
  
	public static void main(String[] args) {  
		// SpringApplication.run(Application.class, args);  
		new SpringApplicationBuilder()		// ์‚ฌ์กฑ์œผ๋กœ ๋นŒ๋” ํŒจํ„ด์„ ์ด์šฉํ•ด ์Šคํ”„๋ง ๊ธฐ๋™๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.  
			.sources(Application.class)  
			.bannerMode(Banner.Mode.OFF)	// ์‹œ์ž‘์‹œ ์ถœ๋ ฅ๋˜๋Š” ๋ฐฐ๋„ˆ๋„ ๋Œ ์ˆ˜ ์žˆ๋‹ค.  
			.run(args);  
	}  
}  
  • ServletWebServerFactoryAutoConfiguration์—์„œ๋„ ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ์‚ดํŽด๋ณด๋ฉด Connector๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

HTTP/2 ํ™œ์„ฑํ™”

  • application.properties์— server.http2.enabled=true๋กœ ์„ค์ •ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.
  • ๋ฌผ๋ก  ์ „์ œ๋กœ HTTPS๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.

[1] ๋ฐฑ๊ธฐ์„ , ์Šคํ”„๋ง ๋ถ€ํŠธ ๊ฐœ๋…๊ณผ ํ™œ์šฉ, 3๋ถ€ ์Šคํ”„๋ง ๋ถ€ํŠธ ์›๋ฆฌ