고급JAVA 26강 - 클래스 다이어그램, Servlet

Whatever·2021년 12월 2일
0

고급 JAVA

목록 보기
26/32

클래스 다이어그램

클래스정의

멤버변수 작성법
접근제한자 변수명 : 데이터타입 = 기본값
예)
private String name; ==> -name : String;
public int age = 20; ==> +age : int = 20

메서드 작성법
접근제한자 메서드명(파라미터 목록) : 반환값 타입
예)
public int sum(int x, int y){ } ==> +sum(x:int, y:int) : int

클래스간 관계
Generalization(일반화관계) : 일반적인 것(동물)에서 특화된 것(사자)과의 관계를
나타낸다. 보통 상속을 표현한다.
인터페이스를 구현 -> 점선의 화살표

Association(연관 관계) : 한 객체가 다른객체를 소유하거나 파라미터로 객체를 받아서
처리하는 관계를 나타낸다.

class A{
B b;
}

class B{

}
==> Association 관계 A->B

단방향: 클래스간의 관계가 "->" 이렇게 구현이 되며, 화살표의
대상은 자신을 가리키는 클래스의 존재여부를 알지 못한다.
양방향: 클래스간의 관계가 "-" 로 구현되며 서로 연관이
되어있다

aggregation(집합) :
메인 클래스가 삭제될시 대상 클래스는 같이 삭제가 안됨
(라이프 사이클이 다름) 분리가 되도 독립적으로 동작됨
약한결합
Composition(합성) :
메인 클래스가 삭제될시 대상 클래스도 같이 삭제가 됨
(라이프 사이클이 동일) 분리가 되면 의미가 없어짐
강한결합

class A{
C c;
A(C c){
this.c = c;
}
method(E e){
}
methodB(){
F f = new F();
}
}

class B{
C c;
B(){
c = new C();
}
}

Class C{

}

Class D{
main(){
C c = new C();
A a = new A(c);

 B b = new B(); ->여기서 B가 삭제되면 C도 같이 삭제됨

}
}
==> A와 C는 aggregation, A와 B는 Composition
어디에서 객체를 생성해서 가져오느냐의 차이

class E{

}

class F{

}

==> A와 E,F는 Dependency관계(변수선언은 했지만 지역변수 관계일 때)

Dependency(의존관계) : 한 객체가 다른객체를 소유하지는 않지만, 다른객체의 변경에
따라서 같이 변경을 해주어야 한다.
⑴ 다른 객체를 파라미터로 받아서 그 메서드를 사용한다.
⑵ 객체의 메서드 안에서 다른 객체를 생성해서 리턴한다.

서블릿(Servlet)

1.서블릿(Servlet)는?

  • 자바 플랫폼에서 컴포넌트를 기반으로 한 웹 애플리케이션을 개발할 때 사용하는 핵심기술이다.
    동적인 웹 컨텐츠 생성을 가능하게 하는 기술이다. 즉, JSP + 자바기술을 사용 가능하게 해 주는 기술
  • 클라이언트 요청을 처리하고 그 결과를 다시 클라이언트에게 전송하는 Servlet 클래스의 구현 규칙을 지킨 자바 프로그램을 말한다.

■ 서블릿의 장점
스레드를 기반으로 하므로 웹 애플리케이션 운영에 효율적이다.
자바를 기반으로 하므로 자바 API를 모두 사용할 수 있다.
운영체제나 하드웨어에 영향을 받지 않으므로, 한번 개발된 애플리케이션은 다양한 서버 환경에서도 실행이 가능하다.
웹 애플리케이션에서 효율적인 자료 공유 방법을 제공한다.

2.서블릿 컨테이너 (Servlet Container) – 서블릿을 관리한다.
: 서블릿 구조와 클라이언트 요청이 있을 때 처리하는 순서
① 웹 서버는 클라이언트 요청을 컨테이너로 전달한다.
컨테이너는 서블릿이 메모리에 있는지 확인하고 없을 경우
클라이언트 요청을 처리할 서블릿을 생성해서 스레드로 처리한다.

② 서블릿은 JDBC를 이용해 데이터베이스에 접근할 수 있고,
별도로 제작된 자바 클래스를 통해 다양한 기능을 구현한다.

③ 서블릿에서 수행된 결과는 HTML형식으로 클라이언트에 전송된다.

Servlet : class 안에서 html을 넣는 것
JSP : html문서 안에서 Java언어를 넣는 것

애플리케이션 구성 요소 단위로 역할 분담
모델 : 자바 클래스(Service, DAO,VO)
뷰 : JSP, JSTL
컨트롤러 : 서블릿

■ 웹 애플리케이션 개발할 때 MVC패턴에서 서블릿(Servlet)을 사용하면 좋은 점
컨텐츠와 비즈니스 로직을 분리할 수 있다.
컨트롤러와 뷰의 역할 분담으로 인해 웹 디자이너와 개발자 간의 원활한 작업이 가능하다.
유지보수가 수월하다.
기능 확장이 용이하다.
현재와 같이 프로그래머가 HTML, 자바스크립트, 스타일시트와 같은 복잡한 기술을 모두 알아야 할 필요는 없다.
JSP 페이지에 HTML,CSS, 자바스크립트 와 자바 소스 코드가 뒤섞이는 스파게티 소스를 막을 수 있다.

javax.servlet.GenericServlet
javax.servlet.http.HttpServlet
MyServlet extends HttpServlet
service()

5.JSP도 서블릿 컨테이너에서 서블릿 코드로 자동으로 변환되어 생성되고 컴파일 되어 실행된다.

6.GET방식과 POST방식
■ GET 방식
서버에 있는 정보를 가져오기 위해 설계된 방법이다(예를 들어 HTML, 이미지 등을 웹 브라우저에서 가져오기)
서버로 전달할 수 있는 데이터 크기는 최대 1024바이트까지 가능하다.(사실 웹브라우저의 영향을 받는다.)
QUERY_STRING 환경변수를 통해서 서버로 전달되는데, 다음 형식을 따른다.
http://www.xxx.co.kr/servlet/login?id=hj&name=hong
*URL이 노출되기 때문에 보안 문제가 생길 수 있다.

■ POST 방식
서버로 정보를 올리기 위해 설계된 방법이다.(예를들어, HTML form에 입력한 내용을 서버로 전달하기(submit))
서버에 전달할 수 있는 데이터 크기는 제한이 없다.
URL에는 파라미터가 표시되지 않는다.

7.서블릿 생명주기

실행시기 기능 실행 메서드

최초 요청/ 초기화 init()
컨테이너 시작 이벤트

모든 요청과 응답 요 청 service()
응 답

컨테이너 종료/ 종 료 destroy()
애플리케이션 종료 이벤트

서블릿 로딩:init() 메서드
:클라이언트 요청이 들어오면 컨테이너는 해당 서블릿이 메모리에 있는지
확인한다. 해당 서블릿이 메모리에 없을 경우 서블릿을 메모리에 다시 적재
해야 하는데, 이때 서블릿의 init() 메서드가 호출되며 각종 초기화 작업을
수행한다.

요청 처리 : service() 메서드
: init() 메서드는 최초에 한번만 수행되고 이후 요청은 스레드로 실행되며
각각 service() 메서드를 통해 doGet()이나 doPost()로 분기된다. 이때
HttpServletRequest와 HttpServletResponse를 매개변수로 전달한다.

서블릿 종료: destroy() 메서드
컨테이너로부터 서블릿 종료 요청이 있을 때 destroy() 메서드를 호출한다.

Servlet Program의 기본적인 동작 과정

  1. Web Server는 HTTP request를 Web Container(Servlet Container)에게 위임한다.
    1) web.xml 설정에서 어떤 URL과 매핑되어 있는지 확인
    2) 클라이언트(browser)의 요청 URL을 보고 적절한 Servlet을 실행
  2. Web Container는 service() 메서드를 호출하기 전에 Servlet 객체를 메모리에 올린다.
    1) Web Container는 적절한 Servlet 파일을 컴파일(.class 파일 생성)한다.
    2) .class 파일을 메모리에 올려 Servlet 객체를 만든다.
    3) 메모리에 로드될 때 Servlet 객체를 초기화하는 init() 메서드가 실행된다.
  3. Web Container는 Request가 올 때마다 thread를 생성하여 처리한다.
    각 thread는 Servlet의 단일 객체에 대한 service() 메서드를 실행한다.

Web Service의 기본적인 동작 과정

HTML Form -> Servlet -> HTML Page
1. 사용자가 웹 페이지 form(HTML Form)을 통해 자신의 정보를 입력한다. (Input)
2. Servlet의 doGet() 또는 doPost() 메서드는 입력한 form data에 맞게 DB 또는 다른 소스에서 관련된 정보를 검색한다.
3. 이 정보를 이용하여 사용자의 요청에 맞는 적절한 동적 컨텐츠(HTML Page)를 만들어서 제공한다. (Output)

  1. HTML Form
    Form Tag 속성
    • Form Tag 속성을 이용하여 어디로, 어떤 방식으로 전송할지 정한다.
    • action : form을 전송할 서버 쪽 스크립트 파일 지정
    • name : form을 식별하기 위한 이름 지정
    • accept-charset : form 전송에 사용할 문자 인코딩을 지정
    • target : action에서 지정한 스크립트 파일을 현재 창이 아닌 다른 위치에서 열리도록 지정
    • method : form을 서버에 전송하는 방식으로, HTTP 메서드 지정 (GET 또는 POST)
    • enctype : 넘기는 Content의 Type 지정 (주로 파일을 넘길 때 사용)
      type은 multipart/form-data 로 지정해서 사용

ServletTest01

package kr.or.ddit.basic;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/*
  	Servlet이란? 
  	=> 컨테이너(서블릿엔진)에 의해 관리되는 자바 기반의 웹컴포넌트.
  	      동적인 웹 컨텐츠 생성을 가능하게 한다. 
*/

/*
	이 서블릿을 호출할 URL주소 만들기
	예) http://localhost:80/servletTest/servletTest01.do
	 - http ==> 프로토콜
	 - localhost ==> 컴퓨터이름(도메인명) 또는 IP주소
	 - 80 ==> PORT번호 (80번은 생략 가능)
	 - /servletTest ==> 컨텍스트패스(보통 프로젝트 이름으로 지정한다.)
	 - /servletTest01 ==> 서블릿 요청 URL패턴 
*/
// 서블릿을 등록하는 방법이 2가지가 있는데 
// 첫번째는 배포서술자(web.xml)를 이용하는 방법
// 두번째는 애노테이션을 이용하는 방법이 있다.

// 이 예제는 배포서술자를 이용하는 방법을 사용하는 예제이다.
public class ServletTest01 extends HttpServlet{
	private static final long serialVersionUID = 1L;
	
	/*
		이 곳에서는 대부분 service()메서드나 doGet()메서드 또는 doPost()메서드를
		재정의해서 작성한다.
		
		doGet()메서드나 doPost()메서드의 매개변수로 다음과 같은 2개의 객체가 전달된다.
		1) HttpServletRequest객체
			==> 서비스 요청에 관련된 정보 및 메서드를 관리하는 객체 
		2) HttpServletResponse객체
			==> 서비스 응답에 관련된 정보 및 메서드를 관리하는 객체 	
	
	*/
	
	// service()메서드 ==> 모든 요청시 실행되는 메서드
	//				 ==> 이 메서드에서 전송방식에 맞는 메서드를 자동 호출해준다.
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws 
    ServletException, IOException {
		// TODO Auto-generated method stub
		super.service(req, resp);
	}
	
	// doGet()메서드 ==> GET방식의 요청을 처리하는 메서드
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws
    ServletException, IOException {
		response.setCharacterEncoding("utf-8"); // 응답 문서의 인코딩 방식 지정
		response.setContentType("text/html; charset=utf-8"); // 응답문성ㅇ츼 ContentType지정
		
		// 처리한 내용을 응답으로 보내기 위한 PrintWriter객체 생성
		PrintWriter out = response.getWriter();
		
		// 처리한 내용을 PrintWriter객체를 이용하여 출력한다.
		// (이 작업이 곧 응답데이터를 클라이언트로 보내는 작업이 된다.)
		
		// 방법1: append()메서드 이용하기
		out.append("<html>")
		   .append("<head>")
		   .append("<meta charset='utf-8'>")
		   .append("<title>첫번째 Servlet 연습</title>")
		   .append("</head>")
		   .append("<body>")
		   .append("<h1 style='text-align:center;'>")
		   .append("안녕하세요. 첫번째 Servlet 프로그램입니다.<br>")
		   .append(" 실행 Servlet : " + request.getContextPath())
		   .append("</h1></body></html>");
	}
	
	// doPost()메서드 ==> POST방식의 요청을 처리하는 메서드
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws
    ServletException, IOException {
		doGet(request, response);
	}

}

0개의 댓글