'2015/08'에 해당되는 글 24건

  1. 2015.08.05 의존 객체 관리
  2. 2015.08.05 자바 해시맵(HashMap)
  3. 2015.08.05 프런트 컨트롤러(Front Controller)
  4. 2015.08.01 프로세스의 상태(state)

의존 객체 관리

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
,

자바 해시맵(HashMap)

JAVA 2015. 8. 5. 18:29

자바 해시맵(HashMap)

해시맵(HashMap)과 해시테이블(HashTable)을 정의하면 "키에 대한 해시 값을 사용하여 값을 저장하고 조회하며, 키-값 쌍의 개수에 따라 동적으로 크기가 증기하는 associative array"라고 할 수 있다. 

어떤 수들 N에 대하여 M크기만큼의 배열을 만들고 해시함수를 통해 index를 계산해서 O(1) 시간에 접근 가능하게 만든다. 다음은 간단히 해시 함수 함수를 구현한 것이다.

1
int index = X.hashcode() % M;
cs


해시 충돌(Hash Collision)

해시함수를 통해 계산된 index값에 이미 다른 자료가 저장되어 있는 경우 이를 해시 충돌이라고 한다. 


자바에서 해시 충돌을 막는 두 가지  방법

Open Addresing 방법

데이터를 삽입하려는 해시 버킷이 이미 사용 중이라면 다른 해시 버킷에 해당 데이터를 삽입하는 방식이다. 데이터를 저장, 조회할 해시 버킷을 찾을 때는 선형 검색법(linear probing), 2차 검색법(quadratic probing) 등의 방법을 사용한다. 

* Open Addressing을 해결하는 4가지 방법

(1) 선형 탐사

해시 함수로부터 얻어낸 주소에 이미 다른 데이터가 입력되어 있음을 발견하면, 현재 주소에서 고정 폭(예를 들면 1)으로 다음 주소로 이동합니다.

(2) 제곱 탐사

선형 탐사가 다음 주소를 찾기 위해 고정폭만큼 이동하는 것에 비해 제곱 탐사는 이동폭이 제곱수로 늘어나는 것이 다르다.

(3) 이중 해싱

클러스터 방지를 위해, 2개의 해시 함수를 준비해서 하나는 최초의 주소를 얻을 때 또 다른 하나는 충돌이 일어났을 때 탐사 이동폭을 얻기 위해 사용

(4) 재해싱

해시 테이블의 크기를 늘리고, 늘어난 해시 테이블의 크기에 맞추어 테이블 내의 모든 데이터를 다시 해싱하는 것


Seperate Chaining 방법

해시함수를 통해 도출된 인덱스가 서로 같은 자료들을 연결 리스트(Linked List)로 연결하는 방법이다.

자바 7까지는 해시충돌난 자료들을 연결리스트로 연결했지만, 자바 8에서는 자료의 개수가 8개 이상이 될 때는 트리 형태로 만든다. 또 6개로 줄어들면 다시 링크드 리스트로 만든다. 해시 충돌 나는 자료들의 개수가 많아지면 트리를 통해 특별한 저장공간을 사용하지만 빠른 성능으로 값을 찾아낼 수 있다. 



'JAVA' 카테고리의 다른 글

자바 제네릭(Generic)이란?  (0) 2015.08.06
자바 리플랙션(Reflection) API  (0) 2015.08.05
자바 문자열  (0) 2015.07.26
자바가 확장한 객체지향  (0) 2015.06.30
자바와 객체지향  (0) 2015.06.30
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
,

프로세스의 상태(state)

OS 2015. 8. 1. 23:11

프로세스(Process) 

"메모리에 로드되어 실행중인 프로그램"

Register set = 프로세스 실행을 위해 필요한 데이터들로 채워진다.


실행해야 할 프로세스 여러개라면 멀티 프로세스는 모든 프로세스를 일단 실행시킨 후 운영체제의 스케줄러에 의해 프로세스들을 관리한다.


일반적으로 프로그램은 많은 시간을 I/O(입출력)에 할당한다. 

프로그램이 I/O 를 하고 있을때 CPU는 일을 하지 않고 가만히 있는다.

(이때 스케줄러가 다른 프로세스로 교체를 하여 CPU를 쉬지 않게 하는것이 멀티 프로세스 기반이다)


다음은 이러한 CPU 자원을 사용하는 프로세스의 상태변화 메커니즘이다.


1. S(Start) : 프로세스 생성 -> Ready

프로세스는 생성과 동시에 Ready 상태로 들어간다.

Ready 상태에 있는 프로세스는 CPU(정확히 말하면 운영체제의 스케줄러)에 의해 실행되기를 기다린다.


2. Ready -> Running

Ready 상태에 있는 프로세스들은 스케줄러에 의해 관리된다.

스케줄러는 Ready 상태에 있는 프로세스중 하나를 선택해서 CPU에 의해 실행될 수 있도록 한다. (스케줄링 알고리즘 기반)

스케줄러에 의해 선택된 프로세스는 Running 상태가 되어 실행된다.


3. Running -> Ready

일의 중요도에 따라 프로세스들은 생성시 우선순위(Priority)가 매겨진다.

우선순위가 더 높은 프로세스가 Ready 상태에 있다면 스케줄러는 실행중인 프로세스를 Ready상태로 내리고 실행시킨다. Ready 상태로 간 프로세스는 우선순위가 더 높은 프로세스가 종료되기만을 기다린다.


4. Runnimg -> Blocked

실행 중에 있는 프로세스가 실행을 맘추는 상태(Blocked)로 들어간다.

I/O 에 관련된 일을 하는 경우(CPU에 의해 더이상 실행될 수 없다) 스케줄러는 Blocked 상태로 프로세스를 내리고 Ready 상태인 프로세스 중 하나를 실행시킨다.


5. Blocked -> Ready

Blocked 상태는 스케줄러에 의해서 선택될 수 없다.

따라서 Blocked 에 있는 프로세스는 다시 실행될 수 있는 Ready 상태로 간다.

예) :  I/O 가 완료된 프로세스


6. Blocked -> E(Exit)

프로세스를 종료시킬 경우 Blocked 상태를 거쳐 E(Exit)상태로 간다.


컨텍스트 스위칭(Context Switching)

CPU 내에 존재하는 레지스터들은 현재 실행 중에 있는 프로세스 관련 데이터들로 채워진다.

스케줄러에 의해 실행중인 프로세스가 변경되면 CPU 내의 존재하는 레지스터들도 컨텍스트 

스위칭에 의해 데이터를 변경한다.

(참고 : 실행되는 프로세스의 변경과정에서 발생하는 컨텍스트 스위칭은 레지스터 갯수가 많을수록 프로세스별로 관리되어야 할 데이터 종류가 많을수록 시스템에 많은 부담을 준다)


참조 : http://dakuo.tistory.com/80


'OS' 카테고리의 다른 글

뮤텍스와 세마포어 차이  (3) 2015.07.31
컨텍스트 스위칭 - Context Switching  (0) 2015.07.31
동기와 비동기  (0) 2015.07.31
프로세스와 스레드 차이  (0) 2015.07.31
데드락 교착상태  (0) 2015.07.31
Posted by slender ankles
,