본문 바로가기
JAVA

Create Java Servlet Project with Gradle using Intellij Community

by JINContainer 2023. 4. 10.

Intellij Community로 Java 11을 사용하여 Servlet 2.5를 하나부터 끝까지 만들어 보는 과정이 담긴 글.


Intellij Community와 함께 여러 교육기관에서 Java Spring과 Boot의 사용법을 배웠다.

각 기관에서는 완성된 템플릿을 압축파일로 주고 받아서 사용해 왔었다.

그러다 어느 순간 직접 만들어 보자고 생각이 들었다.

이왕 하는거 단순 Servlet부터 Web Servlet을 만들어 보고, DB와 연동까지 해보고 싶었다.

각 교육기관에서는 어노테이션의 남발로 무척 편하게 그냥 기능만 구현하고 넘어갔던 것들을 내부 구조가 어떻게 이뤄지고, 그냥 달달 외웠던 생명주기를 직접 확인해 보자고 생각했다.

 

하지만 어느 블로그를 찾아 봐도, 해외 포럼 등을 확인해 봐도 Community 버전으로 하나하나 설명해 주는 글은 없었다.

겨우 찾았다 해도 알고보니 유료버전인 경우가 태반이었다!(내가 검색 능력이 딸려서 못찾은 것에 대한 핑계다)

 

그렇게 Community버전으로 만들 수는 없나.. 하고 포기하려던 순간 9년 전에 어느 외국인 교수가 올린 유튜브 영상을 보게 되었고, 내용은 Eclipse로 템플릿 사용 없이 하나하나 차근히 만들어 주는 과정이 담겨 있었다. 아쉽게도 Gradle이 아닌 Maven을 사용했고 당시 기술의 한계인지, 아니면 이 후의 강의내용과 연관이 있는지는 모르지만 수많은 의존성을 미리미리 주입해 두어서 뭐가 필요한지는 골라낼 필요가 있었다.

 

이러한 일련의 과정을 겪고 완성한 인텔리제이 무료버전으로 서블릿의 간단한 예제 만들기를 나중에 까먹어도 볼 수 있도록 여기에 남겨두려 한다.

그리고 몇 명이 볼지는 모르지만 인텔리제이 무료버전으로 공부 중인 당신을 위한 글이기도 하다.


1-1. 새 프로젝트 생성

 

진짜 치사하게 무료버전은 Gradle의 템플릿이 없다.

Maven 원형이 있어서 maven으로 만들면 더 편하지만 나는 Gradle로 만들고 싶다고!

하지만 새 프로젝트 선택란에 보면 gradle이 있어서 하나부터 직접 쌓아 만들 수는 있다.

 

  • 이름 : 임의 지정(나는 java-servlet)
  • 위치 : 나는 기본값
  • 언어 : Java 선택
  • 시스템 빌드 : Gradle 선택
  • JDK : 내 프로그램에 있는 것 중 선택(나는 17, 11있는데 11 했음)
  • Fradle DSL : 아직 건드려 본적이 없어서 모름. 그냥 기본 Groovy.
  • 샘플 코드 추가 : 체크 해제. 선택해도 상관은 없음.
  • 고급 설정
    • 그룹ID : 임의 지정(나는 그림처럼 함)
    • 아티팩트ID : 이름이랑 똑같이 알아서 작성 됨.

새 프로젝트 생성 화면

 

1-2. 생성된 프로젝트 확인

생성된 새 프로젝트


2-1. Servlet 생성!

  • src/main/java 경로에 자신만의 패키지 생성(나는 com 만들고 그 안에 jin 만들고 그 안에 container 패키지 만듦)
  • Servlet으로 사용 할 .java파일 생성(내 Servlet자바파일 이름은 TestServlet)
  • Servlet기능을 쓸 수 있도록 HttpServlet을 extends 해준다.
  • 하지만 Gradle에서 해당 라이브러리를 가져오지 않았기에 에러가 뜬다.

src.main.java.(임의지정).TestServlet.java 생성 화면

 

2-2. Gradle에 라이브러리 추가하기.(종속성 주입, dependency inject 라고도 하던데 맞나?)

  • build.gradle에 가서 그림과 같이 한 줄 추가해 주고 오른쪽 상단 코끼리 눌러서 라이브러리 받아오기!
  • 주의할 점으로는 너무 높은 최신 버전으로 하면 나중에 Servlet2.5 버전과 호환이 안돼니까 조심하자.
implementation group:'javax.servlet', name:'javax.servlet-api', version:'3.1.0'

javax.servlet-api 의존성 주입 화면

 

2-3. import 해주기

javax.servlet-api 라이브러리 적용 화면


3. Servlet의 생명주기를 확인하기 위해 기능들을 Override 해서 준비하기.

  • TestServlet클래스 안에 마우스커서를 옮겨두고 Ctrl + O 단축키!(mac은 모름)
  • doGet, doPost service(두 개있으니 햇갈리지 않게 조심), destroy, init 선택하고 확인!

Servlet 기능 Override 선택 화면
생성된 Override 들

 

이제 Servlet은 잠깐 놔두고, 이 Servlet과 데이터를 주고받을 간단한 View 페이지를 만들고 다시 오자!


4-1. Servlet과 데이터를 주고 받을 index.jsp 파일이 있을 webapp 만들기!

  • src/main 에다가 webapp파일을 만들어 준다.

webapp 생성 경로
webapp 생성
생성된 webapp

 

4-2. index.jsp 생성!

  • src/main/webapp 에다가 index.jsp를 생성한다.
  • 파일 이름이 꼭 index일 필요는 없다. 그냥 난 index를 여기저기 블로그를 참고하며 봐서 그런지 손에 익어버렸다..

src/main/webapp에 파일 생성!
(fileName).jsp 생성!
생성된 index.jsp파일과 빈 내용물 확인!

 

4-3. index.jsp 내용 넣기!

  • form에 있는 action은 url이 될 것이다. 따로 설정 없으면 프로젝트 명이 처음에 올 터이니 프로젝트 이름을 넣어주자.
  • 나는 java-servlet이 프로젝트 이름이고 만들다가 잠깐 둔 TestServlet.java를 test로 매핑할 예정이다.
  • 그래서 /java-servlet/test 라고 넣어 줬다. 아직 매핑은 하지 않았으니 걱정하지 말자.
  • 그리고 method방식을 get과 post인 두 개 만든건 doGet과 doPost를 확인 하기 위해 서다.
  • input에 입력해서 보낼 데이터의 이름을 Serlvet에서는 NAME으로 받기 위해 name="NAME"으로 해줬다.
  • 이제 곧 작성 할 TestServlet.java에서 저기에 입력한 내용을 NAME으로 받을 것이다.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
    <title>서블릿 테스트</title>
</head>
<body>
    <h1>Servlet Test</h1>
    <div>
        <form action="/java-servlet/test" method="get">
            GET 이름 : <input type="text" name="NAME"/>
            <input type="submit" value="확인"/>
        </form>
    </div>
    <div>
        <form action="/java-servlet/test" method="post">
            POST 이름 : <input type="text" name="NAME"/>
            <input type="submit" value="확인"/>
        </form>
    </div>
</body>
</html>

index.jsp 내용


5. TestServlet.java 작성하기.

  • doGet작성
//super.doGet(req, resp);
System.out.println("doGet TestServlet");

String param = req.getParameter("NAME");

PrintWriter out = resp.getWriter();
out.println("<html><body>");
out.println("<h1>" + param + "</h1>");
out.println("<div><form action=\"/java-servlet\" method=\"get\"><input type=\"submit\" value=\"뒤로\"/></form></div>");
out.println("</body></html>");

out.flush();
out.close();

doGet 작성

 

  • doPost 작성
//super.doPost(req, resp);
System.out.println("doPost TestServlet");

String param = req.getParameter("NAME");

PrintWriter out = resp.getWriter();
out.println("<html><body>");
out.println("<h1>" + param + "</h1>");
out.println("<div><form action=\"/java-servlet\" method=\"get\"><input type=\"submit\" value=\"뒤로\"/></form></div>");
out.println("</body></html>");

out.flush();
out.close();

doPost 작성

 

  • service, destroy, init 작성
System.out.println("service TestServlet");

System.out.println("destroy TestServlet");

System.out.println("init TestServlet");

service, destroy, init 작성


6-1. TestServlet.java랑 index.jsp를 매핑해 줄 web.xml 만들기

  • 드디어 Servlet의 꽃인 web.xml을 직접! 작성해 보자.
  • Community버전이므로 경로 또한 직접 만들어 주고 파일 만들고 내용을 직접 써 줘야 한다!
  • 경로는 src/main/webapp/WEB-INF/web.xml 이다!
  • 왜 webapp/WEB-INF 안에 만드냐고? 나도 잘 알지는 못하지만 다음과 같이 간단하게 설명할 순 있다.
  • 나중에, 아직 설정도 안했고 만들지도 않은, 톰캣을 사용해서 이 프로젝트를 실행할 꺼다.
  • 그 톰캣의 ROOT경로가 webapp의 WEB-INF라고 알고 있다. 끝!ㅋㅋ

경로 생성
경로 이름 작성
생성된 경로에 파일 생성
web.xml 생성!
src/main/webapp/WEB-INF/web.xml 생성 및 빈 내용 확인!

 

6-2. web.xml 내용 작성!

  • 이 내용들은 전부 공식문서를 보면 잘 나와있다. 그 중에서 내가 가져다 쓴 것만 작성하겠다.
  • 우선 Servlet 2.5버전을 사용할 것이라고 쓴다.
  • 아마 빨간줄 경고가 뜰 텐데 web-app 태그 안의 경고는 무시해도 된다.(아마도)
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         version="2.5">
</web-app>

 

web.xml 작성 시작!

 

  • Display 이름을 써준다.(이건 안써줘도 상관 없다)
<display-name>ServletTest</display-name>

display-name 작성

 

  • welcome-file-list로 톰캣이 web.xml을 읽을 때 가장먼저 찾을 파일을 정의 해준다.
  • 아마도 제일 먼저 index.html을 찾아보고 없다면 index.jsp파일을 찾을 것이다. 그리고 파일이 있으니 그 파일을 첫 화면에 띄워 줄 것이다. 저기 명시된 내용의 파일이 하나도 없다면 whitePageNotFoundError404였나? 그걸 띄울 꺼다.
<welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.jsp</welcome-file>
    <welcome-file>default.htm</welcome-file>
</welcome-file-list>

welcome-file-list 작성!

 

  • 드디어 대망의 Servlet 작성!
  • <servlet>을 만들어라!
  • <servlet-name>(서블릿 이름)은 TestServlet으로 할꺼다!
  • 이 서블릿은 <servlet-class>에 있는 .java로 만든다!
  • 만든 서블릿을 다음과 같이 매핑 해줄꺼다!<servlet-mapping>
  • 매핑할 서블릿의 이름은 <servlet-name>이다!
  • 매핑할 서블릿의 주소는 /test로 할 꺼다!
  • 라는 내용이다.
<servlet>
    <servlet-name>TestServlet</servlet-name>
    <servlet-class>com.jin.container.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>TestServlet</servlet-name>
    <url-pattern>/test</url-pattern>
</servlet-mapping>

서블릿 생성과 매핑!


7-1. 톰캣 설치 하기

  • 사실 Intellij Community에서 톰캣연동은 아직 내 기준과 수준으로는 어려운 일이다.
  • 어떻게 저렇게 이렇게 요러케 하면 되겠지만, 시도 해본 결과 포트와 기본 구성이 꼬여서 톰캣 재설치를 해야 했다.
  • 그래서 Intellij의 플러그인 중 하나인 Smart Tomcat을 사용할 거다.
  • Smart Tomcat을 사용한다 해서 Tomcat 설치가 필요 없다는 건 아니다. 사용자의 PC에 설치 된 Tomcat을 SmartTomcat이 사용하기 때문에 사전에 Tomcat설치는 필수다.
  • 참고로 Servlet 2.5버전이기 때문에 Tomcat 10이상을 설치하면 오류가 날 수 있다.(난 오류가 났다)
  • 그러니 Tomcat 9 이하 버전을 추천한다.
  • 사용해본 결과 Ultimate 버전으로 연동한 일반 톰캣과 큰 차이는 없다.(연습 수준에서만 사용 해봄)
  • 사실 여러 블로그를 살펴 봐도 Community 버전이면 Smart Tomcat을 추천하고 있다.
  • 혹여나 일반 톰캣으로 연동하는 방법을 아는 읽는 이가 있다면 정리한 글 링크를 부탁한다.

파일 - 설정 클릭
플러그인의 마켓플레이스에서 검색창에 Smart Tomcat 검색 및 설치!
상단 <설치됨>에서 체크 확인!

 

7-2. 톰캣 설정하기

  • 우측 상단의 구성 추가 클릭한다

구성 추가 클릭!

 

  • 좌측 상단에 + 눌러서 Smart Tomacat 을 선택한다!

구성 추가!

 

  • Smart Tomcat 구성이 추가된 최초의 모습이다.
  • 위에서 언급 했듯이 나는 Tomcat 10을 사전에 설치하고 오류가 나서 9를 깔았기에 두 개가 깔려 있다.
  • Tomcat server 쪽을 보면 10이 우선 선택되어 있는 모습이다.

추가된 Smart Tomcat 구성

 

  • 설정하자
  • 이름(N) : 사용자 맘대로 쓰면 된다. 나는 JavaServlet 이라고 씀.
  • Tomcat server : 내 그림에는 10에서 9로 바꿔 줬다. 만약 버전이 하나만 깔려 있다면 따로 만질 필요는 없을 꺼다.
  • Deployment directory : 톰캣이 읽을 파일경로를 알려준다. 만질 필요는 없겠지? webapp을 선택하면 된다.
  • Use classpath of module : 어떤 경로의 모듈을 사용할꺼냐 인데 일단 하나밖에 없으니 만질 필욘 없겠지?
  • Context path : 정확힌 모르지만 처음 실행하면 띄우게 될 url 경로를 설정한다. 아마 이게 web.xml에 있는 welcome-file-list의 경로가 될 거다. 나는 그림과 같이 설정 할거다. 참고로 내용을 다 지워도 상관은 없지만 슬래시(/) 하나는 남겨 둬야 할꺼다. 그리고 슬래시 하나만 남겨 뒀을 경우 doGet과 doPost에 작성한 form태그 안에 있는 action값을 다음 과 같이 바꿔주면 된다. action=\"/\")
  • 실행 전(B) : 빌드 로만 되어 있을 텐데, 클릭해서 선택하고 - 눌러서 지운다음 옆의 + 눌러서 내 그림처럼 빌드, 오류 검사 없음 으로 설정 해주면 된다. 이유는 모른다... 진짜로... 나도 배우는 초보자다. 그냥 여러 블로그를 탐방해본 바에 따르면 대부분 저렇게 하더라..
  • 이제 확인 누르면 된다.

SmartTomcat 설정!

 

  • 그러면 구성 설정 모양이 그림처럼 바뀌어 있을 거다.

톰캣 설정 완료


8. 결과 확인

  • 실행 버튼을 눌러서 결과를 확인하자

실행 버튼 클릭!

 

  • 그림과 같이 바뀔 것이다.

실행 된 화면

 

  • 아래에 빨간 글씨가 촤르르륵 올라가면서 실행 되면서 마지막에 url을 띄워준다. 클릭하면 된다.
  • 참고로 빨간 글씨가 전부 에러를 나타내는 것이 아니다. 쫄지 말자.

실행이 완료되면 나오는 url 클릭!

 

  • 캬~! index.jsp가 잘 나온다!
  • 말이 이름 쓰라고 했지 그냥 text 기반으로 된 아무 언어나 넣어서 TestServlet.java의 Servlet이 잘 만들어져 나오는지 확인하자!

index.jsp 화면

 

  • Get 이름 에다가 Jin진 을 넣고 확인을 눌렀더니 한글이 깨져서 나온다.

TestServlet.java Servlet 잘 나온다! 한글이 깨지네..

 

  • 콘솔을 확인 하면 우리가 달달 글로만 외우던 생명 주기를 확인 할 수 있다.
  • Post 이름 에다가 보내서 확인도 해보고 Get Post로 보냈을 때 상단에 표기되는 URL 차이도 각자 확인 해 봐라.

아아... Servlet의 LifeCycle이여!!


9. 깨지는 한글 해결하기!

  • doGet은 한 줄만 추가해 주면 된다.
resp.setContentType("text/html;charset=UTF-8");

doGet 인코딩 추가

 

  • doPost는 한 줄 더 추가해 준다. 이유는 여러 블로그에 설명 되어 있으니 찾아 봐라...
resp.setContentType("text/html;charset=UTF-8");
req.setCharacterEncoding("utf-8");

doPost 인코딩 추가

 

  • 확인 해보면 한글이 너무 잘 나온다!
  • get과 post 구분은 url을 참고하자.

Get
Post

 

  • 하지만 마지막으로 저 '뒤로'라는 한글이 깨진다.
  • 이거 해결하는데 거의 9시간 찾아 해맨 기억이 있다.
  • 원인은 java파일을 읽는데 사용 한 gradle도 한글 설정을 해줘야 했던 것!
  • 그리고 Tomcat 설정하고 까먹은 부분이 있었는데 plugins에다가 war를 추가해줘야 했다.
  • 처음에 내가 할 때는 war를 안넣으면 안된다고 생각 했는데.... 지금 해보니 war 빼도 잘만 된다.
  • 그래도 Tomcat을 사용하니 war를 명시 해주자.. 왜 그런지는 아직 미숙해서 모른다.. 알면 알려줘...
  • build.gradle에 내용을 추가하고 우측 상단에 뜨는 코끼리를 눌러서 적용 해주자.
plugins {
    id 'war'
    id 'java'
}

생략...

tasks.withType(JavaCompile) {
    options.encoding = "UTF-8"
}

build.gradle 내용 추가

 

  • 드디어 완성된 결과물 들이다!

Get 한글 깨짐 해결
Post 한글 깨짐 해결


10. 마치며...

기관에서 Spring Boot만 배우고 역순으로 해보려니 정말 힘들었다.

특히 인텔리제이 무료 버전으로 그것도 그래들로 어노테이션 없이 서블릿 만드는 기본중의 기본을 소개 해주는 블로그를 찾지 못해서 더 힘들었던거 같다.

하지만 결국 해냈다.

 

컴퓨터 언어를 공부하는 우리 모두 힘내길 바란다.