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 할 때는 내용 자체는 그리 어려운 것 같지 않는데 아직 어노테이션 문법이 익숙하지 않아서인지, 설정 파일하는 거 자체가 낯설어서 그런지 휙휙 마법 같을 때가 있다. 음... 이걸 좀 더 알아봐야겠다.

좋은 웹페이지 즐겨찾기