일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Hbase
- Spring Batch
- Java
- scala
- 스프링 배치
- 제주
- nginx
- docker
- DDD
- apache storm
- Angular2
- hdfs
- hadoop
- 도메인주도설계
- elasticsearch
- 엘라스틱서치
- SBT
- Storm
- Spring XD
- Linux
- Gradle
- spark
- Spring
- intellij
- elastic search
- hibernate
- design pattern
- 인텔리J
- Spring Boot
- Clean Code
- Today
- Total
욱'S 노트
내장 톰캣(Embedded Tomcat) 설정 및 실행 하기 본문
개요
Tomcat 내부 동작을 디버깅 하기 위해서 Embedded Tomcat을 이용한 내용을 정리해보록 하겠다. 기존 톰캣 서버를 설치하고, Servlet등의 테스트를 한다면 Servlet에서 디버깅 브레이크 포인트를 잡고, 스택 트레이스를 확인 할 수는 있지만 실제 톰캣이 사용하는 라이브러리등은 직접 접근하기는 어렵다. 더욱 세밀한 디버깅을 위해 Embbeded Tomcat을 활용하는 방법을 알아보자. 기존 외부 톰캣을 활용하는 방식은 아래 글을 참고하자.
https://opennote46.tistory.com/257
https://opennote46.tistory.com/258
프로젝트 구성
인텔리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라게 구동하고, 서블릿을 설정해보았다. 사실 실제 개발시에는 다음과 같이 코드 레벨에서 톰캣을 구동할 일은 없을 것이다. 그러나 톰캣의 동작 구조에 대해서 학습할 때 위와 같은 방식으로 하면 더욱 편하게 디버깅을 진행할 수 있을 것이다.
'Programming > Tomcat' 카테고리의 다른 글
Tomcat Servlet 3.1 예제 및 동작구조 (0) | 2024.12.31 |
---|---|
IntelliJ Tomcat 기반 서블릿 테스트 (0) | 2024.12.30 |
Tomcat - 시작 속도 빠르게 하기 (0) | 2015.08.06 |