블로그 이미지
Flying Mr.Cheon youGom

Recent Comment»

Recent Post»

Recent Trackback»

« 2025/7 »
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

 
 


대략적으로 알고 있었으나, 알고보니 잘못 알고 있었던 용어.



* 엔터프라이즈 : 실제적으로 데이터를 공유할 필요가 있는 영역을 지칭하는 개념, 컴퓨터 분야에서는 동일한 의미로 사용.

 - ERP ( Enterprise Resource Planning ) : 실제적으로 데이터를 공유할 필요가 있는 영역의 다양한 Rsource ( 예 : 사람, 기계, 절차 ) 에 대한 계획을 수행( Planning ) 하는 프로그램

 - EAI ( Enterprise Application Integration ) : 실제적으로 데이터를 공유할 필요가 있는 영역에 있는 애플리케이션의 통합과 관련된 프로그램 

 - ESB ( Enterprise Service Bus ) : 실제적으로 데이터를 공유할 필요가 있는 영역에 있는 다양한 서비스( 사용자가 원하는 기능을 제공하기 위한 기본 단위 )를 연결하는 프로그램


* 솔루션 : 엔터프라이즈의 구성단위이며, 개발자의 관점에서 단독적으로 수행가능한 기능 단위이다. ( 보안 솔루션, 사용자 인증 솔루션 등 )


* 애플리케이션 : 개발자의 관점에서 개발된 단위 작업 수행 프로그램을 말한다. 그러므로 한개의 솔루션은 여러가지 애플리케이션으로 구성될 수 있으며, 한 개의 애플리케이션은 여러가지 솔루션에 포함될 수 있다.



예.

 회사의 업무는 인사 업무, 재무 관리, 영업 관리로 이루어지고, 인사, 재무, 영업은 서로 자료를 주고 받으며 운영된다. 이때 전체를 총괄하는 것은 엔터프라이즈인데, 엔터프라이즈는 인사, 재무, 영업 솔루션으로 구성된다. 그 중에서 인사 업무 솔루션에 속하는 신입사원 등록, 경조사 관리 시스템 등과 같은 것은 애플리케이션이 된다.




'소프트웨어 공학' 카테고리의 다른 글

NHN 교육 기관 설립  (0) 2011.10.19
Spring 문서 정보  (0) 2011.06.21
:

 

0. 지난 시간 리뷰

소프트웨어에서 암호화를 활용하기 위해서는 키 관리가 매우 중요하다. 결국 암호화 키 Chip을 사용하거나 SSL 통신 채널을 활용하는게 안전하다.

실제 개발을 해보면 짧은 기간에 프로젝트를 완료해야 하므로, 리버싱이나 기타 보안에 대해 고려하면서 진행하기에는 어려운 부분이 있다. 개발 부서에서 보안관련 부분을 모두 챙기기 어려운 부분이 있으니 보안성 검토/검증을 서포트 해주는 인원이 필요하다.

 

1. 스마트폰 리버싱, 안드로이드/아이폰

루팅은 필요한가? 포렌식이나 증거물 찾을 때 필요하다. 또는 JTag을 활용한다.

루팅이 되면 제조사에 불이익이 있을텐데, 루팅을 정말 막지 못하는것일까? 아니면 OS 제공업체가 협조를 하지 않는 것일까?

http://www.elcomsoft.com ; http://www.elcomsoft.com/eppb.html ; 리버싱으로 법정에 선 최초 업체.

 

2. Practical Reversing ( Software Update )

Client/Server 상호 인증하는가? Binary 인증을 하는가? 둘중 하나라도 해야한다.

암호화 모듈로 된 부분은 분석 대상이 된다.

 

3. Practical Analysis ( Encrytion Software )

파일 암호화되어 있는 유틸을 해제해 본다. 파일내에 암호정보를 저장하고 있다. 이 부분을 확인하여 숨겨진 암호를 알아낸다.

 

:


강의 제목 : CBD ( Component Based SW Design )
강사 : 부산대 채흥석 교수


여기에 적는 수강 후기 내용은
참고 자료 없이 강의 완료( '12. 08. 31 ) 후 3일 후인 오늘 ( '12. 09. 02 )  기억에 남는 부분을 적은 내용이다.

SW 설계할 때, OO의 관점으로 바라 보았다.
Component는 그런 OO를 기능의 한 묶음으로, 좀 더 큰 범위로 응집해 SW를 설계 할 수 있다는 것을 이해했다.
기존에 알고 있었던, 어쩌면 추측 했었던 Component란 개념을 새롭게 알 수 있었던 좋은 기회였다.

교수님이 보내주신다는 CBD 책을 한번 더 읽어보고, 블로그에 좀 더 구체적으로 정리해볼 생각이다.
그 다음에 더 상위 레벨인 Product Line에 대해서 관심을 가져야겠다.
Domain Design보다 Product Line이 Component 기반설계보다 좀 더 큰 범위의 설계라 하셨다.

Component에 대한 핵심, 범위, 요구사항, 설계, 검증, 구현에 대해 간략히 적었다.
그리고 중간에 컴포넌트에서 중요시 하는 Interface에 대한 내용도 적었다.


[ 핵심 ]
* CBD의 핵심은 인터페이스다.
* CBD는 추상화가 되지 않는다.
* 그러나 인터페이스는 추상화나 상속이 가능하다.

[ Component 범위 ]
* 메소드와 특성을 하나의 연관성으로 집합 한 것이 클래스다.
* 그 클래스를 사용 가능한 단위로 집합한 것이 컴포넌트다.

[ Interface 사용 ]
* 컴포넌트는 인터페이스를 통해 연결된다.
* 정확히 말하자면, 인터페이스는 포트와 연결되며, 컴포넌트는 포트를 통해 인터페이스를 사용할 수 있다.

-> 컴포넌트1 - 포트1 - 인터페이스 - 포트2 - 컴포넌트2

* 포트라는 개념은 현재 언어에서 지원되는 것이 없다. 비슷하게 흉내내어 구현해야 한다.

* 포트라는 개념은 기존에 없던 새로운 개념이다.

* 포트를 예를 들어 설명하자면, 컴퓨터 본체에 있는 Keyboard포트, 모니터포트, 프린터 포트등을 생각하면 된다.

-> [ 모니터에 있는 D-SUB포트 ] 와 [ 본체에 있는 D-SUB 포트 ] 는 [ 모니터 Connecter ] 로 [ 서로 약속된 Data Interface ] 통해 GUI가 화면이 Display되는 것이다.

* 부가적인 설명으로, OO에서 일고 있던 인터페이스 개념과 유사하다, 하지만 포트와 맞물려 사용되기 때문에 OO에서 사용된 인터페이스와 같다고 할 수 없다. 새로운 관점에서 접근해야 한다.


[ Component RM ]

* 기존 OOAD 기법과 유사하게 적용할 수 있다. 

* 용어 선택에 주의해야 한다.

* UseCase를 사용하면 좋다.

* Actor와 UseCase의 개념을 잘 알아야 한다.


[ Component 설계 ]

* 필요에 따라 Class, Sequence, Community 등의 여러 다이어그램을 사용해서 분석하고 설계하는 게 좋다.

* Class, Method, Attribute, Stereo type 등을 명시 할 때, 추상적 / 명시적 / 묵시적인 단어를 적절히 사용해야 한다. 이 부분이 생각보다 어렵다.

* 단어 선택에 미숙할 때에는 리팩토링 관련 ( Refactorying ) 책을 참고하는 것이 도움이 된다. 그 종류의 책에서 이름 명명과 고치는 방법에 대해서 자세히 나와있다.


[ Component 설계 검증 ]

* 코드를 작성한 뒤에만 검증 하는 것이 아니다.

* 요구 사항 및 설계 단계도 검증이 필요하다.

* 일반적으로 Sequence나 Community를 사용해 기능적인 흐름에서 이상이 없는 지 파악한다.

* class 이름, method이름, stereo type의 명칭을 보았을때, 다른 사람이 내 생각과 일치 하는지 확인해야 한다.

* 설계도는 추상적이지 않으며, 매우 구체적으로 나와야 한다. 또한 모든 사람이 공통으로 보아야 하는 내용이므로 명확하고 이해하기 좋은 용어와 다이어그램이 구체적으로 상세히 작성되어야 한다. 

* 필요에 따라 각 다이어그램에는 설명을 해주는 메모가 필수적으로 있어야 한다.


[ Component 구현 ]

*  Component 는 OO( Object Oriented ) 를 적용하여 적용 가능하다.

*  Component 는 OO가 필수적인 요소는 아니다. 구현 수단의 한가지다.

* OO의 구현의 경우, 예를 들어 설명하면, 

 OO를 구현하기 위해 C++은 추상클래스와 Virtual Method를 주로 이용한다.

 OO를 구현하기 위해 C는 Structure와 Static 연산자 그리고 함수 포인터를 사용한다.

* Component의 경우, 예를 들어 설명하면,

 CBD를 구현하기 위해 C++은 Virtual Method를 주로 이용할 수 있다.

 CBD를 구현하기 위해 C는 함수 포인터를 사용할 수 있다.


[ Component 배포 ]

* CASE Tool에서 지원해주는 Generate 를 사용하여 각 개발 환경에 맞는 언어로 배포할 수 있다. 블랙박스 테스트 수준의 코드가 작성되며, 그 이상은 구현자가 실행 플랫폼에 맞게 구현해 주어야 한다.





***

확실히 전공 교수님이라 정확한 개념과 상세한 설명을 해주시는 것 같다.

부족하고 모호했던 부분들을 채워 주신점에 대해 감사의 말씀을 전하고 싶다.

정말 즐겁고 유익한 한주였다.




'소프트웨어 공학 > 설계' 카테고리의 다른 글

[POSA1] Broker Architecture Pattern  (0) 2011.10.07
Bada App - FrameWork Concept  (0) 2011.09.21
:


환경 :
  • 윈도 XP
  • Eclipse 3.5.2 (subclipse plugin)
  • Subversion 1.6.x

이클립스에서 svn 클라이언트로 작업중이었는데 Team -> Show History 기능을 사용하려면 제목과 같은 에러가 나왔습니다.
구글링해서 제 설정파일과 비교해보니 간단한 문제였네요.

일반적으로 svnserve.conf는 아래와 같이 주석이 풀려있겠죠.
svnserve.conf
1 [general]anon-access = readauth-access = writepassword-db = passwdauthz-db = authz

authz 파일의 경우 저는 아래와 같이 되어있었습니다. 
authz - before
1 [groups]user = soriwa[/]@user = rw

다음과 같이 everyone에 대한 읽기 권한을 줘야 제대로 읽어옵니다.
everyone에 대해서는 정의가 없으면 권한이 없는 거니까 늘 정해진 계정을 통해서만 작업되는 경우는 필요없을거라 생각해서 빼버렸거든요...이게 문제였네요.
authz - after
1 [groups]user = soriwa[/]@user = rw* = r
:

SVN-Trac 재연동

소프트웨어 공학/개발 | 2011. 11. 7. 15:39 | Posted by youGom

SVN
 - HotCopy 연동할폴더
Trac
 - resync

'소프트웨어 공학 > 개발' 카테고리의 다른 글

svn: Item is not readable (아이템이 읽기 불가능합니다) 해결  (0) 2011.11.08
svn 데이터 dump 및 load 방법  (0) 2011.11.07
TRAC 생성  (0) 2011.11.07
SVN 생성  (0) 2011.11.07
Subclipse for SVN on Eclipse CDT  (0) 2011.11.04
:

TRAC 생성

소프트웨어 공학/개발 | 2011. 11. 7. 15:38 | Posted by youGom


 + 생성
  서브버젼설치폴더\svn_data>svnadmin create sample2
  파이썬설치폴더\Scripts>trac-admin.exe 트랙폴더\sample2 initenv
  - svn reposit : 서브버젼설치폴더\svn_data\sample2

 + 계정 설정
  : 아파치 htpasswd.exe를 사용하여 Id 추가
        "아파치설치폴더\apach 2.2\bin\htpasswd.exe" D:\Subvision\svn_data\htpasswd ID
 : 새로 추가한 Id계정을 관리자 계정으로 권한 설정
        파이썬설치폴더\scripts\trac-admin.exe D:\trac\sample permission add ID TRAC_ADMIN

'소프트웨어 공학 > 개발' 카테고리의 다른 글

svn 데이터 dump 및 load 방법  (0) 2011.11.07
SVN-Trac 재연동  (0) 2011.11.07
SVN 생성  (0) 2011.11.07
Subclipse for SVN on Eclipse CDT  (0) 2011.11.04
Subversion 설치 및 Eclipse와의 연동  (0) 2011.11.04
:

SVN 생성

소프트웨어 공학/개발 | 2011. 11. 7. 15:36 | Posted by youGom


 + 계정 설정_
  저장소 루트 \추가 저장소 폴더 \ conf \ passwd 파일에 계정 추가..
  ( ...\svn_data\conf\passwd )

 + 권한 설정_
  svnserve.conf 파일을 수정해서 액세스제한을 둔다.
  #비인증자 접근 금지
  #anon-access = read
    anon-access = none
    auth-access = wirte
  #인증시 뜨는 메시지
    realm = Hello Repository

'소프트웨어 공학 > 개발' 카테고리의 다른 글

SVN-Trac 재연동  (0) 2011.11.07
TRAC 생성  (0) 2011.11.07
Subclipse for SVN on Eclipse CDT  (0) 2011.11.04
Subversion 설치 및 Eclipse와의 연동  (0) 2011.11.04
[ELF] OpenSource Enlightenment DeskTop  (0) 2011.10.14
:

[POSA1] Broker Architecture Pattern

소프트웨어 공학/설계 | 2011. 10. 7. 17:04 | Posted by youGom
1.
여기에서 핵심 클래스는 Broker Class다.
Broker 클래스는 Client, Server에 접근하고, Client Proxy, Server Proxy에 접근한다.
Bridge 클래스를 통해 세부 구현을 숨길수도 있으며, 다른 브로커에 접근할 수 있다.

2.
Broker는 등록되어진 Client와 Server를 안전하게 연결해 준다.
Client는 본인이 사용하는 하나의 어플리케이션으로 볼수 있다.
Server는 서비스를 제공하는 하나의 매개체다.
Client/Server Proxy는 부가적인 데이터 처리를 해준다.

3.
포사에 적혀 있는 내용을 압축하면 위와 같이 정리된다.
POSA 책을 봐도 잘 이해 안가는걸 한번 더 압축하니, 첨 본 사람은 더욱 어리둥절 할 수 있다.


4.
우리 생활에 가까운 것으로 예를 들면 개념을 이해 하는데 도움이 된다.

a. 우리는 크롬을 켠다. ( ex. www.google.com )
b. 검색을 한다. ( ex. 김태희 )
c. 검색 목록이 뜬다. ( ex. 알흠다운 김태희 기사와 사진들~ *_* 므흣..! )
d. 김태희 기사를 본다.
e. 김태희 홈페이지를 들어간다. 
f. 홈페이지가 제대로 안뜨길래, 익스플로러로 김태희 홈페이지로 들어갔다.
g. 에러 없이 모든 내용을 볼 수 있다.


5.
위 내용을 가지고 Broker 패턴을 이해 할 수 있다.

a. Client 1 :    우리는 크롬을 켠다. ( ex. www.google.com )
b. Broker :      검색을 한다. ( ex. 김태희 )
c. Sever-List : 검색 목록이 뜬다. ( ex. 알흠다운 김태희 기사와 사진들~ *_* 므흣..! )
d. Server 1 : 김태희 기사를 본다.
e. Server 2 : 김태희 홈페이지를 들어간다. 
f. Client 2 :  홈페이지가 제대로 안뜨길래, 익스플로러로 김태희 홈페이지로 들어갔다.
g. Server 2 : 에러 없이 모든 내용을 볼 수 있다.


6.
추가 설명이 필요한 분들을 위해, 부가적인 설명을 덧 붙이겠다.

Client 브라우저다. 브라우저는 크롬과 익스플로러이고, 파이어폭스나 모질라도 가능하다.
Broker는 김태희 정보가 있는 서버 정보를 검색하는 역할을 한다.
Server는 본인이 원하는 서버들 중 하나를 선택해서 접근하는 것이다.
 ( 여기서 site 주소를 실제 서버 IP로 연결해주는게 DNS 인데, DNS도 브로커로 볼 수 있다. )
연결된 Server는 본인이 켜둔 Client 브라우저로 정보를 Reponse해주는 것이다.


7.
Proxy는 추가적인 데이터처리를 위해 추가 할 수 있다. 특히 Intranet을 사용할 때, Proxy Server는 필수가 된다.
일반적으로 Proxy 옵션을 따로 설정하진 않는다.


8.
가벼운 소재를 가지고, 쉽게 풀어 보았다.
혹시라도.. 설명에 부족한 부분이 있다면, 댓글을 조심히 부탁드린다.


9.
Broker 패턴에 대한 정확한 정보는 아래 주소로 가면, POSA 내용을 엿볼 수 있다.
 http://thisisliving.tistory.com/category/Studying/Pattern-Oriented%20Software%20Architecture


 

'소프트웨어 공학 > 설계' 카테고리의 다른 글

[수강후기] CBD, Component Based SW Design  (0) 2012.09.02
Bada App - FrameWork Concept  (0) 2011.09.21
:


포스트를 만든 목적

  • 이렇게 하지 않으면, 책을 건성으로 본다.

내용

Dispose 는 무엇인가?

관리되지 않는(unmanaged) 자원을 해제하기 위해서 사용 하는 함수이다.

그러면 unmanaged 자원은 무엇인가?

쉽게 생각해서 "메모리가 아닌 자원" 즉, 윈도우 핸들, 파일 핸들, 소켓 핸들 등 시스템 자원을 뜻한다. 반대로 managed 는.. new List<int>() 등, 메모리 처럼 쓰는 자원들이다.

그러면 표준 Dispose 패턴은 무엇인가?

  1. Dispose를 IDisposable Interface로 구현한다.
  2. Dispose 내부에선 unmanaged 자원을 해제한다.
  3. 사용자가 Dispose를 사용하지 않았을 경우를 대비하여, finalizer를 구현한다.
  4. finalizer 에서 unmanaged 자원을 해제한다.
이 1 ~ 4 을 구현한 Dispose 를 표준 Dispose 패턴이라고 한다.

finalizer 를 구현하면, 성능상에 나쁜 영향을 주는데, 왜 finalizer를 구현해야 하나?

무제한 unmanaged 자원이 늘어나는게 더 나쁜 영향을 준다. 그래도 finalizer를 구현하지 않겠는가?

왜 finalizer를 구현하면 성능에 나쁘나?

  1. finalizer를 구현하면, GC가 자신이 관리하는 finalizer 큐에 저장한다.
  2. GC에서 사용하는 특정 쓰레드가 finalizer 큐를 읽고, 해제해도 되는지 검사한다.
  3. 검사 후 해제되도 된다면, 그때서야 해제한다.

3번이 될때까지 아직도 해제하지 않고 있는 것과, 검사하는 것에 에너지를 사용하기 때문에 성능에 나쁘다.(얼마나 나쁠지는 모르겠다.)

finalizer에선 어떤 일을 해야 하는가?

사용자가 Dispose()를 사용하지 않았을 경우, unmanaged 자원을 해야 해야 한다.

그러면, 어떻게 Dispose를 구현해야 하는가?

반드시 다음과 같은 기능을 수행해야만 한다.

  1. unmanaged 자원 해제
  2. managed 자원의 해제
  3. Dispose() 한 후 다시 Dispose() 호출 후 이상이 없어야 한다.
  4. Dispose() 한 후 unmanaged 자원 사용 시, ObjectDisposed 예외를 발생 시켜야 한다.
  5. finalization 동작을 막아야 한다.

다 좋은데, 상속 기반에서는 어떻게 하나? IDisposable Interface는 비가상 함수지 않는가?

그렇다. 그래서 가상함수로 Dispose() 기능을 수행하는 함수를 만들어야 한다. 기왕 제 3의 함수 만드니까, finalizer 에서 사용 되는 부분도 줄이면 좋겠다.

.. 그런데 managed 자원은 GC(가비지 켈렉터)가 해제해주는데 굳이 해제해 줄 필요가 있는가?

맞는 말이다. 하지만 어차피 사용되지 않을꺼니까, 가비지 켈렉터가 잘 일할 수 있도록, 해제해 주는게 좋다.

어떻게 managed 자원을 해제 하는가?

.. null 로 만들면 된다. 예를 들어 _list.Clear(); _list = null; 이렇게 하면 된다.

자, 이제 코드로 보여 줄 수 있는가?

Dispose Sample Code
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
 
namespace console
{
    class ConsoleClass
    {       
        public static void Main()
        {
            using (DerivedDisposeSample t =  new DerivedDisposeSample())
            {               
            }
 
        }
    }
 
    public class BaseDisposeSampleClass : IDisposable
    {
        // -- Dispose 두번 이상
        // -- 호출을 막기 위한것
        private bool _isBaseDisposeSmapleClass = false;
 
        // -- managed resource
        private List<int> _ManagedResource = new List<int>();
 
        // -- unmanaged resource
        // -- 사실 FileStream은 finalizer 가 구현 되어 있으므로, unmanaged 라고 보긴 힘들다.
        // -- 예제를 위해 한것이므로 그러려니 하자
        private FileStream _UnManagedResource = new FileStream("hehe.txt", FileMode.OpenOrCreate);
         
        ~BaseDisposeSampleClass()
        {
            // finalizer 가 호출된 시점에선 이미 Dispose()가 호출 되지 않았으므로
            // managed resource 는 지우지 않는다.
            Dispose(false);
        }
 
        // Dispose 호출
        public void Dispose()
        {
            // managed 까지 제거
            Dispose(true);
 
            // managed 까지 지웠으므로,
            // 이 객체는 finalizer 호출하지 말라고 등록한다.
            GC.SuppressFinalize(this);          
        }
 
        protected virtual void Dispose(bool isDisposing)
        {
            Console.WriteLine("BaseDisposeSampleClass::Dispose(bool isDisposing) is called");
 
            // is called?
            if (true == _isBaseDisposeSmapleClass)
                return;
 
            // managed resource release
            if (true == isDisposing)
            {
                _ManagedResource.Clear();
                _ManagedResource = null;
            }
 
            // unmanaged resource release
            _UnManagedResource.Dispose();
 
            // flag on
            _isBaseDisposeSmapleClass = true;           
        }
    }
 
    public class DerivedDisposeSample : BaseDisposeSampleClass
    {
        private bool _isDerivedDisposeSample = false;
 
        protected override void Dispose(bool isDisposing)
        {
            Console.WriteLine("DerivedDisposeSample::Dispose(bool isDisposing) is called");
 
            if (true == isDisposing)
            {
                // managed resource release...
            }
 
            // unmanaged resource release...
            // ...
            // ..
            // .           
            base.Dispose(isDisposing);
 
            // flag on
            _isDerivedDisposeSample = true;           
        }
    }
}

주의 해야 할 점이 있는가?

  • finalizer 와 Dispose 에서, 객체 생명주기를 바꾸는 행동을 하지 말아야 한다. 만약 객체 생명주기를 건들게 되면, 객체는 더 이상 사용하지 않는데도, managed 자원까지 사라지지 않는 일이 발생 한다. .... 어렵다면, 해제하는 작업만 해야 한다고 알아도 된다.

결론

  • 남이 만든거 갔다가 쓰자. :P
  • 남이 만든게 없을 경우, unmanaged 자원이 있을 경우, 표준 Dispose 패턴으로 구현하자.



출처 : http://ikpil.com/1190 


: