'2015/07'에 해당되는 글 29건

  1. 2015.07.23 빅 오 분석법 O(n)
  2. 2015.07.20 DB커넥션풀 - DB Connection Pool
  3. 2015.07.20 DI 와 IoC
  4. 2015.07.20 DAO - Data Access Object
  5. 2015.07.20 서블릿 데이터 보관소
  6. 2015.07.20 JSP 프리컴파일
  7. 2015.07.20 MVC
  8. 2015.07.12 Statement vs PreparedStatement
  9. 2015.07.12 서블릿(Servlet) 기초2
  10. 2015.07.12 서블릿기초1

빅 오 분석법 O(n)

자신이 푼 코드의 시간효율과 공간복잡도에 대해서도 명확히 말할 수 있는 개발자가 진정한 개발자라고 생각한다. 

그런 의미에서는 시간 효율과 같은 경우에 대충 for문으로 때려 잡고 있던(사실 대개 반복문이 시간분석의 핵심이긴하다) 

나에게는 간단하지만, 정확하게 분석 할 수 있는 능력이 필요하다고 생각한다.


빅 오 분석법

"입력 값에 따라 무엇을 n으로 놓을지 결정하고 나면 n개의 입력된 값을 몇 번이나 확인해봐야 하는지를 n의 식으로 표현" 

여기서 확인하다??라는 것이 무엇인지 애매하다. 

일반적으로 입력된 값에 상수를 더한다거나 새로운 입력 아이템을 만든다거나 입력 값을 삭제한다거나 비교한다던가 하는 것을 "확인" 이라고 표현 할 수 있겠다. 

하나의 간단한 코드를 보면서 빅 오 분석법을 이해해보고자 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int findMax(int arr[], int n){
    /* 예외 처리 */
    if (n < 1)
        return -1;
    /* 비교 할 수 */
    int maxvalue = arr[0];
 
    /* 2번째 수 부터 끝까지 최대값과 비교해서 계속 갱신해준다.*/
    for (int i = 1; i < n; i++){
        if (maxvalue < arr[i])
            maxvalue = arr[i];
    }
    return maxvalue;
}
cs


위의 코드는 주어진 배열에서 최대값을 찾는 코드이다. 여러 방법이 있겠지만 그 중에 위의 코드는

최대값을 찾는 변수를 할당해 놓고 모든 수와 한 번씩만 비교해서 가장 큰 값을 반환하는 코드이다.

자, 입력된 항목의 자료들이 한 번 씩만 비교하면 되므로 O(n)의 시간복잡도가 계산된다. 

명확히 말하면 맨 처음에 자료가 0개인지 아닌지를 판별하는데 1이 소모 되었고,

maxvalue를 첫번째 원소로 초기화하는데 1이 소모 되었으므로 

O(n + 2)라고 할 수 있다. 하지만 2라는 상수는 충분히 커진 수에서는 별로 의미가 없다.

우리는 위의 코드처럼 고작 6개의 수가 얼마나 시간이 걸리는지를 계산할려고 시간복잡도를 구하는 것이 아니기

때문이다. 우리는 수백, 수억개의 숫자들 중에서 최대값을 찾는데 걸리는 시간에 대한 복잡도를 구하는 것이다. 

예를 들어 O(10000000000000 + 2)에서 2는 의미가 있나? 없다고 판단해도 된다.

그래서 시간 복잡도는 O(n)으로 계산되는 것이다. 


이중 for문에서도 비슷하게 계산 가능하다. 

상수 시간이 걸리는 부분은 과감히 생략되고 실질적으로 n개의 자료들이 이중 for문의 연산이 수행되면

O(n^2)이 된다. (블로그에 제곱 표기가 좋지 않아 이렇게 표현한다)



* 시간 복잡도를 구하는 방법 정리

1. 빅-오(Big-Oh)표기법

최악의 경우를 복잡도를 구하는 경우를 말한다. "최악의 경우 시간 복잡도는 O(n)이다" 이런식

2. 빅-오메가(Big-Omega) 표기법

빅 오와 반대되는 개념. 최선의 경우의 복잡도를 구하는 것을 말한다. "최선의 경우 Ω(n)이다."이런식

3. 세타(Theta) 표기법

빅오와 빅오메가의 중간인 평균적인 복잡도를 구하는 경우를 말한다.







'알고리즘' 카테고리의 다른 글

버블정렬  (0) 2015.09.26
재귀호출 - Recursive Call  (0) 2015.09.24
조합알고리즘의 최적화  (0) 2015.04.30
2차원 배열의 경우의 수 구하기  (0) 2015.04.28
증가하는부분수열(Longest Increase Subsequence)  (0) 2015.04.26
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
,

서블릿기초1

ServletJDBC 2015. 7. 12. 17:27

이클립스, JDK에 대한 설치는 했다고 가정합니다.


서블릿 프로젝트 생성하는 방법

eclipse 서블릿, JSP 기본 프로젝트 생성하는 방법

[File] -> [New] -> [Project..] -> Web -> Dynamic Web Project

=> Dynamic Web Project는 서블릿 및 JSP 기반 웹 어플리케이션을 만들 때 사용


왼쪽 하이라키의 서블릿 프로젝트의 각 파일들의 역할에 대해서 설명하겠습니다.

왼쪽 하이라키에는 Project Explorer, Package Explorer 등등이 있는데, 

Navigator에 대해서 설명하겠습니다.

Navigator가 없다면 [Window] -> [Show View] -> [Navigator]를 클릭하면 화면에 나타날 것임


[서블릿 프로젝트 구조의 예]


src 

자바 소스 파일을 두는 폴더. 앞으로 이 폴더에 서블릿 클래스나 필터, 리스터 등 필요한 모든 자바 클래스 파일 둘 것입니다. 프로퍼티(.properties)도 이 폴더에 둡니다.

build/classes

컴파일된 자바 클래스 파일(.class)이 놓이는 폴더입니다. 물론 패키지에 소속된 클래스인 경우 이 폴더에 해당 패키지가 자동으로 만들어집니다.

WebContent

HTML(.html),  CSS(.css), Javascript(.js), JSP, 이미지 파일 등 웹 콘텐츠를 두는 폴더입니다. 웹 애플리케이션을 서버에 배치할때 이 폴더의 내용물이 그대로 복사됩니다.

WebContent/WEB-INF

웹 애플리케이션의 설정과 관련된 파일을 두는 폴더입니다. 이 폴더에 있는 파일은 클라이언트에서 요청 할 수 없습니다. 따라서 HTML이나 Javascript, CSS 등 클라이언트에서 요청 할 수 있는 파일을 이 폴더에 두어서는 안 됩니다.

WebContent/WEB-INF/web.xml

웹 애플리케이션 배치 설명서(Deployment Descriptor)파일입니다. 영어 표현을 줄여서 'DD파일' 이라고도 부릅니다. 서블릿이나 필터, 리스너, 매개변수, 기본 웹 페이지 등 웹 애플리케이션 컴포넌트들의 배치 정보를 이 파일에 작성합니다. 서블릿 컨테이너는 클라이언트의 요청을 처리할 때 이 파일의 정보를 참고하여 서블릿 클래스를 찾거나 필터를 실행하는 등의 작업을 수행합니다. 자세한 설정 방법은 이후에 진행되는 과정을 통해 단계적으로 배우겠습니다.

WebContent/WEB-INF/lib

자바 아카이브(Archive)파일(.jar)을 두는 폴더입니다. 아카이브란? 우리말로 '기록보관소'라는 뜻입니다. 즉 아카이브 파일은 클래스 파일(.class)과 프로퍼티 파일(.properties)들을 모아 놓은 보관소 파일입니다. 이러한 이유로 Java ARchive의 합성어를 확장한 확장자 명(.jar)으로 사용하고 있습니다. 또한 'jar'단어 자체는 '단지'라는 뜻이 있습니다.

'ServletJDBC' 카테고리의 다른 글

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