# 개요

내장 톰캣만 쓰다가 외장 톰캣 설치해서 연동해보았는데 생각보다 삽질을 많이했다.

삽질한 과정 정리

 


 

# 톰캣 설치

 !! 중요: 설치할 때 버전 확인을 잘 해야한다. 버전에 따라 Servlet, JSTL, EL, JDK 버전이 다르기 때문에 내가 어떤 버전의 톰캣을 사용할 지 알고있어야 한다. ("Which version?"에 나와있다.)

나는 Tomcat 9를 사용했다.

  • Tomcat 10 부터는 Java EE가 아닌 Jakarta EE 패키지를 사용하기 때문에 이식성이 높지 않다고 생각했다.
  • 물론 Migration Tool이 있다고는 하지만 Migration Tool 관련 문서를 참고할 시간에 그냥 Tomcat 9 쓰는게 낫다고 판단했다.

설치 과정은 그냥 zip 파일 다운 받아서 압축 해제 하면 된다.

 


 

# intelliJ 프로젝트 생성

intelliJ 버전: 2020.03.1

## File → new → project → Java Enterprise

  • Project template는 Web application, REST service, Library가 있는데 Web application을 선택, 다른 template은 사용해보지 않았다.
  • Application Server는 설치한 Tomcat의 경로로 설정해주면 된다.
  • Build tool은 더 익숙하기도 하고 편하기도 한 Gradle 선택

 

## Java EE (Jakarta EE), Libraries and Framework

Tomcat 9를 사용하기 때문에 Jakarta EE가 아닌 Java EE를 선택했고, 간단하게 톰캣 연동과 마이바티스만 추가할 것 이기 때문에 별도의 라이브러리나 프레임워크는 선택하지 않았다. (Servlet은 기본 선택인듯 하다)

이후 Name, Group, Location 등 설정 후 Finish

 


 

# Tomcat 설정

프로젝트 빌드가 성공적으로 된다면 build.gradle, Servlet, jsp 파일이 생성되어 있을 것이다.

나는 이전에 톰캣 Configuration을 추가해서 저렇게 있지만 없다면 직접 추가하면 된다.

Edit configurations 선택

 

## 톰캣 Run/Debug Configuration 추가, 설정

Tomcat Server → Local 선택

처음 선택하면 아래쪽에 "Warning: No artifacts marked for deplyment"가 있다. artifact를 추가해주기 위해 Deployment 탭으로 이동한다.

Artifact 선택

war 와 war (exploded)가 있다.

war (Archive)

  • 아카이브(.war, .ear) 파일로 배포
  • WAS(Tomcat)에 의해 압축이 풀린다.
  • 파일이 많은 경우 압축을 푸는 시간이 오래 걸릴 수 있다.
  • 원격 서버에 배포시 하나의 파일만 전송하면 된다.
  • WAS에서 제공하는 업로드를 통한 배포가 가능하다.

exploded (Expended)

  • 아카이브를 압축 해제한 형태의 디렉토리로 배포
  • 별도의 디렉토리에 원본 소스를 복사하여 만든다. 
  • 압축 및 해제 과정이 불필요하다.
  • 원본 소스를 건드리지 않고 배포하는 경우에 적합하다.

나는 exploded를 선택했다.

Application context가 길게 쓰여있는데 그대로 사용해도 되지만 나는 / (root)로 변경 후 설정 완료했다.

 


 

# 서버 실행

이제 서버를 실행 해보자

실행해보면 로그가 쭉 뜨다가 완료되었다고 뜬다.

근데 이상하다. 보통 다른 블로그 참조했을 때는 실행이 완료되었다고 뜨면서 자동으로 브라우저가 실행되던데.. 브라우저가 실행되지도 않고 밑의 창을 자세히 보면 주황색 X 아이콘이 보이고 로그도 not found for the web module이라고 뜬다. 뭔가 잘못 된 것 같다.

localhost:8080으로 접속해봐도 index.jsp가 나오지 않고 404페이지가 나온다.

 


 

# Artifact를 다시 한 번 보자

연필모양 눌러보면 artifacts settings 창이 나온다

저 경로를 자세히 보면 project/build/libs/exploded/project~~~.war로 되어있다. 

근데 실제 경로를 확인해보면 libs디렉토리 내에 exploded라는 디렉토리는 없고 바로 project~~~.war만 있다. 그러므로 libs뒤에 있는 exploded를 지워준다.

 


 

# 수정 후 서버 다시 실행

not found the web module이라는 로그도 안보이고, 브라우저도 자동으로 실행된다.

 


 

# Artifact를 exploded로 선택한 이유

exploded가 아니라 war를 선택한다면 위 설정(경로에 exploded 빼는 것)할 필요없이 잘 된다. 근데 exploded를 선택한 이유는

바로 요놈 때문이다. 

자바 코드가 변경되면 (클래스, 패키지,  라이브러리 등) 서버를 재시작 해야한다.

이것은 내장톰캣 쓸때도 마찬가지였기 때문에 상관 없는데

문제는 resource(html, jsp, css 등)도 바로 적용이 안된다는 것이다. 내장 톰캣 쓸 때는 바로 적용이 되었는데.. 외장 톰캣을 쓰니 바로 적용이 안되어서 매우 불편했다.

찾아보니 exploded로 deployment 설정을 해야 저 on update → update classes and resources가 생긴다고 하더라.

그래서 exploded를 사용했다.

 


 

# 후기(?)

그냥 내장 톰캣 쓰는게 나을 것 같다 ㅋㅋ;; 어짜피 스프링부트도 내장 톰캣 사용하는데.. 스프링은 아닌가?

 


 

# Reference

 

IntelliJ + Apache tomcat 연동 및 설정

IntelliJ(인텔리제이) 다운로드 링크https://www.jetbrains.com/ko-kr/idea/download/?section=windowsApache tomcat(아파치 톰캣) 다운로드 링크 zip 파일로 다운https://tomcat.

velog.io

 

 

금주의 실패사례 - IntelliJ 버전 업 후 Tomcat에서 exploded artifact 실종 « Personal Tech Note

IntelliJ에서 exploded된 artifact를 못찾는 문제 무슨 바람이 불었을까? 한참 잘 쓰던 IntelliJ를 2020.1.1로 업그레이드 했다. 이것 저것 좀 더 좋아지려나 했더니, 왠걸.. 잘되던 Tomcat 실행만 안된다. 잘 되

mystria.github.io

 

[Intellij] 웹 어플리케이션 배포 위한 패키지 유형과 war, war(exploaed) 차이

tomcat 으로 war 파일을 배포할 때 궁금증이 생겼다. war와 war(exploaed)의 차이가 무엇일까? 빌드(Build) : 소스코드 파일을 실행 가능한 소프트웨어 산출물로 만드는 일련의 과정을 말한다. Maven에서 Arti

velog.io

'Java > Tomcat' 카테고리의 다른 글

[Tomcat] JSTL 라이브러리 추가 (부제: Tomcat 9 vs 10)  (0) 2024.04.04

# 개요

톰캣을 설치해서 사용할 때는 바로 jsp 파일을 읽을 수 있었는데

내장 톰캣을 사용하니 jsp 파일을 읽을 수가 없다.

JSP를 서블릿으로 변환시켜주는 Jasper에 대해 알아보자.

 


 

# JSP에 대한 오해

JSP가 여러모로 불편하기 때문에 안써왔어서(물론 앞으로도 쓸 생각은 별로 없음..) 잘 몰랐는데, 나는 여태 JSP가 HTML처럼 그냥 화면에 보여주는 줄 알았다.

그런데 그게 아니고, JSP 파일을 컴파일 해서 PrintWriter같은 클래스를 이용해서 HTML처럼 보이게 출력해주는 것이었다.

 

## 자바로 HTML 그리기

기존에 자바로 HTML을 그릴 때 방식을 보면

import java.io.*;

public class HTMLPrinter {
    public static void main(String[] args) {
        String fileName = "output.html"; // HTML 파일명

        try {
            PrintWriter writer = new PrintWriter(new FileWriter(fileName));

            // HTML 페이지 시작
            writer.println("<!DOCTYPE html>");
            writer.println("<html>");
            writer.println("<head>");
            writer.println("<title>간단한 HTML 페이지</title>");
            writer.println("</head>");
            writer.println("<body>");
            writer.println("<h1>Hello, World!</h1>");
            writer.println("<p>This is a simple HTML page generated using Java.</p>");
            writer.println("</body>");
            writer.println("</html>");

            // 파일 닫기
            writer.close();

            System.out.println("HTML 파일이 생성되었습니다. 파일명: " + fileName);
        } catch (IOException e) {
            System.out.println("파일 생성 중 오류가 발생했습니다: " + e.getMessage());
        }
    }
}

이런 방식으로 일일이 자바 코드 내에서 HTML태그를 사용해야 했었다. 그리고  HTML태그 String에 자바에서 사용하는 변수나 객체를 추가하는 방식으로 사용했다.

하지만 이런 방식은 매우 번거롭고 불편하다.

 

## HTML to JSP

정적 페이지인 HTML에 자바 데이터를 동적으로 사용하기 위해 JSP가 만들어졌다. 사용 방법도 html 확장자를 jsp로 바꿔 주고 스크립트릿만 추가해주면 된다.

그러나 JSP는 자바코드에 의한 동적인 페이지가 되었기 때문에 이를 컴파일을 해주어야 한다.

 


 

# Jasper

Jasper는 JSP파일을 서블릿 코드로 변환하고 컴파일 하여 HTML 파일처럼 실행하는 톰캣의 JSP 엔진이다.

JSP파일이 그냥 화면에 HTML처럼 보여지는 것이 아니라 톰캣의 Jasper를 통해 서블릿 코드로 변환하고 이를 HTML로 그려주는 것이다.

 


 

# 결론

톰캣을 설치하면 Jasper가 같이 설치되어 있기 때문에 별 신경쓰지 않고 바로 JSP를 읽을 수 있지만, Embedded Tomcat의 경우는 그렇지 않기 때문에 라이브러리를 따로 추가해야 한다.

 


 

# Reference

 

JSP를 서블릿으로 변환시켜주는 Jasper

JSP(Java Server Pages)는 HTML에 Java코드를 편리하게 적을 수 있도록 도와줍니다. 그런데 HTML에 Java코드를 적다 보니 많은 분들께서 오해하는 것이 있습니다. 바로 브라우저의 화면에 띄워지는 것이 JSP

thisisnew-storage.tistory.com

 

'Java > Java' 카테고리의 다른 글

[Java] Map 사용법(1) - Map 정렬  (0) 2020.11.17
[Java] Time 패키지 (LocalTime, LocalDate, LocalDateTime)  (0) 2020.11.12
[Java] Date, Calendar 클래스  (0) 2020.10.31

# 개요

학원 다니면서 개인 프로젝트로 플래너 개발을 해보기로 했다.

처음에는 학원에서 배운 내용 + 내가 알고 있었는데 잊었던 것들 + 이번 개인 프로젝트로 새로 배우고 싶었던 것들 세 가지를 적절히 섞어 구현할 예정이다.

기존 직접 구현한 웹 서버를 Tomcat을 추가하고 Servlet을 추가했다.

 


 

# Embedded Tomcat 추가

책을 참고하며 Embedded Tomcat 라이브러리를 추가하고 직접 구현한 WebServer를 Tomcat Server를 실행하는 것으로 대체 했다.

Tomcat에 추가하는 Context는 주로 웹 어플리케이션의 설정과 속성을 정의하는데 사용한다.

addContext()로 브라우저를 통해 "localhost:8080/"로 요청을 보내면 WEB_APP_DIR_LOCATION 디렉토리에 있는 html 파일에 접근할 수 있도록 설정했다.

WebResourceRoot를 이용하여 Gradle 빌드 시 생성되는 클래스 파일 경로인 build/classes를 읽도록 설정했다.

 

Use Tomcat instead of WebServer · JinHoooooou/MiniTimer@4e3b3f1

JinHoooooou committed Feb 14, 2024

github.com

 


 

# Servlet 추가

Plan에 대한 create 기능 Servlet을 추가했다.

Create

 

add Servlet · JinHoooooou/MiniTimer@e424d2e

JinHoooooou committed Feb 14, 2024

github.com

 

 

 


 

# Chat GPT 질문

Embedded Tomcat을 사용하는 과정에서 계속 오류가 발생했는데 누군가에게 질문하기 애매한 내용이었다. 계속 구글링 해 봐도 내가 원하는 답이 나오지 않아서 고민하다가 Chat GPT를 이용해 봤는데 굉장히 잘 알려줘서 깜짝 놀랐다.

좀 이상하게 알려주는 경우도 가끔 있긴 한데.. 질문 내용을 조금 수정해서 다시 물어보거나 하면 잘 알려주는 것 같다.  

https://chat.openai.com/share/648da557-d0fa-4025-a88b-6d7c366e330a

위 링크는 내가 질문 하면서 해결 한 후에 해결한 내용을 기반으로 다시 질문한 내용이다. 실제로 질문할때는 더 많이 물어보고 삽질도 많이 했다

 


 

# 간단 회고

이 작업을 할 때 쯤부터 블로그에 개발 일지를 작성하기 시작했는데, 그 때 작성한 일지 보면 회고에 커밋 메시지 관련 얘기가 많이 있다. 그 때와 비교해보면 지금은 그래도 커밋 단위가 좀 작게 쪼개져 있긴하다. 그리고 한글도 그냥 사용하기로 했다 ㅋㅋ..

Embedded Tomcat 사용하려고 할 때 삽질을 엄청 많이하기도 했고, 예제 코드, 블로그, 책 등을 참고했었는데.. 문득 그냥 Spring boot 쓸까? 라는 생각을 많이 했다. 사실 Jdbc사용할 때도 메서드마다 SQL 작성하는점, 필드 추가/삭제에 유연하지 못한 점 때문에 그냥 JPA 쓸까? 라고 생각했었다.

그럼에도 불구하고 low level부터 이해하자라는 생각을 가지고 계속 삽질했다. 거기에 동반해야할 점은 코드 라인들이 무슨 일을 하는지 이해하는게 중요하다고 생각했다. Embedded Tomcat에 Context 추가하고 Class 디렉토리 설정하는 작업들은 처음에 그냥 예제 코드 복붙해서 사용했는데, 이해를 확실하게 하고 가기 위해 Chat GPT에게 이것 저것 계속 물어봤고 지금은 이해가 된다!

+ Recent posts