디렉토리 구조 확인을 위한 작업
실제 운영 서버에 배포할 수 있는 WAR(Web Archive)
파일로 패키징 작업
서버 사이의 이식성을 보장하기 위해
→ 웹 애플리케이션은 모든 서버가 인식하는 정형화된 디렉토리 구조를 유지해야 함
👉 웹 프로젝트 패키징이 하는 일
해당 프로젝트의 war
압축 파일을 반디집으로 열어보았다
src/main/java
에 java
파일 작성하기 → 자동으로 classes
에 넣어줌
lib
에 jar
파일 넣기
webapp
에 자바파일 외 모든 파일 작성하기
WEB-INF
폴더안에 파일을 못찾음 → 여기 안에 파일 만들지말기WEB-INF
는 꼭 있어야 됨WEB_INF
폴더 안에 감춤META-INF
는 없어도 상관없음.jar
.war
WAR
파일이 올라가 있다 🧐BoardWeb
)에 실행F5
) 하면 생성web.xml
파일에 등록된 서블릿 클래스의 객체를 생성 및 관리객체의 저장소
Map
과 같은 컬렉션과 매우 유사 → key value
쌍key
값은 unique
해야함(파란색)web.xml
서블릿 컨테이너가 어떤 객체를 저장하고 어떻게 관리할 지에 대한 명세
WEB-INF
폴더에 있는 web.xml
파일을 로딩
- servlet과 javax.servlet.http 패키지의 API를 import
public
클래스로 선언- HttpServlet 클래스를 상속
- 반드시 기본 생성자를 가져야 함
- 라이프 사이클과 관련된 메소드를 오버라이딩
1번은 이클립스가 알아서 해줌
2번은 public
이어야 함
3번은 이클립스가 알아서 해줌
4번은 반드시 디폴트 생성자만 있어야함, 매개변수를 받는 생성자는 사용 불가
5번은 오버라이딩한 메서드여야 하므로, 메소드 시그니처(리턴타입, 이름, 매개변수)는 수정 불가
HttpServlet
을 상속하여 서블릿 클래스를 작성Servlet > GenericServlet > HttpServlet > LoginServlet
Servlet
타입으로 묵시적 형변환Servlet
타입으로 묵시적 형변환LoginServlet
객체는 Servlet
타입으로 cast
(형변환) 할 수 없음emplements HttpServlet
를 상속 받아야Servlet
타입으로 형변환하고, 브라우저가 요청할 때 아래 오류가 안뜸브라우저가 요청을 했을 때(
url
입력)
클라이언트(브라우저)가 요청하기 전까지 객체생성을 미루고 있다가 생성하는 것
web.xml
파일에 등록된 서블릿 클래스 객체는브라우저의 요청을 하든말든 상관 없이
서블릿 컨테이너가 XML 파일을 읽자마자, 등록된 게 있으면 무조건 생성
XML
설정 파일에 등록된 객체를 생성하는 것web.xml
파일에 등록된 서블릿 클래스로부터 단 하나의 객체만 생성브라우저가 로그인 프로세서가 요청
Web Server는 정적 콘텐츠만 처리 가능
👉 최초의 요청이면 없다
메모리에 없을 때
없으면, login.clss
파일을 메모리에 로딩
서블릿 컨테이너가 classes 디렉토리 폴더를 뒤져서 찾아봄
()
로딩되자마자 서블릿 컨테이너가 디폴트 생성자를 호출
(서블릿 컨테이너는 서블릿 객체 생성할 때 디폴트 생성자만 호출할 수 있다)
이제 객체가 메모리에 올라감
init()
객체 생성 직후에 서블릿 컨테이너가 딱한번 init()
메소드를 호출
init()
메소드가 오버라이딩 되어있으면?
컨테이너가 특정 시점에 자동으로 호출해주는 메소드 = 콜백메소드
init()
메소드의 용도
멤버변수를 초기화 가능
메모리에 있을 때
Service()
를 하나 호출Service()
요청방식이 GET이면 doGet()
호출
요청방식이 POST면 doPost()
호출
만약, service()
를 오버라이딩하면,
위의 분기처리하는 service()
가 동작하지 않음
👉 따라서 요청방식이 무엇인 지는 상관없음 무조건 실행!
👉 두 번째 요청부터는 ? 메모리가 있기(YES) 때문에 새로운 Thread 가 계속 호출된다
컨테이너가 적절한 시험에 알아서 잘 실행시켜주는 것
메소드 | 호출 시점 | 기능 |
---|---|---|
init() | 서블릿 객체가 생성된 직후 | 멤버 변수 초기화 |
service() | 브라우저가 요청할 때마다 | 서블릿이 처리해야할 구체적인 작업처리 |
destroy() | 서블릿 객체가 삭제되기 직전 | 자원 해제 |
init()
진짜 거의 안씀destroyy()
안씀@Annotation
설정@WebServlet("/loginProcess")
을 XML 설정 대신 사용
기능은 똑같이 동작함
XML 파일에는 아래 부분을 주석처리
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>com.ssamz.web.user.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/loginProcess</url-pattern>
</servlet-mapping>
서블릿은 현재 현업에서 잘 사용하지 않지만,
웹 서버와 브라우저의 동작을 보다 잘 이해 할 수 있는 기회가 된다.
추후에 사용할 Spring을 위해 동작 원리를 이해하고, 개발자가 코드로 어떻게 풀어나가야 하는 지에 대해 곰곰히 생각해보며 공부했다