본문 바로가기
back-end/sevlet+ jsp+MVC

servlet

by 모두의 향연 2022. 4. 7.
728x90
반응형

 1. Web Architecture

Web Architecture

  • Web Browser: ML(HTML, XML(데이터 전달용 문서, 데이터 전송)), CSS, JS에서 웹 서버로 data를 가지고 request 하는데, 이 데이터를 parameter이다.  
  • Web Server(=HTTP Server): 클라이언트는 웹서버로 http라는 프로토콜을 가지고 접속하는데, 이때 접속을 도와주는 역할을 하는 것이 WebServer이다. 클라이언트가 요청하면 응답을 해준다. 
  • Application Server: WebServer는 요청과 응답만 하지, 실질적으로 프로그래밍을 돌릴 능력이 없다. 그래서 필요한 것이 applicationserver. PL(prorgram language)를 돌릴 수 있다. 여기서 자바를 돌려서 로직 처리하게 된다. 클라이언트한테 요청받은 걸 로직 처리하는 역할
1. 데이터를 가져오고(data get)
2. 로직 처리(덧셈 뺄셈과 같은 business logic(=Service=handler) + db를 검사하는 db logic(=DAO)
3. 응답처리(성공 vs 실패 vs에러): HTML
  • WAS(Web Application Server): 이전에는 웹서버와 애플리케이션 서버가 분업되어있었으나 요즘 나오는 서버는 같이 일을 함. 웹서버와 애플리케이션 서버의 역할을 모두 하는 게 WAS(jeus, weblogic, tomcat..)
  • web과 java가 합쳐진 것이 servlet과 jsp(jsp는 servlet이 가진 쌍 따옴표를 줄이기 위해 씀)
  • JDBC: 자바를 이용하여 데이터베이스에 접근하는 것
  • 서블릿-> DTO->서비스-> DAO 

 

 

 

2. survlet생성법

프로젝트 이름->New runtime

 

설치한 아파치

 

9.0을 사용할것이다

 

브라우저 클릭

 

아파치가 있는 폴더의 경로로 들어간다(아파치가 있는 폴더 경로는 계속 안 바꾸는게 좋음)

 

아파치 경로가 나온걸 확인

 

next

 

서블릿은 웹에서 돌아가긴 하지만, 자바파일이라서 src에 경로가 생긴다는 의미

 

root: 주소창에 검색했을 때 나올 주소(페이지를 1page 만든다고 하면 root에 / 하나만 써도 바로 들어가지지만, 여러개의 서블릿을 만들거기 떄문에 root이름을 그대로 냅둔다. [주소/servletTest] 이런식으로 해야 그 안까지 들어가게 된다. Content directory는 web과 관련된 모든것이 들어가는 폴더 이름(html,css,js,img,xml 등)

 

src-new-servlet

class로 충분히 만들 수 있다. 하지만, 서블릿이 가지고 있는 인터페이스가 갖고 있는 메서드 5가지를 오버라이드 해줘야 함. 5개 중에 4개만 필요한 경우도 있는데, 인터페이스의 특성상 5개 모두 오버라이드 해야 하기 때문에 귀찮다.

그래서 서블릿으로 만들게되면 필요한 것만 오버라이드 할 수 있다.

 

패키지와 클래스이름을 적는다. 상속을 보니 진짜 HttpServlet에서 상속받고 있다. next눌러보기

 

name은 서블릿의 이름이다. initialization paramaaeters가 보인다. 서블릿 객체는 우리가 만들지 않고 톰캣이 객체를 관리해준다. 그래서 톰캣한테 이런 객체를 만들 떄 이런값이 필요해! 라고 알려주는게 이니셜라이즈 파라미터이다. 오른쪽에 Add를 눌러 추가할 수 있다.

 

URL매핑: URL을 여러개 만들면 혼란있을 수 있어서 있는 URL을 수정해보자. 2를 클릭하고 3클릭

 

이름을 main이라고 바꿔보자. 주소창에 main이라고 치면 HelloServlet으로 들어오라는뜻-ok하고 next

 

5가지의 메서드가 있지만, get과 post를 대표로 쓴다. 클릭하고 Fnish

[알쓸신잡: page이동방법]
1. 링크 이동 2. 주소 입력 3. Form태그 이용-get/post 
결론: post라고 표현하지 않았으면 다 get이다~

생성완료(주석은 다 지우면 된다) 실행할거면 F11눌러서 똑같이 실행

 

우리가 만든 프로젝트를 서버에 올린다(=deploy한다)

 

주소창에 뜬거 확인. servletTest(프로젝트이름)는 context-Root라고 표현. 프로젝트의 메모리에 올리는 걸 context라고 하는데 거기에 접근한다해서 Root라고 표현. servletTest의 메모리에 들어가서 main이라는 서블릿을 실행할거야! 라는 뜻


알쓸신잡

java+web을 같이할 수 있는걸 servlet이라고 했는데 javaSE에는 포함이 안되어있고 javaEE버전에 포함되어 있다.

JRE의 rt.jar파일에 보면, 여태까지 썼던 java라이브러리가 다 있다. 하지만 서블릿은 javax.servlet을 쓰는데 여기에 없다.

jdbc를 해보면 알겠지만, JAVA에서 DB를 쓰기 위해서는 DB사마다 다르게 연결해줬어야 했다. 즉,  VenderAPI가 필요했다. 결국 우리는 javaEE를 하기 위한 라이브러리가 필요하다. 어떤 WAS를 쓰든 javaEE에서 만든 표준이라 상관은 없지만,  쓸 WAS가 라이브러리를 가지고 온다. 우리는 톰캣을 쓸건데 톰캣이 라이브러리를 가지고 왔다. 자바만 쓸 경우 JRE만 가지고 오는데, Dynamic Web Project는 톰캣도 같이 데려온다. 톰캣 안에 보면 servlet-api.jar안에 javax.servlet이 들어있다.


3. Servlet이란?

자바 서블릿(Java Servlet)은 자바를 사용하여 웹페이지를 동적으로 생성하는 서버 측 프로그램 혹은 그 사양을 말하며, 흔히 "서블릿"이라 불린다. 자바 서블릿은 웹 서버의 성능을 향상하기 위해 사용되는 자바 클래스의 일종이다. 서블릿 은 JSP와 비슷한 점이 있지만, JSP가 HTML 문서 안에 Java 코드를 포함하고 있는 반면, 서블릿은 자바 코드 안에 HTML을 포함하고 있다는 차이점이 있다.

servlet=html in java
jsp = java in html
  • servlet API

서블릿 API 구조

원래 <<Interface>>Servlet이 갖고 있는 메서드는 5개이다. 인터페이스다 보니 5개 메서드를 오버라이드 하는 건 귀찮은 일이다. 그래서 서블릿에서 필요한 것만 상속받게 GenericServlet 추상 클래스를 만든다. 필요한 것만 상속받게 한다. 

우리는 https라는 환경에서 사용하다 보니 httpsServlet을 상속받게 된다. httpsServlet 안에는 2개의 메서드가 있다. get과 post. 그래서 서블릿을 만들 땐 doGet이나 doPost를 상속받으면 된다. 그걸 sevlet으로 생성하면 정말 간편하게 할 수 있다!

(사용자에게 응답하는 것부터 해보자) servlethttp의response에서 get과 관련된 메서드

원하는 메서드가 없다면? 상위 클래스의 메서드를 확인해라. 메서드가 끝나는 부분에 상위 클래스가 있음

살짝 내리면.. 상위클래스로 이동(클릭)
servletresponse의 메서드 확인. 한글을 쓸거니까 getWriter()를 클릭

 

코드작성

PirntWriter클래스의 getWriter() 메서드를 쓴다. 

그 안에 html을 쓰는 거다. F11을 눌러서 보자.

한글이 깨져 나온다
오른쪽마우스-페이지소스보기
html도 잘 들어와있는데 이상하다
response.setContentType("text/html;charset=utf-8"); 설정해줘야 함

 

내가 보낼 때는 text로 보내지만, 클라이언트에게는 html로 인식해~ "content type"

이걸 꼭 설정해줘야 한다. 

주의) 무조건 맨 앞줄에 쓰기★

한글로 바꾼 다음에 응답을 해줘야 하기 때문

한글 잘 나온다

근데.. 엄청난 html 길이를 다 서블릿으로 바꾸려면..? 장난 아니다.

언제 out.println을 쓰고 있냐고요. 그래서 나온 것이 jsp!

간단한 html은 서블릿으로 가능했지만, 몇천 줄 되는 html은 무리다.

 

참! 내용을 변경하고 save를 하고 새로고침을 누르면 콘솔 창에 ' ~콘텍스트를 다시 로드하는 것을 완료했습니다."라는 게 떠야 브라우저가 새로고침 된다. 그래서 유명한 콘서트 예매할 때 서버 전송 때문에 오래 걸리나보다. 서버를 비싼 걸 쓰는 이유..

 

  • URL을 바꾸는 방법

방법은 2가지

 

방법 1: 서버에서 지웠다가 다시 실행(비추)

remove all해서 서버를 다시 뺐다가 넣는 방법이 있지만 비추. 기존게 남아서 에러나는 경우 있다

 

방법 2: properties에서 바꾸고 + servers폴더에서 server.xml을 수정하는 방법

html을 하나 만들어서 서블릿페이지로 이동하는 링크를 만들어보자. F11눌러서 실행해보면 링크로 잘 이동한다.

 

링크를 하나 더 만들어서 url을 바꾼 링크를 넣어보자

 

서버가 실행중이라면 무조건 서버를 일시정지하고 시작

 

프로젝트-오른쪽마우스-properties

 

Web Project Settings의 context root의 이름을 바꾸자

 

이름을 바꾸고 저장

 

F11눌러서 실행하고 링크로 들어간다

 

[알쓸신잡: 주소창에 꼭 html을  붙여야 할까?]
index.html을  웰컴 페이지라고  하는데 주소창에 안 쳐도 자동으로 들어가진다.

 

404에러가 뜬다. 이미 servletTest라는 이름으로 톰캣에 등록해놨기 떄문에 에러가 나는것

 

[알쓸신잡]
404 에러: 무조건 맞춤법 에러

Servers폴더에 톰캣에 server.xml에 들어간다

 

맨밑으로 가보면 path가 servletTest로 되어있다(아까 바꿔도 바뀌지 않은..이거까지 바꿔줘야 에러가 안난다)

 

path의 이름을 바꾸고 실행해보자 또는 <context~~ path="~">이 부분 삭제하면 알아서 다시 생긴다

 

주소도 잘 들어왔고 실행도 잘된다

 

  • Servlet Life-Cycle

Servlet class는 javaSE에서의 class와는 다르게 main method가 없다. 즉 객체의 생성부터 사용(method call)의 주체 가 사용자가 아닌 Servlet Container(Servlet Engine=WAS=톰캣)에게 있다. Client가 요청(request)을 하게 되면 Servlet Container는 Servlet객체를 생성(한 번만)하고, 초기화(한 번만) 하며 요청에 대한 처리(요청 시마다 반복)를 하게 된다(스레드). 또한 Servlet객체가 필요 없게 되면 제거하는 일까지 Container가 담당하게 된다.

Servlet Life-Cycle

다른 사용자가 동시에 사이트를 접속해도 서블릿은 한 번만 초기화되고(=서블릿 객체는 한 개만 만들어지고) init메서드도 한 번만 초기화가 된다. 클라이언트 수만큼 스레드가 호출되면서 doGet, doPost, sercive만 사용자 수만큼 호출!

클래스를 수정하면 detroy가 호출되고, 새로고침 하면 맨 처음 들어오는 클라이언트만 init()이 호출되고 나머지 클라이언트부터는 doGet()이 호출된다. 

 

  • Servlet method

서블릿의 메서드

 

  • Servlet Life-Cycle의 '주요' method
method description
init() 서블릿이 메모리에 로드 될 때 한번 호출
코드 수정으로 인해 다시 로드 되면 다시 호출
doGet() GET방식으로 data전송 시 호출
doPost() POST방식으로 data전송 시 호출
service() 모든 요청은 service()를 통해서 doXXX()메소드로 이동
destroy() 서블릿이 메모리에서 해제되면 한번 호출
코드가 수정되면 호출

 

  • Servlet Parameter 처리[Parameter 전송 방식]    
  GET POST
특징 - 전송되는 데이터가 URL뒤에 Query String으로 전달
- 입력 값이 적은 경우나 데이터가 노출이 되도 문제가 없을 경우 사용
- URL과 별도로 전송
- HTTP header 뒤 body에 입력 스트림 데이터로 전달
장점 - 간단한 데이터를 빠르게 전송. form tag뿐만 아니라 직접 URL에 입력하여 전송 가능 - 데이터의 제한이 없다
- 최소한의 보안 유지 효과를 볼 수 있다
단점 - 데이터 양에 제한이 있다
- (location bar(URL + parameters)를 통해 전송할 수 있는 데이터의 사이즈는 2kb(2048byte)로 제한된다
- 전달 데이터의 양이 같을 경우 GET 방식보다 느리다.
- (전송 패킷을 body에 데이터를 구성해야 하므로)

 

  • URL? QueryString? Parameter?

[ URI ]

URI는 특정 리소스를 식별하는 통합 자원 식별자(Uniform Resource Identifier)를 의미한다. 웹 기술에서 사용하는 논리적 또는 물리적 리소스를 식별하는 고유한 문자열 시퀀스다.

[ URL ]

URL은 흔히 웹 주소라고도 하며, 컴퓨터 네트워크 상에서 리소스가 어디 있는지 알려주기 위한 규약이다. URI의 서브셋이다.

URI 구조

 

  • servlet에서 jdbc작업순서
① JDBC Driver Loading - init()
② DBMS와 연결 (Connection 생성)
③ SQL 실행 준비 (Statement, PreparedStatement 생성) + SQL 문장도 이때 만들면 됨
④ SQL 실행 DML executeUpdate(): insert/update/delete문 + executeQuery(): select문
⑤ DBMS 연결 끊기 : throws SQLException으로 예외처리가 되어있기에 마지막에 꼭 끊어줘야 함(연결 역순으로)
https://feastforall.tistory.com/207 참고하세요~!

 Driver Loading  :  init()

	@Override
	public void init() throws ServletException {
		try {
//			1. Driver Loading
			Class.forName("com.mysql.cj.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}

② DBMS와 연결 (Connection 생성)


}
728x90
반응형

'back-end > sevlet+ jsp+MVC' 카테고리의 다른 글

JSTL (JSP Standard Tag Library)  (0) 2022.04.10
EL(Expression Language)  (0) 2022.04.10
HttpSession/Cookie  (0) 2022.04.09
JSP(Java Server Page)  (1) 2022.04.04