티스토리 뷰

 

 

 

 

 

 

 

 

📍   서블렛 (Servlet)

–   웹 서버측에서 사용자의 요구에 따라,  
     자동으로 생성된 HTML형식의 페이지를 생산하여 전송해 줄 수 있는 여러 기술 중 Java 진영의 기술이 바로 Servlet.
–   단적으로 말하자면 웹 서버 상에서 실행되는 Java의 클래스 파일이라 할 수 있음.
–   다만 일반적인 Java 클래스와 비교해 볼 때,

     서블렛은 반드시 javax.servlet.Servlet 인터페이스를 구현해서 작성해야 하며,
     입력과 출력을 HTTP 프로토콜의 요청과 응답의 형태로 다룬다는 점이 다름.
–   클라이언트가 요청을 보내오면 웹 서버는 그 요청에 해당하는 서블렛 클래스 파일을 실행,  
     서블렛 클래스에서는 요청을 처리해 결과물을 만들어 내면 웹 서버가 그 페이지를 클라이언트에 전송함.
–   'Server Side Applet' 즉,  서버 사이드의 Java 응용 프로그램이란 뜻.

 

 

 

 

 

 

 

 

 

 

▶   JSP와 Servlet


JSP

Servlet

  •   Java Server Page, 
      클라이언트의 요청 (동적 컨텐츠를 처리)을 처리하는 기술.
      →   동적 컨텐츠의 예시 )   DB 등
      →   정적 컨텐츠의 예시 )   html, css, JS, 이미지 등

  •    JSP파일이 실행될 때,
       컨테이너 (Tomcat)에서 서블릿 형태 (java파일)로 변경.

  •    itwill.jsp  →  실행  →  itwill_jsp.java 
       →  itwill_jsp.class (서블릿)가 되면서 동작. 

html + java

java 

  –   컴파일러 필요 없음.
  –   인터프리티언어.
  –   새로고침만 눌러도 바로바로 반영됨.


  –   반드시 컴파일러가 필요. 
  –   뭔가를 수정하면 매번 컴파일(다시실행)을 해줘야 함.
  –   속도도 느리고 불편함.
        →   html코드 섞어서 빨리빨리 실행시키는 jsp 등장.

 

 

 

 

 

 

 

▶   서블렛의 동작 원리

1.   사용자의 URL 요청
2.   request, reponse 객체 생성
3.   서블릿 인스턴스와 스레드 생성
4.   service() 메서드 호출과 서블릿 클래스 실행
5.   응답과 스레드의 소멸

 

 

 

 

 

 

 

 

 

 

▶   서블렛 작성 규칙 

1.   java.servlet.Servlet 인터페이스를 구현해야 함.
2.   인터페이스를 직접 구현하기 힘들 경우,  javax.servlet.http.HttpServlet 클래스를 상속해야 함.
3.   service()  →  doGet(),  doPost() 메서드를 상황에 따라서 호출 (오버라이딩).
4.   3단계에서  javax.servlet.http.HttpServletRequest,
                        javax.servlet.http.HttpServletResponse 전달인자를 포함해야 함.
                        →   메서드 안에 있어야 한다는 뜻
5.   java.io.IOException,  javax.servlet.ServletException 예외를 던져서 (throws) 처리 해야함.
6.   web.xml (배포서술자)를 통해서 서블릿 매핑을 수행.
      →   서블릿 3.0이후,  어노테이션 형태로 사용.


EX   )   MyServlet 서블렛 생성하기

 

1.    javax.servlet.http.HttpServlet 상속 받기

import javax.servlet.http.HttpServlet;

public class MyServlet extends HttpServlet{

	
	
}

–   클래스 생성 후,  서블렛 인터페이스를 직접 구현하기 힘드므로   javax.servlet.http.HttpServlet을 상속 받음.

 

 

 

2.   init() 메서드 오버라이딩

	@Override	// init = 초기화
	public void init() throws ServletException {
		
		System.out.println("서블릿 객체 초기화 (= 생성)");
		System.out.println("       1회 실행      ");
		
	}

–   GenericServlet 클래스의 init() 메서드 오버라이딩.

–   doget() 메서드보다 위에 위치하여 서블릿 초기화 (=생성)함.  객체 생성이라 처음 1회만 실행함.
     →   1회 실행 후,  화면을 새로고침하면 doGet(),  doPost() 메서드만 호출됨.

 

 

 

3.   doGet(),  doPost() 메서드 오버라이딩

	@Override
	protected void doGet(HttpServletRequest req, 
			HttpServletResponse response) throws ServletException, IOException {
		System.out.println("doGET 호출");
	}

	@Override
	protected void doPost(HttpServletRequest request, 
			HttpServletResponse response) throws ServletException, IOException {
		System.out.println("doPOST 호출");
	}

–    doGet(),  doPost() 메서드 오버라이딩하여 메서드 호출 시 출력되는 간단한 출력문 작성.

–    메서드의 접근제한자는 protected.

      →   상속관계가 있을 때는 public,  상속관계가 없을 때는 private 형태로 사용할 수 있음.

 

 

 

4–1.    web.xml 배포서술자를 통해 서블릿 매핑 수행

–   web.xml에서 URL매핑을 직접 수행.

–   URL매핑을 사용하는 이유 서블릿을 호출할 때 서블릿명을 url에 입력해야 하는데,
     실제 서블릿 클래스를 공개하지 않기 위함. (보안)

 <!--서블릿 매핑-->
 
<servlet>
	<servlet-name>MyServlet</servlet-name>
	<servlet-class>com.itwillbs.servlet.MyServlet</servlet-class>
</servlet>
  
<servlet-mapping>
	<servlet-name>MyServlet</servlet-name>
	<url-pattern>/MyServlet</url-pattern>
</servlet-mapping>
코드 분석
4
  –   설정 파일 내부에서 사용되는 임의의 서블렛명.

5
  –   실질적으로 요청에 대해 처리될 물리적인 서블렛 클래스명.

9
  –   설정파일 내부에서 사용되는 임의의 서블렛명.
       '<servlet>' 엘리먼트에 정의된 이름과 일치해야함.


10

  –   url 상에서 실질적으로 요청되는 서블렛명.

 

 

 

4–2.    어노테이션을 활용한 서블릿 매핑 수행

 

•   어노테이션 (annotation)

–   문장이나 문서에 추가적인 정보를 기입하는 것,  컴파일시 환경설정 변경사항을 기입함.

     →   어노테이션을 사용 하여 서블릿 매핑을 수행하면 web.xml은 필요 없으므로 해당 내용 주석 처리함. (충돌 발생)
–   서블릿 3.0 이후 어노테이션 지원으로 간편하게 URL매핑을 할 수 있음.
–   이전에는 web.xml에서 URL매핑을 직접 하는게 필수였고 기본 기술을 알아야 해당 기술이 적용된 플젝도 다를 수 있음.

–   URL매핑을 사용하는 이유 서블릿을 호출할 때 서블릿명을 url에 입력해야 하는데,
     실제 서블릿 클래스를 공개하지 않기 위함. (보안)

 

 

방법1 )   

–   MyServlet() 메서드 위에 @WebServlet("/MyServlet") 추가함.

     →   어노테이션에 매핑주소를 입력한 것.

@WebServlet("/MyServlet")
public class MyServlet extends HttpServlet{

	// 서블렛 내용
    
}

 

방법2 )   

–   생각해보면 위의 방법은 어노테이션 하나에 하나의 클래스밖에 연결 못함. (비효율적)
      →   어노테이션의 매핑주소를 바꿔봄.
      →   @WebServlet("*.com")
–  대부분의 페이지의 url이 .com으로 끝나므로 url에 .com가 포함되기만하면 해당 페이지가 뜸.

      →   모든걸 뜻하는 * 기호를 넣었으므로 앞에 주소를 바꿔도 잘 뜸.

      →   하나의 어노테이션으로 다양한 페이지를 부를 수 있음.

@WebServlet("*.com")
public class MyServlet extends HttpServlet{

	// 서블렛 내용
    
}

 

 

 

5.   페이지 실행

–   이제부터 서블릿 페이지 실행 시,  기존의 'Ctrl + F11'이 아닌 실행할 주소를 브라우저에 직접 타이핑하여 실행할 것.

–   간단하게 주소를 이클립스 상에 주석처리 해놓고 ctrl + url + 클릭으로 페이지 실행.


http://localhost:포트번호/프로젝트명(context path)/url상의 서블렛명
@WebServlet("*.com")
public class MyServlet extends HttpServlet{

	// http://localhost:8088/JSP7/MyServlet.com
	// 톰캣을 실행한 상태에서 ctrl + url + 클릭 → 실행
    
}

 

 

 

6.   doGet() 메서드에 기능 추가

@Override
	protected void doGet(HttpServletRequest request, 
						 HttpServletResponse response) throws ServletException, IOException {

		// 한글처리 (인코딩)
		response.setContentType("text/html; charset=UTF-8");
		
		// 화면출력1
//		response.getWriter().append("Hello");
//		response.getWriter().append("<h1> Hello </h1>");
		
		// 화면출력2
//		PrintWriter out = response.getWriter();
//		ServletOutputStream out2 = response.getOutputStream();
//		out.println("화면 출력!");
//		out.println("<h1> Hello </h1>");
//		out.close();

		// 콘솔에 출력
		System.out.println("doGET 호출");
		
		// 인터페이스 RequestDispatcher 사용
        	// → 페이지 이동
		RequestDispatcher dis
				= request.getRequestDispatcher("./itwill.jsp");
		
        	dis.forward(request, response);
		
	}
코드 분석
6
  –   서블릿에서 한글처리 (인코딩)시,  response객체의 setContentType("text/html; charset=UTF-8") 사용.
  –   전달되는 데이터 자체에 인코딩을 거는 것.

9, 10
  –   체이닝기법 = 간단하게 몇 개 정도는 괜찮지만 멀리봤을 땐 좋지 않은 기법.
  –   현재 콘솔창에만 출력하고 화면은 빈 화면임.
  –   out.println 출력문을 사용하면 화면에 출력가능하지만 서블릿에서는 out 객체가 없어서 사용 못함.
  –   서블릿에서는 request와 response객체가 있음.
       →   response 객체의 getWrite() 메서드에 .append("Hi")로 입력하면 됨
       →   .append("<h1> Hi </h1>") 이렇게 태그도 같이 적용 가능.

13
  –   response (응답=내가 보는것=화면같은 개념=결과물)에 
       내가 메세지 (write)를 보낼 수 있는 길을 만듬. (글자, 문자로)

14
  –   Stream 객체는 byte로 데이터(숫자)를 주고 받음.
  –   out.println()으로 화면 출력 가능.
  –   파일 업로드때도 썼던 코드. (Stream 객체)

17
  –   전화 다하면 끊어야 하듯이 자원해제 해야 함.
  –   데이터를 주고 받는 동작을 하고 난 뒤에는 항상 종료해 주는게 좋음. → 효율적인 메모리 사용.

24~27
  –   Dispatcher 방식을 이용하여 포워딩으로 페이지 이동함.
       →   주소 표시줄의 주소가 변경되지 않고 페이지만 이동함. (화면만 바뀜)

       →   즉,  하나의 요청이며 같은 request 영역을 공유함.
              ⇒   request 영역의 데이터를 가지고 이동.
  –   그래서 itwill.jsp 페이지를 열었을 때,  주소가 MyServlet이고 화면은 itwill.jsp 페이지 내용을 보여줌.
       →   데이터 노출없이 (가상주소를 노출) 보여주고자 하는 화면만 보여줄 수 있음.
       →   앞으로 이렇게 개발할 것!


 

 

 

6.    destroy() 메서드 오버라이딩

	@Override
	public void destroy() {
		System.out.println("서블릿 소멸 (= 종료)");
	}

–   GenericServlet 클래스의 destroy() 메서드 오버라이딩.

–   제일 마지막에 위치하여 서블릿을 소멸 (= 종료)함.
–   서버를 종료시키면 콘솔창에 출력문이 출력됨.

 

 

 

💡   전체적인 서블렛 코드의 흐름

1.   JSP파일을 만들어서 실행.

2.   해당 파일이 서블렛으로 바뀜. (= JAVA 코드)
3.   init() 메서드 실행하여 서블렛 객체 초기화 (= 생성)
4.   바로 밑의 doGet() 메서드 혹은 doPost() 메서드 둘 중 하나 실행함.
5.   메서드가 종료되면 destroy() 메서드가 실행되어 페이지 종료.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함