클래스정의
멤버변수 작성법
접근제한자 변수명 : 데이터타입 = 기본값
예)
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(의존관계) : 한 객체가 다른객체를 소유하지는 않지만, 다른객체의 변경에
따라서 같이 변경을 해주어야 한다.
⑴ 다른 객체를 파라미터로 받아서 그 메서드를 사용한다.
⑵ 객체의 메서드 안에서 다른 객체를 생성해서 리턴한다.
1.서블릿(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의 기본적인 동작 과정
Web Service의 기본적인 동작 과정
HTML Form -> Servlet -> HTML Page
1. 사용자가 웹 페이지 form(HTML Form)을 통해 자신의 정보를 입력한다. (Input)
2. Servlet의 doGet() 또는 doPost() 메서드는 입력한 form data에 맞게 DB 또는 다른 소스에서 관련된 정보를 검색한다.
3. 이 정보를 이용하여 사용자의 요청에 맞는 적절한 동적 컨텐츠(HTML Page)를 만들어서 제공한다. (Output)
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);
}
}