(SERVLET) 서블릿 애플리케이션 개발
기본 세팅
maven archetype -webapp설정
기본 골격
servlet 의존성 설정 (with pom.xml)
provided - 코딩하는 시점에는 사용 가능
런타임 시점 (war packaging ) 에는 classpath 제외
javax.servlet-api는 container에서 제공된다. -> 톰캣 container에서 제공하기 때문에 굳이 Runtime 시점까지 Scope을 지정할 필요가 없다.
- dependency 하위에 포함되는 항목
- 해당 dependency가 포함되는 범위에 대한 타입
-
scope 종류
-
compile :
- 기본 scope. 미입력시에도 기본 적용
- 모든 상황에서 포함됨
-
provided :
- compile과 유사하게 모든 상황에서 수행된다
- 하지만, 다른 외부 컨테이너에서 기본 제공되는 API인경우 provided로 지정 시 마지막 패키징할 때 포함되지 않음
- 예를 들면 tomcat에서 기본적으로 servlet api를 제공하기 때문에 servlet api를 provided로 지정하면 패키징시 제외된다.
- runtime :
- 컴파일 시에는 불필요 실행시에 필요한 경우.
- 런타임 및 테스트 시 classpath에 추가 되지만, 컴파일시에는 추가 되지 않음
- test : 테스트시에만 사용
- system :
- provided와 유사
- system의 특정 path를 참조하도록 지정
- Maven의 central repository를 사용하지 않음
- import :
- scope는 dependencyManagement 섹션에서 pom의 의존관계에 대해 사용
-
http://progtrend.blogspot.com/2018/07/spring-boot-war.html
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
java dir 생성 및 Sources dir 지정
서블릿 코드 작성 : HttpServlet 상속
public class HelloServlet extends HttpServlet {
@Override
public void init() throws ServletException {
System.out.println("init");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet");
resp.getWriter().println("<html>");
resp.getWriter().println("<head>");
resp.getWriter().println("<body>");
resp.getWriter().println("<h1>Hello Servlet!!!</h1>");
resp.getWriter().println("</body>");
resp.getWriter().println("</head>");
resp.getWriter().println("</html>");
}
@Override
public void destroy() {
System.out.println("destroy");
}
}
서블릿 실행 (with Tomcat) - 서블릿 독자적으로 실행할 수 있는 방법은 존재하지 않는다.
1. 서블릿 컨테이너에 배포하는 식으로 진행
ADD CONFIGURATION에서 Tomcat 설정
해당 경로에 다운로드한 Tomcat을 설정한다.
와... 진짜 번거롭네
그래도 해보자!
https://tomcat.apache.org/download-90.cgi
2. 해당 사이트에서 tomcat 9.0 버전 설치(zip)
3. 다운로드한 tomcat 경로 설정 후 Deployment에서 war exploded 설정
war packaging 방법
- war로 묶어서 배포하는 방법
- war를 압축을 풀어서 배포하는 방법
mac 사용 유저는 경로 설정뿐만 아니라 권한을 주는 작업도 해주어야 한다.
기본 설치 시에는 실행에 대한 권한이 없기 때문이다.
cd apache-tomcat-9.0.30/bin
해당 디렉터리의 sh에 해당하는 파일에 대해 권한을 모두 준다.
chmod +x ./*.sh
위치도 해당 이름으로 지정된다.
4. 실행결과
근데... 만든 서블릿이 들어오지 않았네...?ㅋㅋㅋ
web.xml에 설정을 안 해주었기 때문
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>me.choi.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
근데 너무 길다 url이
Application context root로 변경
근데 여기서 init이 한번 호출되었고
그 이후에는 호출되지 않으며 doGet만 호출된 점에 주목하자! - memory에 이미 initialization이 되었기 때문이다.
서버를 끌 땐 destroy 호출
개요
- Spring Mvc는 내가 만든 HttpServlet 기반으로 만들어져 있다.
- 어떻게 우리는 애노테이션으로 매핑하고 처리할 수 있을까?
- 뷰로 어떻게 thymeleaf를 쓸 수 있을까?
- web.xml을 만든 적이 없는데?
코드 참조
https://github.com/mike6321/Spring/tree/master/SpringMVC/java-servlet-demo