'2015/08/05'에 해당되는 글 4건

  1. 2015.08.05 자바 리플랙션(Reflection) API
  2. 2015.08.05 의존 객체 관리
  3. 2015.08.05 자바 해시맵(HashMap)
  4. 2015.08.05 프런트 컨트롤러(Front Controller)

리플랙션(Reflection)

"어떤 것에 대한 설명 또는 묘사" "거울 등에 미친 모습"

자바에서는 클래스 메서드의 내부 구조 를 들여다 볼 때 사용하는 도구라는 뜻

구체적인 클래스 타입을 알지 못해도, 컴파일된 자바 바이트 코드를 이용하여 역으로 클래스에 대한 정보를 알아내어, 클래스를 사용할 수 있는 기법을 말한다. 마치 거울에 비친 모습과 비슷하다고 하여 리플랙션이라는 이름이 붙여진 것


Class.newInstance()                   주어진 클래스의 인스턴스를 생성

Class.getName()                       클래스의 이름을 반환

Class.getMethod()                     클래스의 선언된 모든 public 메서드의 목록을 반환

Method.invoke()                        해당 메서드를 호출

Method.getParameterTypes()         메서드의 매개변수 목록을 배열로 반환



리플랙션 API가 필요한 이유는 무엇일까?

코드의 재사용성 및 유지보수를 쉽게 하기 위해서 서블릿에서 클래스 파일을 분리시키는데요.

이렇게 되면, 원래의 클래스명과 타입같은 것을 알아내기가 힘들어집니다. 하지만 리플렉션 api를 이용해서 class의 이름이나 타입 등을 알아낼 수 있는데, 이렇게 되면 모델, 뷰, 컨트롤러를 분리하는 코드를 만들기가 쉬워집니다.

스프링에서는 리플렉션이 컨트롤러에 구현되어 있다고 할 수 있습니다. 


추가적으로, Junit과 같은 테스트 라이브러리에서는 reflection api를 통해서 불특정 클래스를 불러와서 실행시키거나 하는 동작에도 유용하게 사용된다고 합니다.



'JAVA' 카테고리의 다른 글

자바 Null Pointer Exception막는 방법  (0) 2015.08.18
자바 제네릭(Generic)이란?  (0) 2015.08.06
자바 해시맵(HashMap)  (0) 2015.08.05
자바 문자열  (0) 2015.07.26
자바가 확장한 객체지향  (0) 2015.06.30
Posted by slender ankles
,

의존 객체 관리

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
,