DI와 AOP에 대해 간략히 알아보자.

Spring Framework 개요.



Spring 프레임웍은 DI,AOP와 같은 기능도 지원하고 있다.

● DI
DI 또는 Ioc(inversio Of Control) 패턴은  객체 간의 의존성을 최소화하여 관리해 주는 방식이다. 위 그림에서 Core 부분의 Ioc container에 해당한다.

그럼 여기서 의존성은 무엇일까.
예를 들어, 서비스 레이어와 DAO 레이어가 있다고 하였을 경우 서비스 레이어에서 DAO 레이어를 사용하여 구현된다고 할때,


서비스 레이어에서는

TestServiceImpl
public class TestServiceImpl {
    TestDAO testDAO = new ATestDAOImpl();
....
}

라고 직접 생성을 해야 한다.

TestServiceImpl -> ATestDAOImpl

그림으로는 TestDAO와 의존성이 있는걸로 보이지만 위처럼, ATestDAOImpl 클래스의 객체에 의존하게 된다. 이와 같은 관계가 되는 것을 의존성이라 한다.

하지만 이와 같이 직접 호출하는 것은 단위테스트가 어려워진다. TestServiceImpl 클래스를 테스트 하기 위해서는 반드시 정상 작동하는 ATestDAOImpl 클랙스가 존재해야 한다.
또한, ATestDAOImpl 클래스가 이름이 바뀌었을 경우 해당 소스 전체를 수정하고 컴파일해야 하는 문제점이 있다.

이런 의존 관계를 해결 하는 방법이 DI 이다. (해결 방법으로는 Factory 패턴이나 JNDI 등을 사용할 수도 있다.)

DI 패턴은 직접생성하는 대신 외부에서 객체 사이의 의존관계를 설정해 준다.
Spring에서는 이런 DI 패턴 적용 방법을 설정파일로 제공하며, Annotation을 사용할 수도 있다.

DI 에는 3가지로 나뉜다. Setter Injection, Constructor Injection, Method Injection 으로 나뉜다.
Setter Inject은 사용하고자 하는 Bean 에 Setter 가 존재하여 applicationContext*.xml에 설정하여 클래스를 전달하는 방식이다.

public class TestServiceImpl {
private TestDAO testDAO;

//Setter Injection
public void setTestDAO(TestDAO testDAO){
this.testDAO = testDAO;
}

//생성자를 이용한 Constructior Injection
public TestServiceImpl(TestDAO testAO) {
this.testDAO = testDAO;
}
........
}


<bean id="testService"

class="srue.TestService">

             <constructor-arg >

                           <ref local="aTestDAO"/>    <!-- Constructior Injection -->

             </constructor-arg>

             <property name=" testDAO" ref="aTestDAO" />   <!-- Setter Injection -->

</bean>

 

<bean id="aTestDAO"

class="srue.ATestDAOImpl" />



Setter Injection과 Constructior Injection 두가지 방식을 사용한 예이다.


위와 같이 XML 로 넘기기 때문에  의존성이 TestDAO에만 가지고 ATestDAOImpl에는 의존성이 없어진다. 그래서 의존성을 최소화 할 수 있고, 설정 파일 변경 만으로 ATestDAOImpl 파일 변경이라던지 BTestDAOImpl로 변경이라던지가 가능해 진다.


● AOP

Aspect Oriented Programming 관점 지향 프로그래밍? 무슨 말일까?

AOP는 공통적으로 사용하는 것들에 대한 의존 관계의 복잡성과 코드의 중복을 해소해 주는 프로그래밍 기법니다. 공통적으로 어플리케이션 전반적으로 사용하게 된다면 상속이나 패턴등 객체지향기법등으로는 한계에 부닥친다. 공통 모듈 사용이 많을 수록 의존관계가 더 심해질 것이다.

먼저 AOP에서 주로 사용하는 용어를 정리해 보자.

Aspect : 여러 객체에 공통적으로 적용되는 공통 관심사항. 예:트랜잭션이나 보안 등

Advice: Aspect를 핵김 로직에 적용할지 정의. 예 : 메소드 호출전에 트랜잭션 시작.

Joinpoint : Advice 적용 가능한 지점. 예: 메소드 호출, 필드값 변경

Pointcut : Joinpoint 의 부분집합. Advice가 적용되는 Joinpoint

Weaving : Adivce를 핵심로직 코드에 적용하는 것.

중요한 점은 Aspect가 핵심로직 구현 클래스에 의존하지 않는다는 것이다. 설정 파일이나 설정 클래스 등을 이용하여 Aspect를 여러 클래스에 적용할 수 있도록 하고 있다,

 <bean id="logging" class="srue.LogginAspect" />

 <aop:config>
        <aop:pointcut id="managerTx" expression="execution(* *..*Service.*(..))" />
        <aop:aspect id="loggingAspect" ref="logging">
<aop around pointcut-ref="managerTx" method="logging" />
        </aop>
 </aop:config>







변수명
첫글자는 문자로 시작 되어야 하며,
두번째 문자부터 영문자, 숫자, _ 를 사용할 수 있다.

예약어
아래와 같은 문자는 예약어 이므로 변수명으로 사용할 수 없다.
>>> import keyword
>>> keyword.kwlist     # 예약어 목록을 보여준다.
['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'exec', 'finally',  'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'not', 'or', 'pass', 'print', 'raise', 'return', 'try', 'while', 'with', 'yield']


※ 변수 만들 때, 내장 함수 이름이나, 모듈 이름은 피하는 것이 좋다. 같은 이름으로 지정시 함수를 만들고 다시 변수로 지정시, 함수를 사용할 수 없게 된다.

줄바꾸기
>>> if(a == 1) and     # 다음 라인과 하나로 간주한다.
     (b == 3) :
 print 'test'

값 할당.
>> x = y = z = 0  # 여러 개를 같은 값 0으로 치환.
>> c, d = 3, 4    #여러개를 한꺼번에.
>> a = 3.1; b = 3.4    # ; 로 구분.

그러나
>> a = (b = c + d)
는 안된다.

새로운 값으로 치환되고 변수 형을 따로 지정하지 않으므로 문자열<-> 숫자 로 변형이 자유롭다.

>>> a = 1
>>> type(a)     # 자료형 확인
<type 'int'>
>>> a = 'Hello'
>>> a
'Hello'
>>> type(a)
<type 'str'>
>>>

변수명과 객체
다른 언어와 달리 a = 1 일 경우 숫자 1이 a라는 변수에 저장되는 것이 아니다.
a를 이름 1을 객체라고 한다.
그래서 a, 1 은 별도로 존재하며 a 가 1을 가르키는 형태로 되어 있다.


자료형

 자료형 설명 예 
 수치형(Number) 정수, 롱형, 실수, 복소수 등 표현   1,13L, 14.2, 1+2j
 문자열  문자  'aa'
 리스트  순서를 가지는 임의 객체의 집합  ['aa','bb']
 사전  순서를 가지지 않는 객체의 집합. 키 값으로 꺼냄. 자바의 Map 과 비슷.  {'aa':1, 'bb':2}
 튜플  순서를 가지는 임의의 객체의 집합.
 내용변경이 안됨
('aa', 'bb') 
 파일 파일에 자료를 입출력하기 위한 객체 f = open('aa') 

문자열
>>> str = 'Hello World'
>>> str[0], str[1]
('H', 'e')
>>> str[1:3]
'el'
>>> str[:]
'Hello World'
>>> str[:2]
'He'
>>> 'H' * 2
'HH'
>>> str[0] = 1         # 값은 변경 되지 않는다.
Traceback (most recent call last):
  File "<pyshell#29>", line 1, in <module>
    str[0] = 1
TypeError: 'str' object does not support item assignment
>>>


리스트
>>> list = [1,2,3]
>>> len(list)
3
>>> list[1]    # 0부터 시작한다.
2
>>> list[-1]
3
>>> list[1:3]
[2, 3]
>>> list + list
[1, 2, 3, 1, 2, 3]
>>> list = range(10)
>>> list
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list[::2]     # :: 두개면 2개 건너 뛰어서 값을 가져옴.
[0, 2, 4, 6, 8]
>>> list[::-1]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
>>> 4 in list
True
>>> list.append(4)      # 추가하고 싶을때
>>> list
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 4]
>>> del list[0]    #  값 삭제
>>> list
[1, 2, 3, 4, 5, 6, 7, 8, 9, 4]
>>> list.reverse()   #  순서 바꾸기
>>> list
[4, 9, 8, 7, 6, 5, 4, 3, 2, 1]
>>> list.sort()    #오름 차순 정렬
>>> list
[1, 2, 3, 4, 4, 5, 6, 7, 8, 9]
>>>


튜플
리스트와 비슷하다. 차이점은 값을 변경 하지 못한다.
>>> t = (1,2,3)
>>> t[0] = 100
Traceback (most recent call last):
  File "<pyshell#51>", line 1, in <module>
    t[0] = 100
TypeError: 'tuple' object does not support item assignment
>>>


사전
>>> d = {'a':1, 'b':2}
>>> d['a']
1
>>> d['c'] = 3
>>> d
{'a': 1, 'c': 3, 'b': 2}
>>> d['a'] = 1.0
>>> d
{'a': 1.0, 'c': 3, 'b': 2}
>>> 'a' in d
True
>>> d.keys()
['a', 'c', 'b']
>>> d.values()
[1.0, 3, 2]
>>> d.items()
[('a', 1.0), ('c', 3), ('b', 2)]
>>>

'Language > Python' 카테고리의 다른 글

[Python] 3. 파이썬의 자료형과 기본 문법.  (0) 2009/07/14
[Python] 1. 파이썬 설치  (0) 2009/07/14
[Python] 2. 파이썬 기본 문법 공부.  (0) 2009/07/14



Language/Python | Posted by 스루 2009/07/14 17:53

[Python] 1. 파이썬 설치


다운로드 : http://www.python.org/download/
맞는 운영체제를 선택하여 다운로드하자.


윈도우 바이너리 버전을 받았다.  2.6.2 버전.
별 무리 없이 next 만으로 finish.

설치가 끝나고 시작->프로그램 에 Python 2.6 dl 생겼다.

메뉴들 간략 설명.
 IDLE(Python GUI)  파이썬 표준의 GUI 대화식 인터프리터.
 Module Docs  파이썬 2.1 이상에서 지원한다.
원하는 모듈을 쉽게 찾을 수 있는 도구.
 Python(command line)  도스 창에서 수행되는 파이썬 대화식 인터프리터. 
 Python Manuals  파이썬 온라인 문서 모음.
 Uninstall Python  파이썬 삭제시 사용.


환경변수 셋팅.
path 에 설치한 파이썬 홈을 추가한다.

path 에 추가함으로 command 에서
$python

입력시

$python
>>

으로 실행이 된다.


PYTHONPATH
를 추가한다.
추가한 폴더는 나중에 모듈을 검색할때 기본 적인 폴더 이외에
파이썬에서 모듈을 검색하는 폴더로 추가한다.
확인 방법.
>>import sys
>> sys.path

'Language > Python' 카테고리의 다른 글

[Python] 3. 파이썬의 자료형과 기본 문법.  (0) 2009/07/14
[Python] 1. 파이썬 설치  (0) 2009/07/14
[Python] 2. 파이썬 기본 문법 공부.  (0) 2009/07/14



Language/Python | Posted by 스루 2009/07/14 17:07

[Python] 2. 파이썬 기본 문법 공부.



프린트 하기.

>> print 'Hello World'
Hello World
>> print 1; print 2    # ; 를 붙이면 줄바꿈 된다.
1
2
>> print 1,; print 2     #, 를 붙이면 줄바꿈하지 않는다.
1 2

3.0 버전 이상에서는

>> print ('aaa')

형식으로 가로를 넣어주어야 한다.

산술 연산.
기본적인 다른 것과 같다.
+(덧셈). -(뺄셈). *(곱하기) /(나누기), %(나머지)

>> 4 + 5 * 9
49
>> 8.0 / 3.0     # 실수형 연산은 결과도 실수형, 두 수중 하나만 실수여도 실수이다.
2.6666666666666665
>> -9 / 5    # 5 * (-2) + 1 과 같은 형식으므로.
-2
>> 2 ** 3     # ** 는 지수 연산자.
8
>> 2 ** 3 ** 4    # 숫자가 커지면 자동으로 롱(Long)형 정수로 변환된다.
2417851639229258349412352L
>>> a = 1 + 3j     # 복소수를 표현할 수 있다. 허수부 뒤에는 'j'가 붙는다.
>>> b = 2 - 2j
>>> a * b
(8+4j)


종료하기
Ctrl + D
윈도우 Command 에서는 Ctrl + D가 안먹었다.
>>imort sys
>>sys.exit()
로 해야 된다. 무슨 차이인지는 잘....


파이썬 버전 알아보기
>>> import sys
>>> sys.version
'2.6.2 (r262:71605, Apr 14 2009, 22:40:02) [MSC v.1500 32 bit (Intel)]'
>>> sys.version_info
(2, 6, 2, 'final', 0)

파이썬 파일 실행시키기
IDLE(Python GUI) 로 작업하였다.
File-New Window 를 하여 새창에서
소스를 적는다.
import calendar
calendar.prmonth(2001, 3)


File-Save 를 하여 cal.py로 저장하였다.

Command 창에서

$python cal.py
     March 2001
Mo Tu We Th Fr Sa Su
                 1   2   3   4
 5    6    7   8   9  10  11
12  13  14  15  16  17 18
19  20  21  22  23  24 25
26  27  28  29  30  31

위와 같이 결과가 출력된다.


다른 모듈에서 모듈파일 실행하기.

>> execfile('modfile.py')    # 모듈은 .py로 끝나야 한다.  파일을 수행시킨다.

또는

>> import modfile      #.py 생략. 모듈에 있는 내용을 모듈 이름을 통하여 사용한다.

'Language > Python' 카테고리의 다른 글

[Python] 3. 파이썬의 자료형과 기본 문법.  (0) 2009/07/14
[Python] 1. 파이썬 설치  (0) 2009/07/14
[Python] 2. 파이썬 기본 문법 공부.  (0) 2009/07/14



Srue | Posted by 스루 2009/07/06 23:49

[맛집/성수] 성수족발


저녁에 맛난걸 먹자 해서 인터넷에 찾다가 간곳.

집에서도 가깝고 맛도 좋은 성수 족발.

족발 자체를 별로 좋아하지는 않는데 맛나서 줄서서 먹는다 하여 궁금해서 먹어 보기로 했다.

일정이 넘 늦게 끝나서 8시가 넘어 버렸다. 성수까지 갈려면 1시간이 족히 걸리는 시간이라 고민을 해야 했다.

일단 찾았으니 먹어 보자 하여 출발~.

역시나 줄을 서서 기다리고 있었다.

그래도 앞에 세팀. 기다리다만 하다 생각하여 기다렸다.

한 40분 정도 기다린거 같다.

특 대 - 35,000원
대 - 30,000원
중 - 25,000원

가격이 첨에 좀 쎄다고 생각했다.

근데 양이 실로... 엄청나다 ;;

남자 둘이 왔는데 족발을 싸가는 팀이 있었다. 그냥 그 분들이 적게 먹는 사람인가 보다 했는데-

아니었다. 실로 양은 엄청나다 ㅋ



기본 셋팅이다.

무난하다~.

족발이 나왔다. 이게 중자다....





윤기가 장난 아니다.

막 삶은 족발이라 정말 부드럽다

직접 삶아서 주는 족발은 첨이라 실로 정말 맛있었다.

둘이 먹기엔 넘 많은 양이라 중간에 뼈를 발라 먹고 고기를 싸왔다.

껍질이 많기 때문에 느끼할 수도 있겠다. 맛도 단맛이 많이 나서 많이는 못먹겠더라.

그래도 기다려서 먹어본 집 중에서는 보람을 느낄 수 있는 그런 집중에 하나였다.

그러나 둘이서 보다는 셋이서 먹기가 딱 좋은 ....... ㅋ

포장 해서 집에 가서 여럿이 먹어도 좋을꺼 같다.

너무 배불러서 만족도가 조금은 떨어진 집.


찾아가는 길.
성수역 1번 출구 직진 해서 약국에서 우회전 해서 걸으면.....간판이 보인다. 자그마한 집이다.
5시 이후에는 무조건 기다린다고 한다. ㅋ