。゚(*´□`)゚。

코딩의 즐거움과 도전, 그리고 일상의 소소한 순간들이 어우러진 블로그

[네이버클라우드] 클라우드 기반의 개발자 과정 7기/웹프로그래밍

[NC7기-73일차(8월7일)] - 웹프로그래밍 54일차

quarrrter 2023. 8. 7. 17:04

지난 복습 

서버 등록

기억이 잘 ,,,

현업에서는 하나의 언어로 프로그래밍하는게 아니라 여러 언어를 같이 씀 

spring: 자바 객체를  특별한 기술 없이 기본 기술로 자바객체를 만들자: pure java , +웹기술 접목 

어떤 언어든지 http 요청만 하면 응답가능, EJB(분산컴포넌트)를 마니 안 씀 대신 sprinig을 씀.

 

고객사에 설치된 JAVA EE 버전을 확인해서 기술들을 맞는 버전 다운 받아서 써야함.

오라클에서 JavaEE를 이클립스 재단에 넘겨버림, 이클립에서 java ee 8버전을 jakarta로 이름바꿈.9로 넘어가면서 패키지까지 바꿈. 따라서 9에서는 JavaEE 와 호환이 안된다. 

 

서버 추가하기

본체는 톰캣이고 여기가 테스트 서버
서버 추가하면 tmp0, tmp1 저절로 추가됨

 

 

 

서브릿jsp 기술을 도입해서 우리 프로그램을 이전시키는것: migration

 

프로젝트

common에 build.gradle 내용 추가 

twp가 아니라 wtp

publish 제대로 안 될 때:

gradle cleaneclipse

gradle eclipse

이클립스 서버에서 배포폴더빼고 폴더가서 빠졌는지 확인 후 다시 배포하기.

gradle cleaneclipse

gradle eclipse

기존에 있던거 리무브하고 publish

리무브하고 퍼블리쉬하고 다시 add하고 퍼블리시
publish하면 생김

 

**project 폴더와 배포 폴더 구조

ddfile = web.xml 배포기술

 

**ServletRequest와 ServeltResponse - service() 메서드 

ㅅㅓ블릿은 범용이고 상속받아서 http서블릿 만들어짐

처음에 Servlet : 특정 프로토콜에 제한되지 않는 범용 기술 (서버와 엡 연결)

근데 http가 강세라 주로 servelt을 http 프로토콜에 사용함

httpServletrquest구현체 = httpServletrquest라는 인터페이스를 구현한 클래스의 객체

 

 

프로젝트 

핸들러들 // migration

쿠키(session관련) 는 http프로토콜의 기술임 그래서 http서블릿 리퀘스트로 형변환 해야함 

 

Servlep-app 도 마찬가지로 설정하기 

 

새로고침 할 때마다 새로 등록한 25번이 왔다갔다함

// 요청이나 응답을 수행했을 때 서블릿 컨테이너로부터 알림을 받는 옵저버 객체
@WebListener // 서블릿 컨테이너에게 이 클래스가 리스너임을 알린다.
public class MyServletRequestListener implements ServletRequestListener {

리스너 만들기 


Servlet 만들기

*톰캣서버 기본 구조 

톰캣서버에는 내부적으로 엔진이 두 개 있음(mini web server & Servlet Container)

실제 운영할 때는 미니웹서버보다 성능이 더 좋은 아파치 웹서버(Ngix등,,)를 사용한다.

 

*서블릿 컨테이너와 서블릿 객체

서블릿 객체는 서블릿 인터페이스를 따라서 구현, 처음 요청을 받았을 때 생성됨. 요청 전까지는 없는 상태. 요청 받으면 딱 한 개만 생성됨(board add한 개 board list 한 개 등등)

Servlet의 Lifecycle과 관련된 메서드 

init() 시작할 때 호출 - 요청이 들어왔을때 실행할 객체가 없을 때 객체 생성할 때 호출됨. 
  // 서블릿 실행에 필요한 자원을 준비하는 코드
service()  클라이언트 요청 들어오면 호출
  // 실제 클라이언트의 요청을 처리할 코드 
destory() 종료할때 호출
  // init()에서 준비했던 자원을 해제시키는 코드 

 

* 서블릿 객체 제작 및 실행 

1. 서블릿 객체 제작하기

- Servlet 인터페이스 규칙에 따라 클래스 생성

 

2. 서버에 배치 

2-1 애노테이션 @WebServlet(서블릿경로)

2-2 DD File(web.xml)

 /WEB-INF/web.xml

 

워크스페이스 플러그인 설치하다가 오류나면 

기존 워크스페이스 다른 이름으로 바꿔서 저장 후 새로운 워크스페이스만들어서 이클립스 실행 

 

3. 서블릿 실행 

http:localhost:8888/ex01/first

(context path: 서버 루트 설정함)

 

서블릿 제작

// GenericServlet 추상 클래스
// => javax.servlet.Servlet 인터페이스를 구현하였다.
// => service() 메서드만 남겨두고 나머지 메서드들은 모두 구현하였다.
// => 따라서 이 클래스를 상속 받는 서브 클래스는 service() 만 구현하면 된다.

//@WebServlet(urlPatterns={"/ex01/s2","/ex01/ss2","/ex01/sss2"}) 이름 여러개

 

*Servlet 객체가 java.io.Serializable 인터페이스 구현하는 이유? 

1. 실무에서는 서버가 중단되는 사태에 대비하기 위해 여러 대(서블릿컨테이너들)로 구성한다.

2. 한 서버에 문제가 발생하면 실행중인 서블릿을 다른 서버로 이전하여 사용자에게 문제 되지 않도록 해야한다. 

=> 객체 직렬화를 활용하여 처리 => GenericServlet 클래스는 이런 상황을 고려하여 java.io.Serializible 인터페이스를 구현하였다,,!!! => 그래서  이 클래스를 상속 받은 서브 클래스로 serialVersionUID 를 설정해야한다. 

 

private static final long serialVersionUID = 1L;

톰캣서버에서 저걸 호출하는게 아니고 오리지널서비스를 호출하고 오리지널이 저 코드를 호출함. 저 코드는 규칙이 아님.

규칙은 서블릿이고 쓰기 편하려고 generic & http 서블릿쓰는 거임.