욱'S 노트

내장 톰캣(Embedded Tomcat) 설정 및 실행 하기 본문

Programming/Tomcat

내장 톰캣(Embedded Tomcat) 설정 및 실행 하기

devsun 2025. 1. 2. 10:13
반응형

개요

Tomcat 내부 동작을 디버깅 하기 위해서 Embedded Tomcat을 이용한 내용을 정리해보록 하겠다. 기존 톰캣 서버를 설치하고, Servlet등의 테스트를 한다면 Servlet에서 디버깅 브레이크 포인트를 잡고, 스택 트레이스를 확인 할 수는 있지만 실제 톰캣이 사용하는 라이브러리등은 직접 접근하기는 어렵다. 더욱 세밀한 디버깅을 위해 Embbeded Tomcat을 활용하는 방법을 알아보자. 기존 외부 톰캣을 활용하는 방식은 아래 글을 참고하자.

 

https://opennote46.tistory.com/257

 

IntelliJ Tomcat 기반 서블릿 테스트

개요Servlet 3.1을 구동원리를 파악해보기 위한 사전 작업 설정에 대한 포스팅이다. 항상 스프링 스타터 혹은 고수준의 프레임워크를 경험하다보니 의외로 세팅에 삽질을 하게 되어서 간단하게 서

opennote46.tistory.com

 

https://opennote46.tistory.com/258

 

Tomcat Servlet 3.1 예제 및 동작구조

개요어제는 일단 인텔리J기반에서 서블릿을 실행해보았다. 애초에 목적이 Servlet 3.1이 어떻게 동작하는지 알아보기 위함이므로 아주 간단한 Servlet 3.1 예제를 작성해보자. https://opennote46.tistory.com

opennote46.tistory.com

 

프로젝트 구성

인텔리J에서 kotlin과 gradle에 익숙하므로 기본 프로젝트를 생성한다.

 

build.gradle.kts 파일에 가서 임베디드 톰캣 디펜던시를 추가한다.

dependencies {
    implementation("org.apache.tomcat.embed:tomcat-embed-core:10.1.34") // Add this line
    testImplementation(kotlin("test"))
}

 

톰캣 설정 및 구동

Main.kt에 아래와 같은 코드를 작성해보자. 톰캣 서버를 하나 생성하고 간단하게 포트, 호스트명, appBase를 세팅한다. appBase를 현재 디렉토리로 세팅한다. 그리고 docBase 즉 웹어플리케이션의 컨텍스트 루트 디렉토리를 세팅한다. 마지막으로 톰캣 서버를 구동하면 된다.

import org.apache.catalina.startup.Tomcat
import java.io.File


fun main() {
    val tomcat = Tomcat()

    tomcat.setPort(8080)
    tomcat.setHostname("localhost")
    tomcat.host.appBase = "."

    val docBase = File(System.getProperty("java.io.tmpdir"))
    val context = tomcat.addContext("", docBase.absolutePath)

    tomcat.start()
    tomcat.server.await();
}

 

이제 Main.Kt를 실행시키고, localhost:8080으로 접속을 해보자. 정상적으로 구동되었지만 해당 요청을 처리할 웰컴 파일이나 서블릿이 없으므로 404가 발생한다.

서블릿 추가

인텔리J webapp 샘플 서블릿을 하나 작성해보자.

import jakarta.servlet.http.*;
import jakarta.servlet.annotation.*;

@WebServlet("/hello")
class HelloServlet : HttpServlet() {
    private lateinit var message: String

    override fun init() {
        message = "Hello World!"
    }

    public override fun doGet(request: HttpServletRequest, response: HttpServletResponse) {
        response.contentType = "text/html"

        // Hello
        val out = response.writer
        out.println("<html><body>")
        out.println("<h1>$message</h1>")
        out.println("</body></html>")
    }

    override fun destroy() {
    }
}

 

서블릿을 추가하고, tomcat.service에 커넥터를 추가하자.

import org.apache.catalina.startup.Tomcat
import java.io.File


fun main() {
    val tomcat = Tomcat()

    tomcat.setPort(8080)
    tomcat.setHostname("localhost")
    tomcat.host.appBase = "."
    
    // 서블릿 추가
    val docBase = File(System.getProperty("java.io.tmpdir"))
    val context = tomcat.addContext("", docBase.absolutePath)

    tomcat.addServlet("", "hello", HelloServlet())
    context.addServletMappingDecoded("/hello", "hello")

    tomcat.start()
    // 커넥터 추가
    tomcat.service.addConnector(tomcat.connector)
    tomcat.server.await();
}

 

톰캣을 재구동하고 http://localhost:8080/hello로 접속하면 다음과 같은 화면을 나타날 것이다.

결론

아주 간단하게 임베디드 톰캣을 Programmatically라게 구동하고, 서블릿을 설정해보았다. 사실 실제 개발시에는 다음과 같이 코드 레벨에서 톰캣을 구동할 일은 없을 것이다. 그러나 톰캣의 동작 구조에 대해서 학습할 때 위와 같은 방식으로 하면 더욱 편하게 디버깅을 진행할 수 있을 것이다.

반응형