Perl이나 PHP 등은 Web 서버에 통합 이용되지만, Java는 전용 Java 서버를 세워 운영하지 않으면 안 되기 때문.
웹 서버는 정적 리소스를 제공하는 반면 WAS ( NGINX, APACHE )는 정적 리소스 뿐만 아니라 프로그램 코드를 실행해서 애플리케이션 로직 (ex - 동적 HTML, HTTP API(JSON)/서블릿, JSP, 스프링 MVC) 수행 가능하다.
웹서버와 was 둘다 HTTP 기반으로 동작
스프링에서 dispatcher로 관리하는 게 장점일까? deployed resources는 관리 못하는 건가?
(내일 질문)
com.mycompany.webapp
에서
com.mycompany
까지는 domain 명(groupId)
webapp
은 artifactId(식별자)를 나타낸다.
그럼 이 식별자는 어디에 쓰일까?
바로 브라우저에서 was에서 돌아가고 있는 어플리케이션을 식별할 때 쓰인다.
프로젝트 파일 우클릭 > Java EE Tools > Generate Depolyment Descriptor Stub 클릭하여 해당 프로젝트의 web.xml파일을 생성하였다.
이는 JSP나 Servlet를 위한 설정 파일로 URL
경로와 해당 경로의 요청을 처리하는 서블릿
사이의 매핑
을 정의한다. 웹 서버는 이 구성을 사용하여 특정한 요청을 처리할 서블릿을 식별하고 요청 메서드에 해당하는 클래스 메서드를 호출함!
웹 애플리케이션 직접 구현한다고 생각보면
출처: Link
이걸 다해야 한다. 서블릿은 위아래 귀찮은 일을 대신 해주고 개발자가 대신 초록색 부분만 할 수 있게 도와준다. 즉 HTTP 스펙
을 편리하게 사용할 수 있도록 도와주는 것이다.
최초 요청일 때만 객체가 생성되고 그 뒤로는 재사용하기 때문에 서블릿은 처음 요청할 때 가장 응답 속도가 느리다. 최초 요청을 빠르게 하려면 요청 시에 생성하는 게 아니라 서버를 시작할 때 미리 만들어둘 수 있다. (load-on-startup : [순서]
)
public class DispatcherServelet extends HttpServlet {
@Override
public void init(ServletConfig config) throws ServletException {
}
@Override
protected void service(HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException{
}
}
https://cloud.google.com/appengine/docs/standard/java/config/webxml
<!-- Processes application requests -->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/dispatcher/*.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
servlet
tag에는 해당 서블릿의 이름과 관리 class 위치, 초기화에 사용할 변수와 데이터 등이 담긴다.servlet-mapping
tag에는 servlet
tag의 이름과 똑같이 적어주고 매치될 url
patter을 적어주면 된다.<init=param>
에서 정의한다. 자동 생성
순수 서블릿을 만들어서 확인해볼 수 있다.
@Override
public void init(ServletConfig config) throws ServletException {
String contextConfigLocation = config.getInitParameter("contextConfigLocation");
System.out.println("contextConfigLocation " + contextConfigLocation);
}
이후에 DispatcherServlet이 param-value로 받은 classpath:spring/dispatcher/*.xml
(스프링 설정 파일 위치)를 읽어들여 해당 폴더에서 *.xml의 dispatcher 설정 파일를 볼 수 있게 한다.
해당 파일에서는 자바 소스에서 보낸 파일 이름들을 식별할 수 있게 내부 파일로 확장한다. 그 뒤 리턴값에서 보는 폴더에 해당 파일이 있어야 한다.
디폴트는 index.html 혹은 index.jsp 파일을 찾게 되어 있다.
예시
그런데 두 개 생성???이 가능함. 개발할 때 역할 분담을 하기 쉬워지는 장점이 있는데 서버쪽 로직은 하나로 통일되어 있지만 그걸 표현하는 클라이언트가 여러가지 일때 사용하는 구조라고 한다. (질문 필요?)
누가 만드는 걸까? WAS(TOMCAT)이 자동으로 만들어준다. 드디어 tomcat이 정확히 뭐하는 애인지 알았다. servlet의 생성부터 소멸까지의 일련의 과정(Life Cycle)을 관리하는 서블릿 컨테이너
이다.
출처: https://12bme.tistory.com/555 [길은 가면, 뒤에 있다.]
메이븐 설정 파일로, 프로젝트 POM을 보여준다.
Maven: java 빌드 툴 중 하나.
pom.xml을 참고하여 네트워크를 통해 자동으로 필요한 라이브러리를 가져올 수 있고, 중앙저장소 이외에도 회사만의 라이브러리, 로컬 라이브러리를 사용할 수도 있다.
프로젝트 기본 정보, 관계 설정, 빌드 설정, 빌드 환경 등을 포함하고 있다.
effective pom: pom.xml과 최상위 pom을 병합함
++ 여담 : validator 할 때는 내용 자체는 그리 어려운 것 같지 않는데 아직 어노테이션 문법이 익숙하지 않아서인지, 설정 파일하는 거 자체가 낯설어서 그런지 휙휙 마법 같을 때가 있다. 음... 이걸 좀 더 알아봐야겠다.