'ServletJDBC'에 해당되는 글 13건

  1. 2015.08.05 의존 객체 관리
  2. 2015.08.05 프런트 컨트롤러(Front Controller)
  3. 2015.07.20 DB커넥션풀 - DB Connection Pool
  4. 2015.07.20 DI 와 IoC
  5. 2015.07.20 DAO - Data Access Object
  6. 2015.07.20 서블릿 데이터 보관소
  7. 2015.07.20 JSP 프리컴파일
  8. 2015.07.20 MVC
  9. 2015.07.12 Statement vs PreparedStatement
  10. 2015.07.12 서블릿(Servlet) 기초2

의존 객체 관리

ServletJDBC 2015. 8. 5. 18:40

의존 객체 관리

MemberListController => 멤버의 출력을 담당하는 컨트롤러, MemberDao => 멤버의 데이터베이스 관리를 담당하는 모델


예를들어, 

MemberListController가 작업을 수행하려면 데이터베이스로부터 회원 정보를 가져다줄 

MemberDao가 필요합니다. 이렇게 특정 작업을 수행할 때 사용하는 객체를 "의존객체"라고 하고, 

이런 관계를 "의존 관계(Dependency)"라고 한다.

의존객체를 필요할 때마다 생성하는 고전적인 방법, 외부에서 의존객체를 주입해주는 비교적 최근의 방법 등이 있다.


의존 객체와의 결합도 증가에 따른 문제

1) 코드의 잦은 변경

객체를 사용하는 쪽에서 결합도가 높아져 의존 객체나 보관소에 변경이 발생하면 바로 영향을 받는다.

2) 대체가 어렵다

의존 객체를 다른 객체로 대체하기가 쉽지 않다. MySQL을 사용하다가 oracle DB로 바꾸게 되면 일부 SQL문을 수정해야 한다.

다른 방법으로는 데이터베이스별로 DAO를 준비하는 것이다.

인터페이스와 보관소를 이용하여 DAO를 보다 쉽게 교체하게 만들 순 있지만, 이방식으로도 보관소에 종속되는 문제를 피할 순 없다.


의존 객체를 외부에서 주입

우리 사회는 자급자족이 아니라 남이 만든 것을 가져다 쓴다. 노트북도 우리가 만들었나? 아니다. 

방법은 의존 객체를 전문으로 관리하는 "빈 컨테이너(Java Beans Container)"를 사용하는 것

(빈 컨테이너라는 개념은 스프링에서 사용하는 개념입니다. 빈 = 객체라고 보면 됨)

빈 컨테이너는 객체가 실행되기 전에 그 객체가 필요로 하는 의존 객체를 주입해주는 역할을 수행

이런 방식으로 의존 객체를 관리한느 것을 "의존성 주입(DI : Dependency Injection)"이라 합니다.

일반적인 말로는 "역제어(IoC : Inversion of Control)"라고 부릅니다.



인터페이스를 이용한 결합도 감소 방법



위의 그림과 같이 의존 객체를 사용 할 때 구체적으로 클래스 이름을 명시하는 대신 인터페이스를 사용하면, 

그 자리에 다양한 구현체(인터페이스를 구현한 클래스)를 놓을 수 있음. 즉 인터페이스라는 문법으로 DAO가 

갖춰야 할 규격을 정의하고,  그 규격을 준수하는 클래스라면 어떤 클래스를 상속 받았는지 따지지 않고 

허용하는 것.





'ServletJDBC' 카테고리의 다른 글

프런트 컨트롤러(Front Controller)  (0) 2015.08.05
DB커넥션풀 - DB Connection Pool  (0) 2015.07.20
DI 와 IoC  (0) 2015.07.20
DAO - Data Access Object  (0) 2015.07.20
서블릿 데이터 보관소  (0) 2015.07.20
Posted by slender ankles
,

프런트 컨트롤러(Front Controller)

프런트 컨트롤러라는 디자인 패턴을 이용하여 MVC를 좀 더 유지보수 하기 쉽게 만든다.

프런트 컨트롤러와 페이지 컨트롤러의 호출규약을 통해 페이지 컨트롤러를 서블릿에서 분리하여 일반 클래스로 만듦 

일반 클래스로 만들면 서블릿에 종속적이지 않아서 유지보수하기 쉬움





<<page controller를 servlet을 상속받지 않고 일반 클래스로 분리하기 위해 Map객체를 만들어 

서로 호출규약을 지키는 방법>>




'ServletJDBC' 카테고리의 다른 글

의존 객체 관리  (0) 2015.08.05
DB커넥션풀 - DB Connection Pool  (0) 2015.07.20
DI 와 IoC  (0) 2015.07.20
DAO - Data Access Object  (0) 2015.07.20
서블릿 데이터 보관소  (0) 2015.07.20
Posted by slender ankles
,

DB 커넥션풀

DB 커넥션 객체를 여러 개 생성하여 풀(Pool)에 담아 놓고 필요할 때 꺼내 쓰는 방식


풀링(Pooling)

자주 쓰는 객체를 미리 만들어 두고, 필요할 때마다 빌리고 사용한 다음 반납하는 방식

여러 개의 객체를 모아둔 것을 "객체 풀(object pool)", 여러 개의 DB 커넥션 객체를 관리하는 것을 "DB 커넥션풀"


DB 커넥션풀이 필요한 이유

"Statement는 롤백이 안 된다!"

다음은 싱글 커넥션 사용의 문제점이다.



위의 그림에서 DAO 1, 2, 3이 사용하는 Statement는 같은 커넥션에서 생성한 객체

SQL문을 실행하다 보면 DAO3처럼 예외에 발생했을 때 이전 상태로 되돌려야 하는 경우가 있다. 

이렇게 작업하기 전 상태로 되돌리는 것을 "롤백(RollBack)"이라고 하는데, Statement객체에는 롤백 기능이 없다.

커넥션 객체를 통해서만 롤백이 가능하다. 그래서 DAO3이 롤백하면 문제 없이 수행된 DAO1, 2 역시 롤백 된다.


따라서 각기 다른 커넥션 객체를 사용해야 원활히 롤백을 사용할 수가 있다. 

그렇기에 각 요청에 대해 개별 DB 커넥션을 사용해야 한다.


이를 해결하겠다고 SQL작업을 할 때마다 DB 커넥션 객체를 생성해야 되나?

실행 속도가 느려지고 많은 가비지(Garbage)가 발생하게 될 것이다. 속도가 느려지는 이유는 커넥션을 맺을 때마다 데이터베이스 서버는 사용자 인증과 권한 검사를 수행하고 요청 처리를 위한 준비 작업을 해야 하기 때문이다.

그래서 DB 커넥션풀을 사용해야 한다. 


DB 커넥션풀은 

1) 각 요청에 대해 별도의 커넥션 객체를 사용하기 때문에 다른 작업에 영향을 주지 않는다.

2) 사용한 DB 커넥션 객체는 버리지 않고 풀에 보관해 두었다가 다시 사용하기 때문에, 가비지가 생성되지 않고 속도도 빨라진다.



'ServletJDBC' 카테고리의 다른 글

의존 객체 관리  (0) 2015.08.05
프런트 컨트롤러(Front Controller)  (0) 2015.08.05
DI 와 IoC  (0) 2015.07.20
DAO - Data Access Object  (0) 2015.07.20
서블릿 데이터 보관소  (0) 2015.07.20
Posted by slender ankles
,

DI 와 IoC

ServletJDBC 2015. 7. 20. 18:24

DI 와 IoC ?

DI와 IoC는 스프링의 엄청 중요한 개념이라고 하는데, 아직 스프링에 대해서 자세히 알지는 못 하고 있기 때문에 우선

서블릿 프로그래밍에서 DI와 IoC의 개념을 이해 할 수 있는 예를 보면서 DI와 IoC에 대해서 설명해보겠다.


우리는 MVC 아키텍처를 구성하기 위해서는 모델 부분을 처리하는 DAO(Data Access Object)를 만들었다. 

하지만 이 DAO클래스는 서블릿이 아니다. DAO는 httpServlet 클래스를 상속하고 있지 않기 때문이다.

그래서 ServletContext를 사용 할 수 없다. 그러므로 당연히 DB의 커넥션 정보를 가져 올 수가 없다. 

이 문제를 해결하기 위해 Connection 객체를 주입 받기 위한 셋터 메서드와 인스턴스 변수를 준비해야 한다!


Connection conn;
 
public void SetConnection(Connection connection){
    this.connection = connection;
}
cs


이렇게 작업에 필요한 객체를 외부로부터 주입 받는 것을 

"의존성 주입(DI , Dependency Injection)" 이라고 한다. 

다른 말로 "역제어(IoC, Inversion of Control)" 라고도 부른다.



'ServletJDBC' 카테고리의 다른 글

프런트 컨트롤러(Front Controller)  (0) 2015.08.05
DB커넥션풀 - DB Connection Pool  (0) 2015.07.20
DAO - Data Access Object  (0) 2015.07.20
서블릿 데이터 보관소  (0) 2015.07.20
JSP 프리컴파일  (0) 2015.07.20
Posted by slender ankles
,

DAO(Data Access Object)

데이터베이스와 연동하여 데이터를 처리하는 부분을 말한다.

데이터베이스나 파일, 메모리 등을 이용하여 애플리케이션 데이터를 생성, 조회, 변경, 삭제하는 역할을 수행

** 보통 DAO는 하나의 DB 테이블이나 DB 뷰에 대응! ** 

물론 여러 개의 테이블을 조인(join)한 데이터를 다루기도 한다.





위의 그림에서 DAO는 모델 객체에 해당한다.


'ServletJDBC' 카테고리의 다른 글

DB커넥션풀 - DB Connection Pool  (0) 2015.07.20
DI 와 IoC  (0) 2015.07.20
서블릿 데이터 보관소  (0) 2015.07.20
JSP 프리컴파일  (0) 2015.07.20
MVC  (0) 2015.07.20
Posted by slender ankles
,

데이터 보관소

서블릿들이 서로 협력하여 작업을 수행 할 때, 데이터를 공유하는 방법을 알아보겠다.




ServletContext 보관소

웹 애플리케이션이 시작 될 때 생성되어 웹 애플리케이션 종료될 때까지 유지

이 보관소에 데이터를 보관하면 웹 애플리케이션이 실행되는 동안에는 모든 서블릿이 사용 할 수 있다.


HttpSession 보관소

클라이언트의 최초 요청 시 생성되어 브라우저를 닫을 때까지 유지

보통 로그인 할 때 이 보관소를 초기화하고, 로그아웃하면 이 보관소에 저장된 값들을 비운다.

이 보관소에 값을 보관하면 서블릿이나 JSP 페이지에 상관없이 로그아웃 하기 전까지 계속 값을 유지 가능


ServletRequest보관소

클라이언트의 요청이 들어올 때 생성되어, 클라이언트에게 응답 할 때까지 유지

이 보관소는 포워딩이나 인클루딩하는 서블릿들 사이에서 값을 공유 할 때 유용하다.


JspContext보관소

JSP 페이지를 실행하는 동안만 유지. 실제로 잘 쓸 일이 없음


'ServletJDBC' 카테고리의 다른 글

DI 와 IoC  (0) 2015.07.20
DAO - Data Access Object  (0) 2015.07.20
JSP 프리컴파일  (0) 2015.07.20
MVC  (0) 2015.07.20
Statement vs PreparedStatement  (0) 2015.07.12
Posted by slender ankles
,

JSP 프리컴파일

ServletJDBC 2015. 7. 20. 18:21

JSP는 왜 사용하는가?

MVC 아키텍처에서 뷰를 독립적으로 관리하기 위한 방법은 JSP를 사용하는 것이다. 

만약 서블릿에서 out.prinln()으로 html을 작성한다면? 근데 또한 수백줄의 html파일을 작성해야 하는 것이라면??

끔찍하다. 서블릿의 함수형태로 작성하는 것은 너무 비효율적인 방법이다. 또한 뷰와 컨트롤러 모델을 분리하기도 힘들다.




JSP 프리 컴파일(PreCompile) 이란 무엇인가?

보통의 JSP는 요청이 있을 때마다 서블릿 소스를 생성하고 컴파일하는 과정이 필요하다.

하지만, 실무에서는 웹 애플리케이션을 서버에 배치 할 때 모든 JSP파일에 대해 자바 서블릿 클래스를 미리 생성하기도 한다.

그 이유는 JSP실행 요청이 들어왔을 때, 곧바로 서블릿을 호출할 수 있기 때문이다. 이 것이 JSP 프리컴파일이다.

이 방식의 문제는 JSP를 편집하게 되면 서버를 다시 컴파일해야하는 점이다. 개발단계보다는 안정화, 배포단계에서 필요한 것.




서블릿에서 포워딩과 인클루딩에 대해서

화면 생성을 위해서는 서블릿에서 JSP로 작업을 위임해야 한다. 

이렇게 다른 서블릿이나 JSP로 작업을 위임 할 때 사용하는 객체가 RequestDispatcher이다. 

클래스이름("요청 배치 담당자")만 보더라도 어떤 쓰임이 있는 지 눈치 챌 수 있겠다.

이 객체는 HttpServletRequest를 통해 얻는다. 

실행을 위임하는 동작은 포워드(Forward)와 인클루드(Include)로 나뉜다.


포워드 ?

포워드로 위임하면 해당 서블릿으로 제어권이 넘어간 후 다시 돌아오지 않는다.


인클루드?

인클루드로 위임하면 해당 서블릿으로 제어권을 넘긴 후 그 서블릿이 작업을 끝내고 다시 제어권이 넘어온다.



'ServletJDBC' 카테고리의 다른 글

DAO - Data Access Object  (0) 2015.07.20
서블릿 데이터 보관소  (0) 2015.07.20
MVC  (0) 2015.07.20
Statement vs PreparedStatement  (0) 2015.07.12
서블릿(Servlet) 기초2  (0) 2015.07.12
Posted by slender ankles
,

MVC

ServletJDBC 2015. 7. 20. 18:00

MVC 아키텍쳐 란 무엇인가?

MVC(Model - View - Controller)로 아키텍처를 구성하여 프로젝트를 완성하는 것



컨트롤러(Controller) 컴포넌트의 역할

클라이언트의 요청을 받았을 때 그 요청에 대해 실제 업무를 수행하는 모델 컴포넌트를 호출하는 일

클라이언트에서 데이터를 보내왔다면 모델을 호출할 때 전달하기 쉽게 데이터를 적절히 가공하는 일

모델이 업무 수행을 완료하면, 그 결과를 가지고 화면을 생성하도록 뷰에게 전달하는 일

*즉, 클라이언트에 요청에 대해 모델과 뷰를 결정하여 전달하는 일*


모델(Model) 컴포넌트의 역할

데이터 저장소(예 : 데이터베이스, 디렉터리 서비스 등)와 연동하여 사용자가 입력한 데이터나 사용자에게 출력할 데이터를 다루는 일

특히 여러 개의 데이터 변경 작업(추가, 변경, 삭제)을 하나의 작업으로 묶은 트랜잭션을 다루는 일


뷰(View) 컴포넌트의 역할

모델이 처리한 데이터나 그 작업 결과를 가지고 사용자에게 출력할 화면을 만드는 일. 

즉, 뷰 컴포넌트는 HTML과 CSS, Javascript를 사용하여 웹 브라우저가 출력 할 UI를 만듭니다.


웹 프로젝트에서의 MVC의 실행 흐름


MVC 의 이점은 무엇인가?

높은 재사용성, 넓은 융통성

① 화면 생성 부분을 별도의 컴포넌트로 분리하였기 때문에, 모델과 컨트롤러 상관 없이 뷰 교체가 가능하다.

② 원 소스 멀티 유즈(One Source, Multi Use) , 모델 컴포넌트가 작업한 결과를 다양한 뷰 컴포넌트로 전달 가능

(HTML, XML, JSON 등등) 

③ 코드를 재 사용 할 수 있다. 화면을 바꾸거나 데이터 형식을 바꾸더라도 모델 컴포넌트는 그대로 재사용 가능


빠른 개발, 저렴한 비용

①다른 프로젝트에서도 모델 컴포넌트를 재사용 할 수 있기 때문에 개발 속도가 빨라진다. 또한 서버 개발자는 컨트롤러와 모델 개발에 집중하고, 뷰 개발자와의 작업을 분리 할 수 있다.


'ServletJDBC' 카테고리의 다른 글

서블릿 데이터 보관소  (0) 2015.07.20
JSP 프리컴파일  (0) 2015.07.20
Statement vs PreparedStatement  (0) 2015.07.12
서블릿(Servlet) 기초2  (0) 2015.07.12
서블릿기초1  (0) 2015.07.12
Posted by slender ankles
,

JDBC를 사용하기 위한 java.sql 의

Statement vs PreparedStatement 비교

비교항목 

 Statement

PreparedStatement 

실행 속도 

질의할 때마다 SQL문을 

컴파일한다. 

SQL문을 미리 준비하여 컴파일해둔다.

입력매개변수 값만 추가하여 서버에 전송한다.

특히 여러 번 박복하여 질의하는 경우, 실행 속도가 빠름 

 바이너리 

데이터 전송

불가능 

가능 

 프로그래밍 

편의성

SQL문 안에 매개변수 값이 포함되어 있어서 SQL 문이 복잡하고 매개변수가 여러 개인 경우 코드 관리가 힘들다. 

 SQL문과 입력 매개변수가 분리되어 있어서 코드 작성이 편리하다.


'ServletJDBC' 카테고리의 다른 글

JSP 프리컴파일  (0) 2015.07.20
MVC  (0) 2015.07.20
서블릿(Servlet) 기초2  (0) 2015.07.12
서블릿기초1  (0) 2015.07.12
서블릿이란?(Servlet)  (0) 2015.07.12
Posted by slender ankles
,

서블릿 클래스는 반드시 javax.servlet.Servlet인터페이스를 구현해야 합니다.

서블릿 컨테이너가 서블릿에 대해 호출할 메서드를 정의한 것이 Servlet 인터페이스입니다.


[서블릿 인터페이스]


서블릿의 생명주기

서블릿의 구동절차(생명주기)

(1) 클라이언트 요청이 들어오면 서블릿 컨테이너는 서블릿을 찾습니다.

(2) 만약 서블릿이 없다면, 서블릿 크래스를 로딩하고 인스턴스를 준비한 후 생성자를 호출합니다. 그리고 서블릿 초기화 메서드인 init()를 호출합니다.

(3) 클라이언트 요청을 처리하는 service()메서드를 호출합니다. 메서드 이름을 보면 이미 그 용도를 짐작 할 수 있습니다. 즉 클라이언트의 요청에 대한 서비스를 제공한다는 뜻입니다.

(4) service() 메서드에서 만든 결과를 HTTP프로토콜에 맞추어 클라이언트에 응답하는 것으로 요청처리를 완료합니다.

(5) 만약 시스템 운영자가 서블릿 컨테이너를 종료하거나, 웹 어플리케이션을 종료 한다면,

(6) 서블릿 컨테이너는 종료되기 전에 서블릿이 마무리 작업을 수행 할 수 있도록 생성된 모든 서블릿에 대해 destroy()메서드를 호출합니다.



제네릭서블릿(GenericServlet)이란?



HttpServlet이란?


제네릭 서블릿의 service()추상메서드까지 모두 구현되어있고,

요청 메서드에 따라서 doGet(), doPost(), doPut() 등등의 메서드를 나누어놓은 추상메서드를 구현하면 됩니다.

실제로 구현할 때는 HttpServlet을 활용하게 됩니다.


'ServletJDBC' 카테고리의 다른 글

MVC  (0) 2015.07.20
Statement vs PreparedStatement  (0) 2015.07.12
서블릿기초1  (0) 2015.07.12
서블릿이란?(Servlet)  (0) 2015.07.12
서블릿을 시작하기 전..  (0) 2015.07.12
Posted by slender ankles
,