Spring 환경 세팅 중 궁금했던 것들
WAS, 웹 애플리케이션 서버
WAS가 필요한 이유?
서버에서도 동작하게 하는 JAVA 프로그램을 만들기 위함이다.Perl이나 PHP 등은 Web 서버에 통합 이용되지만, Java는 전용 Java 서버를 세워 운영하지 않으면 안 되기 때문.
웹 서버는 정적 리소스를 제공하는 반면 WAS ( NGINX, APACHE )는 정적 리소스 뿐만 아니라 프로그램 코드를 실행해서 애플리케이션 로직 (ex - 동적 HTML, HTTP API(JSON)/서블릿, JSP, 스프링 MVC) 수행 가능하다.
웹서버와 was 둘다 HTTP 기반으로 동작
Deployed Resources 안에서 resources로 관리하는 것과 src/main/resources에의 리소스 관리 차이점?
스프링에서 dispatcher로 관리하는 게 장점일까? deployed resources는 관리 못하는 건가?
(내일 질문)
- src/main/resources/spring에는 spring 설정 파일들이 들어 있다.
Java Web Application 구조와 Spring MVC Project 구조 비교 !
- WEB-INF 폴더는 URL로 접근 불가능
- WEB-INF
Classes: Java 소스가 컴파일된 바이트코드 파일이 저장
lib: 실행시 필요한 외부 ~jar 파일이 저장
기타 폴더: 필요에 따라서 생성
web.xml: 배치 기술자(Deployment descriptor), WAS가 최초로 해석하는 파일
com.mycompany.webapp의 의미
com.mycompany.webapp
에서
com.mycompany
까지는 domain 명(groupId)
webapp
은 artifactId(식별자)를 나타낸다.
그럼 이 식별자는 어디에 쓰일까?
바로 브라우저에서 was에서 돌아가고 있는 어플리케이션을 식별할 때 쓰인다.
- web-server 기본 포트:8080
Deployment descriptor과 web.xml은 뭐하는 애들일까?
프로젝트 파일 우클릭 > Java EE Tools > Generate Depolyment Descriptor Stub 클릭하여 해당 프로젝트의 web.xml파일을 생성하였다.
이는 JSP나 Servlet를 위한 설정 파일로 URL
경로와 해당 경로의 요청을 처리하는 서블릿
사이의 매핑
을 정의한다. 웹 서버는 이 구성을 사용하여 특정한 요청을 처리할 서블릿을 식별하고 요청 메서드에 해당하는 클래스 메서드를 호출함!
서블릿은 뭐지?
웹 애플리케이션 직접 구현한다고 생각보면
- 서버 TCP/IP 연결 대기, 소켓 연결
- HTTP 요청 메세지 파싱해서 읽기
- POST 방식, /save url 인지
- Content-Type 확인
- HTTP 메시지 바디 내용 파싱
- 저장 프로세스 실행
- 비즈니스 로직 실행
데이터베이스 저장 요청 - HTTP 응답 메세지 생성 시작
HTTP 시작 라인 생성
헤더 생성
* 메시지 바디에 HTML 생성에서 입력 - TCP/IP에 응답 전달, 소켓 종료
출처: 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
web.xml 파일 뜯어보기
dispatcher
<!-- 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을 적어주면 된다.
dispatcher의 역할과 작성 시 주의점
- 요청을 처리하고(모든 요청은 먼저 얘가 처리), 해당하는 컨트롤러 메서드를 호출한다.
- 다른 자바의 객체와 달리 서블릿은 객체 초기화를 init에서 하고, init은 객체가 만들어지고 자동으로 실행된다.
- 이때 사용될 데이터를
<init=param>
에서 정의한다. - spring framework에서는 dispatcherservelet을 따로 만들어주거나 하지 않는다.
자동 생성
- init-param에서도 param-name은 절대 건들지 않는다. 무조건 고정. => 만들어져있는 DispatcherServlet이 해당 변수 이름으로 값을 읽어들이기 때문이다.
순수 서블릿을 만들어서 확인해볼 수 있다.
@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 파일을 찾게 되어 있다.
예시
DispatcherServelet에 대하여
- 프론트 컨트롤러라고도 부른다. 요청과 응답의 최전방에 있다.
-
그런데 두 개 생성???이 가능함. 개발할 때 역할 분담을 하기 쉬워지는 장점이 있는데 서버쪽 로직은 하나로 통일되어 있지만 그걸 표현하는 클라이언트가 여러가지 일때 사용하는 구조라고 한다. (질문 필요?)
-
누가 만드는 걸까? WAS(TOMCAT)이 자동으로 만들어준다. 드디어 tomcat이 정확히 뭐하는 애인지 알았다. servlet의 생성부터 소멸까지의 일련의 과정(Life Cycle)을 관리하는
서블릿 컨테이너
이다.
출처: https://12bme.tistory.com/555 [길은 가면, 뒤에 있다.]
pom.xml(Project Object Model)
메이븐 설정 파일로, 프로젝트 POM을 보여준다.
Maven: java 빌드 툴 중 하나.
pom.xml을 참고하여 네트워크를 통해 자동으로 필요한 라이브러리를 가져올 수 있고, 중앙저장소 이외에도 회사만의 라이브러리, 로컬 라이브러리를 사용할 수도 있다.
프로젝트 기본 정보, 관계 설정, 빌드 설정, 빌드 환경 등을 포함하고 있다.
effective pom: pom.xml과 최상위 pom을 병합함
++ 여담 : validator 할 때는 내용 자체는 그리 어려운 것 같지 않는데 아직 어노테이션 문법이 익숙하지 않아서인지, 설정 파일하는 거 자체가 낯설어서 그런지 휙휙 마법 같을 때가 있다. 음... 이걸 좀 더 알아봐야겠다.
Author And Source
이 문제에 관하여(Spring 환경 세팅 중 궁금했던 것들), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@pithesun/Spring-환경-세팅-중-궁금했던-것들저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)