서론
- 위치 기반 서비스(LBS:Location Based Service)에 대해
(개인적이 주관으로 기술한 내용)
   스마트 폰에서 유용하다라고 생각하는 것 중에 위치 기반 기술, 맵 정보, 그리고 여기에 다른 유용한 정보를 융합하여 더 나은 정보를 제공하는 애플리케이션이 상당 부분을 차지합니다. 사례를 보면 자기 주위 가장 싼 주유소를 찾아주는 앱(App.: Application 의 줄임말 ), 특정 책이 있는 서점을 찾아주는 앱 등이 이를 대표하는 앱입니다.

[휴대전화의 위치 기반(맵정보 활용) 서비스의 특징 및 문제점]
  - 하나 이상의 서비스를 융합하여 새로운 서비스 제공하는 Mashup 형태
  - 프라이버시 침해 우려(맵서비스 제공자에게 개인의 위치정보 전달)
  - 위치정보(맵정보)와 융합할 소스 정보 제공자에 의존적
     위치(맵정보)와 융합할 정보를 공급자가 차단하는 경우 서비스 불가.

이런 몇 가지 문제점이 보완된다면 더욱 다양한 방향으로 활용될 것이기 때문에 위치기반(맵정보) 서비스
말로 스마트 폰에 핵심라고 할 수 있습니다.

1. 위치 기반 애플리케이션(Location Based Application)
  위치 기반 애플리케이션은 무선 기기내에 GPS(Global Positioning System) 등을 이용하여 사용자의 현재 위치 정보(맵 정보)에 따르는 다른 유용한 정보를 결합하여 새로운 기능를 제공하는 애플리케이션입니다. (제나름대로 정의한 것)
이런 애플리케이션을 안드로이드에서 Google Maps API와 android.location Library를 이용하며 아주 손쉽게 제작이 가능합니다.(리스트1-1)

[리스트1-1]위치 기반 관련 패키지(라이브러리)
  Google Maps Service에 접근하는 인터페이스를 제공하는 패키지로써 주요 클래스는 맵을 표시하는  MapView 클래스와 MapView를 Activity를 관리하는 MapActivity 클래스 등으로 구성되어 있습니다.
 
  GPS나 무선랜 등의 정보를 이용하여 휴대전화의 현재 위치 정보(위도,경도)를 얻기 위한 기능을 제공하는 패키지로써 시스템의 위치 서비스(Location Service)의 접근을 제공하는 LocationManager 클래스, 위치정보와 주소정보를 변환하는 Geocoder 클래스, GPS엔진 상태를 표현하는 GpsStatus 클래스 등으로 구성되어 있습니다.

*** 이제 구글맵을 연동하는 안드로이드 애플리케이션을 제작 방법을 소개하려고 합니다. 시작 전에 컴퓨터에 안드로이드 개발환경 구축 전인 경우 지금부터 과정을 진행할 수가 없습니다. 만일 이런 경우의 독자라면  "안드로이드(Android) 개발환경 구축하기" 포스트를 참고하여 개발환경을 먼저 구축하고 다음 내용 진행하시기 바랍니다.

2. Google Maps API Key 발급받기
  Google Maps 데이터에 접근하는 Android에 애플리케이션을 제작하기 위해서 Google Maps service에 등록 및 약관 동의 절차(Maps API Key Signup)를 거쳐야 합니다. 참고로 Maps API Key 발급은 무료이며, 로그인 가능한 구글 계정이 필요합니다.

1) SDK 디버그 서명 증명서의 MD5 핑거프린트(Fingerprint:지문) 확인하기
디버그 서명 증명서(debug.keystore 파일)는 Android SDK가 자동으로 생성하며, 개발환경의OS마다 다른 경로가 생성됩니다. (리스트2-1 참고)

[리스트2-1]OS별 디버그 서명 증명서(dubug.keystore) 저장 경로
Win Vista: C:\Users\%username%\.android\debug.keystore
Win XP: C:\Documents and Settings\%username%\.android\debug.keystore
OS X and Linux: ~/.android/debug.keystore

debug.keystore의 저장된 위치를 확인했으면 썬 JDK에 포함되어 있는 keytool를 이용하여 핑커프린트 확인할 수 있다. ([예제2-1])

[예제2-1]keytool로 Fingerprint를 확인(붉은색 글씨가 Fingerprint) (Vista환경예시)
C:\Users\test\.android>dir *.keystore
 C 드라이브의 볼륨에는 이름이 없습니다.
 볼륨 일련 번호: BXXX-XXXX
 C:\Users\test\.android 디렉터리

2010-02-06  오후 09:07             1,268 debug.keystore
               1개 파일               1,268 바이트
               0개 디렉터리   X,XXX,654,592 바이트 남음

C:\Users\test\.android>"%java_home%\bin\keytool.exe" -list -keystore debug.keystore -keypas
s android -storepass android -alias androiddebugkey
androiddebugkey, 2010. 2. 6, PrivateKeyEntry,
인증서 지문(MD5): AA:22:33:F7:32:12:22:EC:68:93:8B:55:44:69:ED:47

2) 구글 지도 API 가입하기(Maps API Key Signup)
다음 URL 이동하여 위에서 확인한 인증서 지문(MD5) 값을 복사하여 [My certificate's MD5 fingerprint] 입력란에 넣고 Generate API Key를 클릭합니다. 여기서 구글 로그인 이 필요합니다.

[그림2-1] Maps API Key Signup - Start Webpage
사용자 삽입 이미지






















[그림2-2] Maps API Key Signup - Result Webpage
사용자 삽입 이미지
















발급된 사용자 키를 다른 곳에 잘 저장해 두고 애플리케이션 제작하는 단계로 넘어갑니다.



3. Google Maps API 이용한 애플리케이션 제작하기 (GoogleMapHello)

Google Maps API를 이용하여 맵 정보를 표시하는 간단한 애플리케이션 만들어 보겠습니다.

1) Eclipse 에서 GoogleMapHello 프로젝트를 생성하기

[그림3-1]New Android Project : GoogleMapHello
사용자 삽입 이미지



































2) Maps library를 사용 설정 및 인터넷 접속 허용 설정하기(AndroidManifest.xml)
Standard Android library에는 Maps library가 포함되어 있지 않으므로 사용하려면 별도의 설정이 필요합니다. 또한 인터넷에 접속하여 Maps data를 조회하려면 INTERNET Permission을 지정해야 합니다.

[예제3-1] GoogleMapHello의 AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="tobe30.sample.googlemaphello"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".GoogleMapHello"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <!--map library 사용 설정-->
<uses-library android:name="com.google.android.maps" />
    </application>
    <uses-sdk android:minSdkVersion="7" />
    <!--INTERNET Permission 지정-->
    <uses-permission android:name="android.permission.INTERNET" />
</manifest>

3) 애플리케이션의 레이아웃 작성하기 (res/layout/main.xml)
com.google.android.maps.MapView 클래스를 레이아웃에 추가한다.
[예제3-2] GoogleMapHello의 res/layout/main.xml
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.maps.MapView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mapview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:clickable="true"
    android:apiKey="043KehnZyxJK7Ny0hTKJPBcp_rihr6VLCMoDQeA"
/>
android:clickable 속성은 사용자의 상호작용 허용 여부를 설정하는 것입니다. 이것을 false로 설정하는 경우 터칭(에뮬레이터에서는 마우스로)으로 맵을 조작할 수 없게 됩니다.
android:apiKey에는 위에 "2. Google Maps API Key 발급받기" 과정을 통해 얻은 자신의  Maps API Key를 설정합니다.

4) 애플리케이션의 Activity를 구현하기 (GoogleMapHello.java)
MapActivity 클래스는 MapView에 지도 표시를 관리하는 역할을 합니다. 그래서GoogleMapHello Activity는 MapActivity 클래스를 상속받아 구현해야 합니다.

[예제3-3]GoogleMapHello Activity 소스
package tobe30.sample.googlemaphello;

import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;
import android.os.Bundle;
// GoogleMapHello 는 MapActivity를 상속
public class GoogleMapHello extends MapActivity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        MapView mapView = (MapView) findViewById(R.id.mapview);
        mapView.setBuiltInZoomControls(true);  //줌컨트롤을 활성
    }

   @Override
    protected boolean isRouteDisplayed() {
return false;
    }
}
isRouteDisplayed() 메소드는 MapActivity의 추상 메소드이므로 반드시 구현해야 합니다.
isRouteDisplayed() 메소드는
 애플리케이션에 라우트 정보를 표시할 경우 true를 반환하고, 그렇지 않은 경우 false를 반환합니다.

5) 실행
Eclipse > Run > Run as > Android Application

[그림3-2]GoogleMapHello 실행화면
사용자 삽입 이미지


















※ GoogleMapHello는 Map API를 이용하는 애플리케이션이므로 실행할 때 타켓이 Google APIs(Google Inc.) - API Level n으로 설정된 ADV로 실행해야 한다.(그림3-3)
[그림3-3]Google APIs(Google Inc.) - API Level n 타켓의 AVD 생성
사용자 삽입 이미지






























참고

끝!
노트북에서 해보느라고 아주 죽는 줄 알았습니다. 노트북이 사양이 좀 딸려서 애플리케이션 한번 실행하는데 꽤나 느립니다. 역시 최고에 장벽은 영어! 나에게는 존재하지 않는 영어 실력으로 영문 문서 읽어가면서 하려니 포스팅 하나 작성하는데 하루 종일 걸렸습니다. 나름 최선을 다해 자세히 설명을 하려고 노력했는데 보시는 분들이 얼마나 잘 이해하실지.....그리고 이 글은 맘으로대 퍼가셔도 상관없습니다. 출처만 분명히 밝혀주시면 됩니다.

이올린에 북마크하기(0) 이올린에 추천하기(0)

Posted by 좐군

2010/03/31 12:59 2010/03/31 12:59

Trackback URL : http://John.tobe30.com/tc/trackback/310

Comments List

  1. 공돌이 2010/04/01 20:02 # M/D Reply Permalink

    좐군님 대단하세요 ㅎㅎ 안드로이드 책이랑 다른 사이트 참고해서 했어요 ㅎㅎ

    http://androidhuman.tistory.com/

    이곳에도 강좌가 많더군요^^ 아시고 계실지도 ㅎㅎ

    1. 좐군 2010/04/02 15:48 # M/D Permalink

      저는 주로 공식사이트로 이용하는 편이라.
      모르는 곳이였는데... 좋은 정보 감사합니다.

  2. 스티븐잡스 2010/04/03 21:48 # M/D Reply Permalink

    안녕하세요.

    mabifest Fie에서l 라이브러리를 com.google.android.maps 가져다 쓰잖아요?
    그리고 나서 *.java 파일에서 맵뷰컨트롤러를 호출하려고 하니까 에러가 나네요

    MapView map_veiw = (MapView)findViewById(R.id.mapview);

    id 다음에 mapview를 인식못하네요.. R.java 파일에 임의로 써줘야 되는건지..

    1. 좐군 2010/04/05 13:31 # M/D Permalink

      안녕하세요. 주인장입니다.

      위 글을 작성 할 때 같은 문제를 겪었습니다.
      프로젝트를 다시 생성도 해보고, 이클립스에서 속성창릅 불러 수정도 했는데 결국 해결못하고, R.java 파일을 직접 해당 ID값을 입력해서 컴파일을 했습니다.

      리소스 관련된 사항은 다음을 참고하세요.
      http://developer.android.com/guide/topics/resources/available-resources.html#layoutresources

      해보시고 잘 안되시면 다시 댓글 남겨주세요.

  3. 스티븐잡스 2010/04/06 20:05 # M/D Reply Permalink

    되었습니다. R.id.mapview를 직접 만들어주니 해결되었습니다.

    리소스 관련 사항도 잘 보았습니다(영어라서 대충ㅠ)

    근데 왜 알아서 안생길까요......ㅠ

    아무튼 감사합니다.

  4. 하로하로 2010/04/21 14:50 # M/D Reply Permalink

    MD5나 API key는 각 개인별로 있는거라 모자이크 하시는게 좋을꺼 같은데요.....

    1. 좐군 2010/04/21 17:11 # M/D Permalink

      이 그림에 포함된 키값 임의로 제가 지정한 값입니다.ㅋㅋ

  5. 이민효 2010/05/30 19:07 # M/D Reply Permalink

    제가 쌩 초보자라서 그런데 R.java 파일을 직접 해당 ID값을 입력하라는게 어뭔지를 잘 몰라서요.. 소스좀 보여주시면 안될까요 ? ㅠ

  6. 예영파피 2010/06/04 16:27 # M/D Reply Permalink

    좋은글 잘보고 갑니다. 퍼가요

    출처는 http://john.tobe30.com/tc/entry/Android_GoogleMapsAPI_Using 로 표시합니다.

  7. nuno1333 2010/08/05 12:45 # M/D Reply Permalink

    잘보고 잘따라 했습니다 좀 퍼가요

  8. ^^ 2010/08/24 11:50 # M/D Reply Permalink

    좋은 글 고맙습니다. 담아갈게요~^^

  9. risepower 2010/08/27 03:10 # M/D Reply Permalink

    오우 구글 API 때문에 머리가 아팠는데... 게보린 안먹어도 될듯 ㅜㅜ 약값 지켜준 님께 감사요 !! ^-^

Leave a comment
[로그인][오픈아이디란?]

안드로이드(Android) 개발환경 구축하기

Android
드로이드 개발 환경은 크로스(Cross) 개발 환경이다. 크로스 개발 환경이란 개발할 때와 실행 때에 다른 컴퓨터 환경에서 이루어지는 개발 방법을 말한다. 여기서 애플리케이션을 개발하는 환경을 호스트(host) 환경, 애플리케이션을 실행하는 환경을 타켓(Target) 환경이라고 한다.
 

※ 안드로이드에 내용은 다음 포스트를 참고 : What is Android?
※ Android 개발툴이 동작하는 환경
   Windows XP(32bit), Windows Vista(32bit/64bit), Windows 7(32bit/64bit)
   Mac OS X 10.3.8 이후(x86판만)

※ 용어
ADT : Android Development Tools
AVD : Android Virtual Device


A. 윈도우에서 Eclipse IDE 개발환경 구축하기
A.1. Android 개발환경에 필요한 소프트웨어를 다운로드하여 설치한다.
    * Android SDK
      Version : 2.1   /  1.6   /   1.5
      압축을 적당한 위치에 해제한다. (D:\AndroidDev\android-sdk-windows)  

    
        따로 인스톨 필요없고, 적당한 폴더에 해제한다.(D:\AndroidDev\eclipse)



A.
2. Eclipse에서 Andorid 개발툴 플러그인을 설치하기
   Eclipse를 시작한다
   Help > Install New Software... 선택한다.

   Install 창에서 [Add...]버튼을 선택하고, 플러그인 사이트를 등록한다.
      Name : Android plugin
      Location :    
http://dl-ssl.google.com/android/eclipse/
사용자 삽입 이미지
   Install 창에서 Work with 에  위에서 등록한 사이트를 선택한다.
   아래 화면과 같이 Developer Tools를 체크하고, [Next >]버튼을 클릭한다.
사용자 삽입 이미지
  Install Details에서 Android DDMS, Android Developement Tools 를 선택하고,
  [Next >] 버튼을 선택한다.
사용자 삽입 이미지
   설치중....
사용자 삽입 이미지

A.
2. Eclipse에서 Android SDK의 경로 지정하기

    Eclipse를 실행하여 Window > Perferences를 선택한다.
    Android 를 선택하고 SDK Location 에 위에서 Android SDK 설치한 폴더를 선택한다.
    (여기서는 D:\AndroidDev\android-sdk-windows로 설정)
사용자 삽입 이미지


A.
3.
Eclipse에서 Windows > Android SDK and AVD Manager 선택한다.
   Available Packages를 선택하고 설치할 SDK과 Google API를 체크한다.
   [Install Selected]버튼을 클릭한다.
사용자 삽입 이미지
   Accept All을 선택하고, [Install Accepted]버튼을 선택한다.
사용자 삽입 이미지
   
   설치가 완료되면 [Yes] 버튼을 선택하고 ADB를 재시작한다.
사용자 삽입 이미지

A.
4. 이제 Virtual Device를 생성해야 한다.
   
Android SDK and AVD Manager 창에서 Virtual Devices를 선택하고,
   [New...]버튼을 선택한다.
 
사용자 삽입 이미지
  Create new AVD창에서 아래와 같이 입력하고, [Create AVD]버튼을 선택한다.
  여기서 SD Card 사이즈를 너무 크게 설정하면 해당 Virtual Device를 구동(Android 부팅)할 때 메모리를 많이 소비하고 부팅시간이 오래 걸리기 때문에 실행하려는 애플리케이션에서 사용하는 메모리를 고려하여 설정한다. 여기서는 간단한 프로그램을 구동할 것이므로 SD 카드 메모리의 크기를 64MB  또는 128MB 정도 설정한다.
사용자 삽입 이미지
여기까지 하면 Android 애플리케이션을 개발하기 위한 개발환경 세팅
 완료되었다.


B. Android 애플리케이션 프로젝트 생성/컴파일/실행
B.1. Eclipse 에서 File > New > Android Project 를 선택한다.
   아래 화면과 같이 입력하고, [Finish]버튼을 선택하고 프로젝트를 생성한다.
   (
HelloWorld 라는 2.1 버전 플랫폼에서 돌아가는 프로젝트를 생성하는 예)

사용자 삽입 이미지
- Application Name : 안드로이드 메인화면에 표시되는 애플리케이션의 이름
- Package Name : Java의 패키지명. 패키지는 컨테이너에 포함된 타입의 고유의 식별자 및 접속 경로를 제공하는 것.
- Create Activity : 안드로이드 어플리케이션을 윈도우를 제어하는 클래스의 이름. Activity는 UI화면을 제어하는 클래스.


  다음 프로젝트를 생성한 결과이다.
사용자 삽입 이미지
  Eclipse에서 Run > Run 을 선택하고
  Run As 에서 Android Application을 선택하고, [OK]버튼을 선택하다.
사용자 삽입 이미지
Android SDK and AVD Manager가 실행되면 여기서 기존 등록해 둔 AVD를 선택하고
[Start...]버튼을 선택한다.
사용자 삽입 이미지














드디어 Android가 실행되는 화면을...
사용자 삽입 이미지

















(여기서 컴사양에 따라 실행속도가 많이 차이난다.
* 만일 부팅 시간이 생각보다 오래(3분이상) 걸리다면
 
 AVD의 SD 카드 메모리 사이즈를 너무 크게 설정한 것이 아닌지 확인해본다. 여기서 간단한 프로그램 구동하는 것이므로 64mb 또는 128mb정도가 무안하다. 이 이상으로 설정했다면 이클립스의
Android SDK and AVD Manager 창에 가서 실행하려는 AVD의  SD 카드 메모리 사이즈를 조정하면 부팅속도가 빨라질 것 이다.
부팅이 완료되고, 위에서 생성한 HelloWorld라는 애플리캐이션이 실행된다.
사용자 삽입 이미지

















모든 프로그램 HelloWorld하면 끝난거 아닌가?ㅋㅋ

iPhone App. 개발의 경우 Mac OS가 필요하고, 실제 하드웨어에 프로그램을 배포할 때도 애플 별도의 인증을 거쳐야 하나,
Android App. 같은 경우 개발환경(윈도우/리눅스/Mac)의 거의 제약이 없고, 배포도 USB로 가능하도고 하니 조만간 많은 App.과 그런 애플케이션을 개발을 용이하게 하는 많은 툴이나 라이브러리가 쏟아져 날올 것으로 예상된다. 개인적으로 Android 개발 환경이 Java 계열이라
 GUI 디자이너가 iPhone GUI 디자이너나 Visual Studio (Mobile Window 개발툴)와 같은 툴에 비해 다소 불편한 것 어쩔수가 없다. 하지만 Android는 모든 것이 오픈소스이니 수년내에 iPhone을 뛰어 넘을 정도로 발전하지 않을까
조심스런 기대를 해 본다.



참고 자료
이올린에 북마크하기(0) 이올린에 추천하기(0)

Posted by 좐군

2010/02/17 11:31 2010/02/17 11:31
, , , ,
Response
No Trackback , 17 Comments
RSS :
http://John.tobe30.com/tc/rss/response/292

Trackback URL : http://John.tobe30.com/tc/trackback/292

Comments List

  1. 공돌이 2010/02/13 22:10 # M/D Reply Permalink

    어우 난 왜 안뜨지 끝에서 안되네 -_- 계속 안드로이드 라고만 표시되네..휴.. ㅋㅋ

    1. 좐군 2010/02/17 18:23 # M/D Permalink

      주인장입니다. 답변이 늦어 죄송합니다.
      공돌이님의 블로그나 이메일 주소를 남기지 않아 댓글로 답변을 대신합니다.
      아무래도 공돌이님께서 AVD의 SD카드 메모리크기를 너무 크게 설정하신게 아닌가 싶습니다.
      관련 내용 위에 업데이트 했습니다.
      "A. 4. 이제 Virtual Device를 생성해야 한다." 란의 참고바랍니다.
      그럼 재밌는 Android 세상으로..

  2. 컴터학과 2010/03/05 11:23 # M/D Reply Permalink

    질문 하나만 하려구요.

    올려주신대로 했는데

    run을 하니

    Your project contains error(s), please fix them befor running your application

    이라는 경고창이 뜹니다. 왜 이러는 건가요??

  3. 공돌이 2010/03/08 17:05 # M/D Reply Permalink

    지금이서 답변을 보았습니다. 죄송합니다.

    저의 블로그 주소는 01099496543.tistory.com 입니다.

    이제는 잘 됩니다. 무엇이 잘못되었는지는 몰라도요 ㅎㅎ

    아무 잘 보고있습니다. 그래서 저의 블로그에도 글을 복사하였습니다 .

    퍼가기를 하고싶지만 티스토리로 퍼가는 방법을 몰라서요.

    저작권이 있다고 확실히 명시해두었습니다.

    글쓴이 님이 퍼가는걸 원하시지 않는다면 글 지우겠습니다 ^^

  4. 공돌이 2010/03/08 17:08 # M/D Reply Permalink

    아 하나만 더 물어봐도 될까요? New Project 만들때요,

    어플리케이션 네임과 패키지 네임, 그레이트 액티비티, 왜 넣어주는건지요?

    jsd8839@gmail.com 메일입니다.

    1. 좐군 2010/03/25 12:22 # M/D Permalink

      궁금하신 내용 메일로 간단히 보내드렸습니다.

  5. 비밀방문자 2010/03/25 01:03 # M/D Reply Permalink

    관리자만 볼 수 있는 댓글입니다.

    1. 좐군 2010/03/25 12:14 # M/D Permalink

      안녕하세요. 주인장입니다.
      답변이 늦어 죄송합니다.
      콘솔에 찍는 내용을 보아하니 아무래도
      "A. 2. Eclipse에서 Andorid 개발툴 플러그인을 설치하기"
      "A. 3. Eclipse에서 Windows > Android SDK and AVD Manager 선택한다."
      "A. 4. 이제 Virtual Device를 생성해야 한다"
      부터 순서대로 천천히 다시 한번 확인해보시구요

      그래도 해결되지 않으면 다시 한번 연락주십시오.

  6. 소울 2010/06/15 23:04 # M/D Reply Permalink

    오타있네요 ㅋㅋ
    max OS라니..

    1. 좐군 2010/06/15 23:12 # M/D Permalink

      지적 감사합니다.ㅋ

  7. by-스카이 2010/07/05 19:42 # M/D Reply Permalink

    좐군(주인장) 님
    올린 글대로 했는데 Your project contains error(s), please fix them befor running your application 이 뜨고요 그래서 안드로이드 sdk 로 킬려 하니
    emulator: ERROR: bad config: virtual device directory lacks config.ini
    emulator: could not find virtual device named 'Android_HVGA'
    가 떠요 ㅜㅜㅜㅜㅜ 빠른 답변 부탁합니다~

    1. 좐군 2010/07/21 07:45 # M/D Permalink

      주인장입니다.
      답변이 늦었네요
      아무래도
      Vitual Device를 설정이 문제인 것 같습니다.

      위 내용에서



      "A. 4. 이제 Virtual Device를 생성해야 한다.
      Android SDK and AVD Manager 창에서 Virtual Devices를 선택하고,
      [New...]버튼을 선택한다. "

      Android SDK and AVD Manager는 Eclipse에서 Windows 메뉴에 있답니다.

      이부분을 참고해서 차근차근 확인해보세요.
      해보시고 문제 있으시면 다시 글 남겨주세요

  8. 귀족 2010/07/20 16:03 # M/D Reply Permalink

    우와 감솨 ㅋ

  9. 궁금해요 2010/07/30 11:11 # M/D Reply Permalink

    SDK 와 AVD 다 설치하고 테스트예제 실행하는데
    아래 메세지가 나오고 에물레이더에 인스톨이 되지 않아요.
    에물레이더는 정상적으로 실행이 됩니다. 물론 어플은 설치되어있지 않구요
    머가 문제 일까요?
    개발환경 : 2.2플랫폼 메모리 64M 입니다.

    -- 아래 메세지 ---
    [2010-07-30 10:52:27 - scanbill] ------------------------------
    [2010-07-30 10:52:27 - scanbill] Android Launch!
    [2010-07-30 10:52:27 - scanbill] adb is running normally.
    [2010-07-30 10:52:27 - scanbill] Performing s.scan.view activity launch
    [2010-07-30 10:52:27 - scanbill] Automatic Target Mode: launching new emulator with compatible AVD 'android'
    [2010-07-30 10:52:27 - scanbill] Launching a new emulator with Virtual Device 'android'
    [2010-07-30 10:52:35 - scanbill] New emulator found: emulator-5554
    [2010-07-30 10:52:35 - scanbill] Waiting for HOME ('android.process.acore') to be launched...
    [2010-07-30 10:52:54 - Emulator] accept: Invalid argument

  10. 병아리 2010/09/03 14:10 # M/D Reply Permalink

    안녕하세요 쥔장님// 원하던 글을 찾아서 이리 저리 설치해보려고 하는데
    저는 설치부터 막힘니다 -_ -;;
    자바 설치하고(아무것도 않하고) Eclipsec압축풀고, 실행버튼 누르면,
    "Failed to create the Java Virtual Machine"
    이란 문구가 뜹니다.
    자바에서 문제가 있는 것 같은데, 정말 초보거든요..
    이제 독학으로 조금씩 시작해 보려고 하는데 첫 단계 부터 막히네여ㅠㅠ
    설치 환경은 winXP입니다.
    리플로 남겨주시면 확인 할께요.

    1. 좐군 2010/09/03 23:00 # M/D Permalink

      안녕하세요. 주인장입니다.
      아무래도 Java SE Development Kit (JDK6)를 설치 안하고
      Eclips부터 설치하고 실행하신게 아니신지요?

      다음 Java SE Development Kit (JDK6) 다운로드 경로입니다.
      http://java.sun.com/javase/downloads/widget/jdk6.jsp

      이상 있으시면 다시 질문해주세요

  11. 병아리 2010/09/06 14:19 # M/D Reply Permalink

    자바는 설치 했는데여
    실행하고 오류창 뜨기전에
    도스창에서
    Error occurred during initialization of VM
    Could not reserve enough space for object heap
    이라고 뜹니다.
    혹시 PC사양에 관한 문제인가용 -0 -;;;;

Leave a comment
[로그인][오픈아이디란?]

Though many teams are using Subversion (SVN) to work together and share code, version control software provides a huge number of features that are not often used.  Just about any developer these days knows how to checkout a project and commit or revert changes.  But a lot of teams don’t really use more advanced features like branching and tagging to organize releases.

The great thing about version control systems like SVN is that you gain a bunch of really useful functionality – even if you have only been using it for sharing code.  One of those features is the ability to create an export of all modified files since the previous release.  A common scenario is when the team is working on a web application and it’s time to deploy all the recent changes to the production server.  An app that is distributed would normally use tags or branches to keep the versions straight.  But some teams prefer to just keep moving forward on the HEAD revision and never look back.  If this sounds like you, luckily SVN provides an easy way to get all changed files since your last deployment and package them up with just a few clicks.

Lets say that you last deployed your application from repository version #500.  After a few weeks of development, the repository is now up to revision #575.  The team has decided that the code is stable and you are ready to package up all new/changed files to transfer to the host server, client, etc.

1. Using TortoiseSVN, right-click on your working folder and select “Show Log” from the TortoiseSVN menu.

2. Click the revision that was last published (#500 in this example)

3. Ctrl+Click the HEAD revision (or whatever revision you want to release ie #575) so that both the old and the new revisions are highlighted.

4. Right-click on either of the highlighted revisions and select “Compare revisions.”  This will open a dialog window that lists all new/modified files.

5. Select all files from this list (Ctrl+a) then right-click on the highlighted files and select “Export selection to…”

You’ll be prompted for a location to save your updated files and SVN will export them all with the directory structure preserved.  You can then zip this up for your client, transfer it to your host or whatever you normally do to deploy the application.

Some teams prefer to actually do an update right on the production server and simply checkout the files that way.  If your hosting setup permits and you don’t mind the “.svn” files in on your server, that is another easy option for deploying code.

For even more automation, this could all be done using batch, shell or ant build scripts.  If you have such a script, please feel free to post it in the comments.


원문 : http://www.verysimple.com/blog/2007/09/06/using-tortoisesvn-to-export-only-newmodified-files/

이올린에 북마크하기(0) 이올린에 추천하기(0)

Posted by 좐군

2009/09/02 21:03 2009/09/02 21:03
, ,
Response
No Trackback , No Comment
RSS :
http://John.tobe30.com/tc/rss/response/192

Trackback URL : http://John.tobe30.com/tc/trackback/192

Leave a comment
[로그인][오픈아이디란?]

[개발방법론] .NET 플랫폼의 설계요소

간만에 기본에 충실해 보려고 한다. CBD개발론을 이야기하는  .NET 플랫폼 웹 어플케이션의 설계요소에 대해 알아볼려고 한다.

1. 프리젠테이션 로직(Presentation Logic) : 경계 클래스(Boundary Class)

  •  HTML : 사용자에게 보여줄 정적인 웹페이지를 만들 때 사용
  • ASP.NET 페이지(코드비하인드) : 사용자에게 보여줄 동적인 웹 페이지를 만들 때 사용.

2. 비지니스 로직 (Business Logic) : 제어 클래스(Control Class)

  •  BLO (Business Logic Object) : 비지니스 로직을 구현할 때 사용되는 클래스.
    하나의 BLO의 각 메소드는 독립적인 기능을 제공하는 하나의 단위 역할만 수행해야 함.(서로 의존하지 않아야 함)
    데이터베이스에 직접 접근하지 않음.

  • 로컬 클래스 BLO
    public class BizObject {
    }

  • 원격 클래스 BLO
    .NET Remoting 기술.
    MarshalByRefObject 기술.
    public class BizObject : MarshalByRefObject {
    }

  • COM+ 클래스 BLO
    COM+가 제공하는 트랜잭션, 객체 활성화, 동기화 등의 서비스를 제공 받을 수 있는 클래스
    ServicedComponent 클래스를 계승 받아서 정의
    ServicedComponent 클래스는 MarshalByRefObject의 하위 클래스이기 때문에, COM+ 클래스는 기본적으로 원격 클래스 (분산환경지원)
    public class BizObject : ServicedComponent {
    }



3. 데이터 접근 로직 (Data Access Logic)
: 실체 클래스(Entity Class)

  • DAO (Data Access Object) : 데이터베이스의 테이블에 접근할 때 사용되는 클래스.
    보통 필드를 가지고 있지 않음.
    일반적으로 다른 DAO와 의존하지 않음.
    DAO만이 데이터베이스에 접근함.
    비지니스 로직을 전혀 포함하고 있지 않음.
    DAO는 BLO에서 이용되어짐.

  • TABLE : 데이터베이스에 구축되는 각 테이블.


오늘 우리 현실에 대한 반성과 나태함에 대해 꾸짖고자 한다. 갑자기 이게 무슨 이야기인가하고 좀 쌩뚱맞아 할 수도 있다. 이런 기본적이 내용을 정리하고 있으니 약간 한심한 생각이 들기도 하고 분야에 대한 공부를 너무 안한 것을 반성하게 된다. 위 내용은 객체지향 설계에 대해 약간 공부를 했다면 너무나도 많이 들어보았던 내용일 것이다. 그 말은 즉 기본 중에 기본, S/W 개발업종에 있는 사람이라면 교양과도 같은 내용인 것이다. 허나  현실은 어떠한가? 주위를 둘러보면 이런 개념조차 존재하지 않는 사람이 프로그래밍을 하고 있다. 공장에서 물건을 찍어내듯이 소스코드를 작성하는 코드생산직들이 대부분인 것이다. 만일 이 단계를 뛰어넘지 못한다면 시간이 좀 지난 뒤에 중국/인도인력 또는 신입들과의 경쟁에서 밀려 호떡장사를 해야할 지도 모를 일이다. 그래서 우리는 이제 아키텍처를 설계하는 능력, 비지니스를 분석/설계 능력, 커뮤니케이션을 원활히 하는 능력을 겸비한 기술리더로 거듭나야 할 것이다. 다시 말해 비지니스를 만드는 사람, 새로운 모델을 만들어 문제를 해결하는 사람, 불편함을 해결하는 사람과 같은 기업에서 가치를 창출하는 사람이 되여야 하는 것이다.


이올린에 북마크하기(0) 이올린에 추천하기(0)

Posted by 좐군

2009/06/03 01:21 2009/06/03 01:21
, , , , ,
Response
No Trackback , No Comment
RSS :
http://John.tobe30.com/tc/rss/response/159

Trackback URL : http://John.tobe30.com/tc/trackback/159

Leave a comment
[로그인][오픈아이디란?]

DDD(Domain Driven Design) Overview

간만에 서핑중에 좋은글 발견해서 스크랩질... DDD에 대한 글이다.
DDD(Domain Driven Design) Overview
- David Laribee -

DDD(Domain Driven Design)는 정교한 개체 시스템을 제작하는 데 도움이 되는 원칙과 패턴의 집합입니다. 이를 올바르게 적용하면 도메인 모델이라고 하는 소프트웨어 추상화를 달성할 수 있습니다. 이러한 모델을 복잡한 비즈니스 논리를 캡슐화하고 비즈니스 현실과 코드 간의 격차를 완화할 수 있습니다.
이 기사에서는 DDD와 밀접하게 연관된 기본 개념과 디자인 패턴을 살펴보겠습니다. 이 기사는 풍부한 도메인 모델의 설계 및 발전을 위한 기본적인 소개라고 보면 적당합니다. 논의와 관련된 약간의 배경 정보를 제공하기 위해 필자가 잘 알고 있는 복잡한 비즈니스 영역인 보험 정책 관리에 대해 다루겠습니다.
이 기사에서 다루는 주제에 대해 더 자세히 알아보려면 Eric Evans의 Domain-Driven Design: Tackling Complexity in the Heart of Software라는 책을 읽어 보십시오. 이 책은 DDD에 대한 최초의 입문서일 뿐만 아니라 풍부한 경험을 갖춘 소프트웨어 디자이너가 제공하는 귀중한 정보의 보고입니다. 이 기사에서 설명할 DDD의 패턴과 핵심적인 특성은 이 책에 설명된 개념을 기반으로 합니다.

구조적 필요에 따른 컨텍스트 잘라내기
바인딩된 컨텍스트를 전적으로 응용 프로그램의 기능 영역에 따라서 구성할 필요는 없습니다.. 바인딩된 컨텍스트는 바람직한 구조적 예를 확보하기 위해 시스템을 분할하는 데 유용합니다. 이러한 방식의 전형적인 예는 견고한 트랜잭션 영역과 보고서 포트폴리오를 모두 가진 응용 프로그램입니다.
이러한 상황(비교적 자주 발생함)에는 트랜잭션 데이터베이스로부터 보고 데이터베이스를 분리하는 것이 바람직한 경우가 많습니다. 여러분은 신뢰할 수 있는 보고서를 개발하기 위해 적당한 수준의 정규화를 추구할 자유를 원하고, 트랜잭션 비즈니스 논리를 계속 개체 지향 패러다임으로 코딩할 수 있도록 개체 관계형 매퍼 사용을 원합니다. MSMQ(Microsoft Message Queue)와 같은 기술을 사용하면 모델의 데이터 업데이트를 게시하고 보고 및 분석을 위해 최적화된 데이터 웨어하우스에 이를 통합할 수 있습니다.
놀라운 사실로 받아들이는 사람도 있겠지만, 데이터베이스 관리자와 개발자는 사이좋게 지낼 수 있습니다. 바인딩된 컨텍스트를 통해 이 약속된 땅을 희미하게 볼 수 있습니다. 구조적인 바인딩된 컨텍스트에 관심이 있다면Greg Young의 블로그를 방문해 보십시오. Greg은 이 방식에 대해 풍부한 경험과 지식을 가지고 있으며 풍부한 관련 콘텐츠를 제공합니다.




















플라톤의 모델
아직은 시작하는 단계이므로 모델의 의미부터 확인하는 것이 좋겠습니다. 이 질문에 답하기 위해서는 형이상학적인 짧은 여행을 떠나야 하며 이러한 여행에 플라톤보다 더 좋은 안내자는 없을 것입니다.
소크라테스의 가장 유명한 제자인 플라톤은 우리가 인식하고 인지하는 개념, 사람, 장소, 그리고 사물이 단순히 진실의 그림자라고 주장했습니다. 그는 이러한 실체의 개념을 형상(Form)이라고 했습니다.
플라톤은 형상을 설명하기 위해 동굴의 비유라고 하는 이야기를 사용했습니다. 이 비유에는 깊고 어두운 동굴에 사는 사람들이 등장합니다. 이 동굴인들은 동굴 입구를 통해 들어오는 빛에 의해 동굴 벽에 비치는 모양만 볼 수 있습니다. 입구를 통해 동물이 들어오면 동굴인들은 동굴 내부로 투영되는 동물의 그림자를 봅니다. 동굴인들에게는 이러한 그림자가 실체입니다. 사자가 들어오면 이들은 사자의 그림자를 가리키며 "숨어라!"하고 소리칩니다. 그러나 이들이 가리키는 것은 실제 형상인 사자의 그림자일 뿐입니다.
플라톤의 형상 이론은 DDD와 연결할 수 있습니다. 형상 이론의 지침 중 많은 부분이 점차적으로 이상적인 모델에 접근하는 데 도움이 됩니다. 코드를 통해 설명하고자 하는 형상에 이르는 길은 도메인 전문가의 마음, 이해관계자의 욕구, 그리고 여러분이 일하고 있는 업계의 요구 사항에 분산되어 있습니다. 이러한 항목들은 플라톤이 생각한 동굴인들의 그림자라고 할 수 있습니다.
또한 형상에 도달하는 과정에서 프로그래밍 언어 및 시간과 예산의 고려 사항으로 제약을 받는 경우가 많습니다. 이러한 제약은 동굴인들이 동굴 벽에 비친 그림자만 볼 수 있다는 제약과 비슷합니다.
좋은 모델에는 구현에 관계없이 몇 가지 특성이 있습니다. 중요한 사실은 도메인 모델러라면 모든 사람들이 생각하는 모델과 여러분이 코딩하려는 모델 간의 불일치를 이해해야 한다는 것입니다.
여러분이 개발하는 소프트웨어는 실제 모델이 아니며 그림자, 즉 여러분이 달성하려는 응용 프로그램 형상의 표현일 뿐입니다. 완벽한 솔루션의 모조품이지만 점차적으로 실제 형상에 가깝게 만들 수 있습니다.
DDD에서는 이 개념을 모델 기반 설계라고 합니다. 모델에 대한 이해는 코드에서 발전됩니다. 도메인 기반 디자이너는 설명서나 복잡한 다이어그램 도구에 신경을 쓰기보다는 도메인에 대한 자신의 이해를 직접 코드로 구현할 방법을 탐구합니다
모델을 캡처하는 코드 개념이 DDD의 핵심입니다. 소프트웨어의 초점을 당면한 문제와 이 문제를 해결하는 데 두면 새로운 통찰과 개명의 순간을 받아들이는 소프트웨어를 얻게 됩니다. 필자는 지식을 모델에 갈아 넣는다고 했던 Eric Evans의 표현이 마음이 듭니다. 도메인에 대한 중요한 무엇인가를 배운다면 여러분은 어디로 가야 하는지 알게 될 것입니다.

대화의 이해
이러한 목표를 달성하기 위해 DDD에서 제공하는 몇 가지 기술을 살펴보겠습니다. 개발자로 일하다 보면 제공해야 하는 기능을 이해하기 위해 코딩과는 무관한 사람과 협조할 일이 많습니다. 프로세스를 갖춘 조직에서 일하고 있다면 사용자 스토리, 작업 또는 사용 사례 등으로 표현된 요구 사항이 있을 것입니다. 요구 사항이나 사양은 어떤 종류든 완벽한 경우는 없습니다.
일반적으로 요구 사항은 다소 정리가 되어 있지 않고 개략적인 이해로 표현됩니다. 솔루션 설계와 구현 과정에서 개발자가 대상 도메인에 대한 전문 지식을 갖춘 사람과 함께 작업할 수 있다면 도움이 됩니다. 바로 이것이 사용자 스토리의 요점이며, 일반적으로 "나는 [역할]로서 [기능]을 통해 [혜택]을 얻기를 원한다"는 형태의 템플릿으로 표현됩니다.
보험 정책 관리 도메인에 해당되는 예로 "나는 보험업자로서 정책에 대한 승인 제어 기능을 통해 안전한 노출은 서명하고 위험한 노출은 거부할 수 있기를 원한다"를 살펴보겠습니다.
이 요구 사항의 의미를 이해하실 수 있습니까? 필자는 이것이 쓰여지고 우선 순위가 할당된 것을 보았을 때 그 의미를 이해하지 못했습니다. 이렇게 추상화된 설명만으로 이를 지원하는 소프트웨어를 제공하는 데 필요한 모든 요소를 이해하기란 불가능합니다.
제대로 작성된 사용자 스토리는 이 스토리의 저자, 즉 사용자와 대화할 수 있는 초대장입니다. 이는 정책 승인/거부 기능을 다룰 때는 보험업자와 함께 작업하는 것이 이상적임을 의미합니다. 익숙하지 않은 독자를 위해 소개하자면 보험업자는 특정 노출 범주를 보험 회사가 보장해도 안전한지 여부를 결정하는 도메인 전문가입니다.
보험업자(또는 해당 프로젝트의 다른 도메인 전문가)와 기능에 대해 논의할 때는 보험업자가 사용하는 용어에 주의를 기울여야 합니다. 이러한 도메인 전문가는 회사 또는 업계 표준 용어를 사용합니다. DDD에서는 이러한 용어를 보편적 언어라고 합니다. 개발자는 이러한 용어를 이해하고 도메인 전문가와 대화할 때 이러한 용어를 사용하는 것은 물론 코드에도 같은 용어를 반영해야 합니다. 대화에 "등급 코드"나 "보험료율" 또는 "노출"과 같은 용어가 자주 등장한다면 코드에도 이에 해당하는 클래스 이름이 나와야 한다는 것입니다.
이것은 DDD의 지극히 기본적인 패턴입니다. 얼핏 보기에 보편적 언어는 당연한 것처럼 보이며, 이미 여러분 중 일부는 이러한 용어를 직관적으로 사용하고 있을 것입니다. 개발자가 코드에 비즈니스 용어를 의식적으로, 그리고 통제된 규칙에 따라 사용하는 것이 중요합니다. 이렇게 함으로써 비즈니스 용어와 기술 용어 간의 격차를 줄일 수 있습니다. "어떻게"는 "무엇"의 아래에 들어가고, 여러분은 비즈니스 가치 제공이라는 업무의 이유에 가까워질 수 있습니다.

컨텍스트
개발자는 어떤 의미에서 조직자라고 할 수 있습니다. 개발자는 문제를 해결하는 추상화로 코드를 던져넣습니다(물론 여기에는 명확한 의도가 있는 것이 좋겠지요). 디자인 패턴, 계층 아키텍처, 개체 지향 원칙과 같은 도구는 끊임없이 복잡해지고 있는 시스템에 질서를 두기 위한 프레임워크를 제공합니다.
DDD는 조직적 도구를 확대하고 잘 알려진 업계 패턴을 차용합니다. DDD가 제공하는 조직적 패턴에서 필자가 가장 마음에 드는 부분은 시스템의 모든 세부 수준에 맞는 솔루션이 있다는 것입니다. 바인딩된 컨텍스트는 소프트웨어를 모델의 포트폴리오처럼 생각할 수 있는 방법을 안내합니다. 모듈은 큰 단일 모델을 작은 조각으로 조직화하는 데 도움을 줍니다. 뒷부분에서는 몇 가지 관련 클래스 간의 소규모 공동 작업을 조직화하기 위한 기술인 집계 루트에 대해 살펴보겠습니다.
대부분의 엔터프라이즈 시스템에는 책임이 성긴 영역이 있습니다. DDD는 이러한 조직의 최상위 수준을 바인딩된 컨텍스트라고 합니다.
노동자 재해 보장 보험 정책의 경우 다음과 같은 요소를 고려해야 합니다.
  • 견적 및 영업
  • 일반 정책 워크플로(갱신, 종결)
  • 급료 추정치 감사
  • 분기별 자체 평가
  • 보험료 설정 및 관리
  • 대리점 및 중개인 수수료 지불
  • 고객 과금
  • 일반 회계
  • 수용 가능한 노출 결정(보험업)
네, 정말 많습니다. 이러한 모든 사항을 하나의 단일 시스템에 통합할 수 있지만 그렇게 하면 알아보기 어렵고 형태가 정확하지 않은 결과를 얻게 됩니다. 일반 워크플로 컨텍스트의 정책과 급료 감사 컨텍스트의 정책은 같은 정책이라도 그 내용은 완전히 다릅니다. 같은 정책 클래스를 사용한다면 해당 클래스의 프로필이 비대해지는 것은 물론이고 SRP(단일 책임 원칙)와 같은 신뢰할 수 있는 최선의 방법과 멀어지게 됩니다.
바인딩된 컨텍스트를 격리하고 차단하지 않으면 시스템은 커다란 진흙덩이(Big Ball of Mud)라는 우스꽝스런 아키텍처 스타일을 갖게 됩니다. 커다란 진흙덩이는 1999년 Brian Foot와 Joseph Yoder가 같은 이름의 논문에서 정의한 아키텍처 스타일(또는 아키텍처에 반하는 스타일)의 이름입니다.
DDD는 컨텍스트를 식별하고 특정 컨텍스트로 모델링 노력을 제한하도록 권장합니다. 컨텍스트 맵이라고 하는 간단한 다이어그램을 사용하여 시스템의 경계를 탐색할 수 있습니다. 필자는 완전한 기능을 갖춘 보험 정책 관리 시스템과 연관된 컨텍스트를 나열했으며 그림 1은 텍스트 설명을 부분적인 그래픽 컨텍스트 맵으로 만들어 보여 줍니다.
그림 1 바인딩된 컨텍스트에서 컨텍스트 맵으로














다양한 바인딩된 컨텍스트 간의 몇 가지 핵심적인 관계를 볼 수 있을 것입니다. 이러한 정보는 패키징 및 배포 설계, 모델 간 메시지 마샬링에 사용할 기술 선택, 그리고 무엇보다 마일스톤을 설정하고 노력, 시간, 인력을 투입할 위치 선택과 같은 비즈니스 의사 결정과 아키텍처 의사 결정을 충분한 정보를 바탕으로 내릴 수 있도록 해 주는 귀중한 정보입니다.
바인딩된 컨텍스트에 대한 마지막으로 중요한 개념은 각 컨텍스트가 자체적인 보편적 언어를 가진다는 것입니다. 감사 하위 시스템의 정책과 핵심 워크플로의 정책은 다른 것이므로 개념을 차별화하는 것이 중요합니다. 값 개체와 자식 엔터티(자세한 내용은 조금 뒤에 설명)는 동일한 ID를 가질 수는 있지만 서로 전혀 다른 경우가 많습니다. 컨텍스트 내에서 모델링하는 것이므로 도메인 전문가와 팀 내의 구성원 간에 생산적인 의사 소통을 위해 언어가 컨텍스트 내에서 정확성을 제공하기를 원할 것입니다.
모델 내의 일부 영역은 다른 영역보다 밀접하게 그룹화됩니다. 모듈은 이러한 그룹을 특정 컨텍스트 내에 정리하기 위한 방법이며 다른 모듈과의 연결에 대해 생각해 볼 수 있는 작은 경계의 역할을 합니다. 또한 "작은 진흙덩이"를 피할 수 있는 또 다른 조직 기술이기도 합니다. 기술적으로 말해 모듈을 만들기는 쉽습니다. Microsoft .NET Framework에서 모듈은 네임스페이스입니다. 그러나 모듈을 식별하기 위해서는 코드에 조금 더 시간을 투자해야 합니다. 모델 내에서 몇 가지 항목들이 작은 모델을 이루는 경우가 있으며, 이 경우 항목을 네임스페이스로 분할하는 것을 고려할 수 있습니다.
모델을 밀착된 모듈로 분리하는 방법은 IDE에도 긍정적인 영향을 미칩니다. 즉, 모듈을 명시적으로 포함하기 위해 여러 개의 using 문을 사용해야 하므로 훨씬 깔끔한 IntelliSense 환경이 만들어집니다. 또한 NDepend와 같은 정적 분석 도구를 사용하여 보다 큰 시스템의 개념적 청크 간 연결을 볼 수 있는 방법도 제공합니다.
모델이 조직적 변경을 추가할 때는 실용적인 비용 대비 장점에 대한 고려를 해야 합니다. 모듈(또는 네임스페이스)을 사용하여 모델을 나눌 경우 별개의 컨텍스트를 다루고 있는 것인지 여부를 질문해야 합니다. 다른 컨텍스트를 분리해 내는 데 따르는 비용은 일반적으로 훨씬 더 큽니다. 분리한 후에는 모델이 두 개가 되고 어셈블리도 두 개가 될 가능성이 높습니다. 그리고 여기에 응용 프로그램 서비스, 컨트롤러 등을 연결해야 합니다.

ACL(Anti-Corruption Layer)
ACL(Anti-Corruption Layer)은 도메인에 속하지 않는 개념이 모델로 유출되지 않도록 방지하는 문지기를 만들도록 권장하는 다른 DDD 패턴입니다. 이를 통해 모델을 깨끗하게 유지할 수 있습니다.
기본적으로 리포지토리는 ACL의 한 유형입니다. 모델 외부에 SQL이나 ORM(개체 관계형 매핑) 구조를 유지합니다.
ACL은 Michael Feathers가 그의 저서 Working Effectively With Legacy Code에서 이음새라고 부르는 것을 도입하기 위해 훌륭한 기술입니다. 이음새란 기존의 일부 코드를 분리하고 변경 도입을 시작할 수 있는 영역입니다. DDD 기술을 사용하여 코드에서 가장 가치가 높은 부분을 리팩터링 및 강화할 때는 코드 도메인 격리 및 이음새 찾기가 매우 유용하게 사용됩니다.














스스로의 가치 제안 알기
대부분의 개발 업체에서 문제를 격리 및 설명할 수 있고 유지 관리가 용이한 정교한 개체 지향 솔루션을 구축할 수 있는 최고 수준의 개발자와 숙련된 비즈니스 인력은 소수입니다. 고객에게 최대한의 이익을 제공하기 위해서는 응용 프로그램의 핵심 도메인을 확실하게 이해해야 합니다. 핵심 도메인은 DDD 적용에 가장 많은 가치를 제공하는 바인딩 컨텍스트입니다.
모든 엔터프라이즈 시스템에는 다른 영역보다 더 중요한 영역이 있습니다. 이러한 중요 영역은 클라이언트의 핵심 경쟁력과 일치하는 경향이 있습니다. 기업에서 사용자 지정 범용 회계 소프트웨어를 사용하는 경우는 드뭅니다. 그러나 앞에서 설명한 예와 같이 업무가 보험이고 모든 구성원 간에 책임이 분산되는 위험 풀을 관리하여 이윤을 창출하는 기업이라면 좋지 않은 위험은 거부하고 추세를 식별하는 데 탁월한 능력을 발휘해야 합니다. 또는 클라이언트가 의료 분쟁 처리 업체이고, 이들의 전략이 지급을 자동화하여 결제 부서의 능률을 강화함으로써 가격 경쟁력을 갖추는 것일 수 있습니다.
어떤 업계든 여러분의 고용주나 클라이언트는 시장에서 나름의 강점이 있을테고, 일반적으로 사용자 지정 소프트웨어는 이러한 강점에서 발견할 수 있습니다. 대부분의 경우 이 사용자 지정 소프트웨어에서 핵심 도메인을 찾고 모델링합니다.
다른 차원, 즉 기술적 우위를 얻기 위해 지적 자산을 투자하는 곳에서 투자의 가치를 측정할 수 있습니다. 선임 개발자가 새로운 기술에 집착하는 부류의 사람들인 경우가 많습니다. 이러한 현상은 어느 정도는 당연한 것입니다. 업계에서는 빠른 속도로 혁신이 이루어지고, 공급업체는 고객의 요구에 부응하고 경쟁력을 유지하기 위해 빈번하게 새로운 기술을 출시해야 하기 때문입니다. 여기에서 과제는 선임 개발자가 시스템의 핵심에 가치를 부여할 수 있는 기본 원칙과 패턴을 완벽하게 익히는 것입니다. 새로운 프레임워크나 플랫폼을 사용하여 성급하게 작업을 완료하고 싶은 생각이 들 수도 있지만 공급업체에서 이러한 제품을 개발하는 이유는 제품을 안심하고 사용할 수 있도록 하기 위한 것임을 기억할 필요가 있습니다.

단일 책임의 시스템
앞서 필자는 DDD에서 풍부한 도메인 모델을 구성하기 위한 패턴 언어를 제공한다고 언급했습니다. 이러한 패턴을 구현하면 어느 정도 수준까지 비용을 들이지 않고도 SRP를 준수할 수 있으며 이것은 분명 상당히 유용합니다.
SRP는 인터페이스나 클래스의 핵심 목적에 도달하도록 지원하며 높은 응집성을 확보할 수 있도록 안내합니다. 높은 응집성은 코드의 검색, 재사용 및 유지 관리의 용이성을 높여 주는 매우 바람직한 특성입니다.
DDD는 패턴의 핵심 컬렉션에서 특정 유형의 클래스 책임을 식별합니다. 여기에서는 몇 가지 기본적인 부분에 대해 설명하겠습니다. 클래스 수준부터 아키텍처에 이르는 다양한 패턴에 대한 내용은 Eric Evans의 저서를 참조하십시오. 이 기사에서는 소개라는 목적에 맞게 엔터티, 값 개체, 집계 루트, 도메인 서비스 및 리포지토리를 다루는 클래스 수준에 대해서만 설명하겠습니다. 또한 각 패턴의 책임은 각각 한두 개의 코드 예와 팁을 통해 다루겠습니다.

ID와 수명을 가지는 엔터티
엔터티는 여러분의 시스템에서 "어떤 것"입니다. 사람, 장소, 그리고 물건과 같은 명사라고 생각하면 이해하기 쉽습니다.
엔터티는 ID와 수명 주기를 가집니다. 예를 들어 필자의 시스템에서 특정 고객에 액세스하려면 번호를 사용하여 고객을 지정할 수 있습니다. 계약이 완료되면 시스템에서 사용할 필요가 없게 되므로 장기 저장소(히스토리 보고 시스템)로 보낼 수 있습니다.
엔터티는 데이터 단위라기보다는 동작의 단위로 생각할 수 있습니다. 이를 소유하는 엔터티에 논리를 넣도록 해야 합니다. 대부분의 경우 모델에 추가하려는 작업을 받아야 하는 엔터티가 있거나 새로운 엔터티를 작성 또는 추출해야 합니다. 취약한 코드의 경우 엔터티 외부에서 유효성을 검사하는 서비스나 관리자 클래스를 많이 볼 수 있습니다. 일반적으로 필자는 엔터티 내에서 이와 같은 작업을 하는 것을 선호합니다. 이렇게 하면 캡슐화의 기본 원칙에서 제공되는 모든 혜택을 얻을 수 있으며 엔터티를 동작 기반으로 만들 수 있습니다.
일부 개발자는 엔터티에 종속성을 넣는 일에 신경을 씁니다. 시스템의 다양한 엔터티 간의 연결을 만들 필요는 분명히 있습니다. 예를 들어 정책의 적절한 기본값을 결정하기 위해 Policy 엔터티에서 Product 엔터티를 가져와야 하는 경우가 있습니다. 사람들이 어려움을 겪는 경우는 엔터티 내부의 작업을 수행하기 위해 일부 외부 서비스가 필요한 경우입니다.
필자라면 엔터티가 아닌 다른 클래스가 필요하다는 사실에 신경을 쓰지 않고 엔터티 외부에서 중심 동작을 가져오는 것을 피하기 위해 노력할 것입니다. 엔터티는 본질적으로 동작 단위라는 것을 기억해야 합니다. 이러한 동작은 상태 시스템의 한 종류로 구현되는 경우가 많지만(엔터티에서 명령을 호출하면 이 명령이 엔터티의 내부 상태 변경을 책임짐) 추가 데이터를 가져오거나 외부에 부수적 효과를 유발해야 하는 경우가 있습니다. 이러한 목표를 위해 필자가 선호하는 기술은 명령 메서드에 종속성을 제공하는 것입니다.
public class Policy {
  public void Renew(IAuditNotifier notifier) {
    // do a bunch of internal state-related things,
    // some validation, etc.
    ...
    // now notify the audit system that there's
    // a new policy period that needs auditing
    notifier.ScheduleAuditFor(this);
  }
}
이 방식의 장점은 엔터티를 생성하기 위해 IOC(제어 반전) 컨테이너가 필요 없다는 것입니다. 서비스 검색기를 사용하여 메서드 내에서 IAuditNotifier를 확인하는 방법도 필자가 보기에는 충분히 선택 가능한 방법입니다. 이 기술은 인터페이스를 깨끗하게 유지하는 장점이 있지만 전자의 전략을 사용하면 더 높은 수준에서 종속성에 대해 더 많은 것을 알 수 있습니다.

대상을 설명하는 값 개체
값 개체는 모델링하는 도메인의 중요한 설명자 또는 속성입니다. 엔터티와는 달리 ID를 가지지 않으며 ID를 가지는 대상을 설명하는 역할을 합니다. "35달러"라는 엔터티를 변경할까요, 아니면 잔고를 늘릴까요?
값 개체의 장점 중 하나는 훨씬 정교하며 의도가 드러나는 방식으로 엔터티의 속성을 설명한다는 것입니다. 일반적인 값 개체인 돈의 경우 십진수보다는 자금 이체 API의 함수 매개 변수가 더 적절합니다. 인터페이스나 엔터티 메서드에서 이러한 매개 변수를 보면 어떤 의미인지 즉시 알 수 있습니다.
값 개체는 변경할 수 없습니다. 일단 생성된 후에는 변경 기능이 없습니다. 변경 불가능한 것이 중요한 이유는 무엇일까요? 값 개체를 사용하면 DDD에서 가져온 다른 개념인 부수적 효과가 없는 함수를 추구할 수 있습니다. 20달러에 20달러를 더하면 20달러를 변경하는 것일까요? 아닙니다. 40달러의 새로운 돈 설명자를 만드는 것입니다. C#에서는 그림 2에 나오는 것처럼 public 필드에 readonly 키워드를 사용하여 불변성과 부수적 효과가 없는 함수를 강제할 수 있습니다.
public class Money {
  public readonly Currency Currency;
  public readonly decimal Amount;

  public Money(decimal amount, Currency currency) {
    Amount = amount;
    Currency = currency;
  }

  public Money AddFunds(Money fundsToAdd) {
    // because the money we're adding might
    // be in a different currency, we'll service 
    // locate a money exchange Domain Service.
    var exchange = ServiceLocator.Find<IMoneyExchange>();
    var normalizedMoney = exchange.CurrentValueFor(fundsToAdd,         this.Currency);
    var newAmount = this.Amount + normalizedMoney.Amount;
    return new Money(newAmount, this.Currency);
  }
}

public enum Currency {
  USD,
  GBP,
  EUR,
  JPY
}

엔터티를 결합하는 집계 루트
집계 루트는 소비자가 직접 참조하는 특별한 종류의 엔터티입니다. 집계 루트를 식별하면 몇 가지 간단한 규칙을 적용함으로써 모델을 구성하는 개체의 과도한 연결을 방지할 수 있습니다. 집계 루트는 하위 엔터티를 적극적으로 보호합니다.
가장 큰 원칙은 집계 루트가 소프트웨어에서 참조를 저장할 수 있는 유일한 엔터티 종류라는 것입니다. 이를 통해 모든 요소가 상호 연결되는 밀결합 시스템을 방지하는 제약 조건을 확보하므로 커다란 진흙덩이가 되는 것을 차단할 수 있습니다.
Policy라는 엔터티가 있다고 가정해 보겠습니다. 정책은 매년 갱신되므로 Period라는 엔터티도 있을 것입니다. Period는 Policy 없이는 존재할 수 없고, Policy를 통해 Period에 작업을 수행할 수 있기 때문에 Policy는 집계 루트라고 할 수 있으며 Period는 이러한 항목의 자식입니다.
필자는 집계 루트가 스스로 작업을 처리하는 방식을 선호합니다. Policy 집계 루트에 액세스하는 다음과 같은 소비자 코드를 살펴보겠습니다.
Policy.CurrentPeriod().Renew() 
여기에서는 보험 정책을 갱신하려고 합니다. 보험 정책 관리의 핵심 도메인에 대한 클래스 다이어그램을 다시 떠올려 보십시오. 호출하려는 동작에 어떻게 연결하는지 확인하십시오.
이 방법에는 두 가지 문제가 있습니다. 첫째, 여기에서는 명백하게 데메테르의 법칙을 위반하고 있습니다. 개체 O의 메서드 M은 자체, 매개 변수, 생성 또는 인스턴스화하는 개체 또는 직접 구성 요소 개체에 해당하는 개체의 메서드만 호출할 수 있습니다.
이러한 본격적인 연결 기능이 편리하지 않을까요? IntelliSense는 Visual Studio와 최신 IDE의 훌륭하고 유용한 기능입니다. 그러나 호출하려는 함수를 연결하는 경로를 연결하면 시스템에 불필요한 결합이 추가됩니다. 이전 예의 경우에는 Policy 클래스와 Period 클래스에 의존하는 것입니다.
이와 관련된 보다 자세한 의미, 이론, 도구 및 유의할 사항에 대해서는 데메테르의 법칙에 대한 Brad Appleton의 기사를 읽어 보십시오.
과도하게 결합된 시스템에서 발생할 수 있는 관리상의 어려움은 흔한 말로 "고문"과도 같습니다. 여기저기에 불필요한 참조를 만들면 한곳에서 변경을 수행할 때 모든 소비자 코드에 걸쳐 연쇄적인 변경이 일어나는 융통성 없는 모델이 만들어집니다. 다음과 같이 나타내는 것이 분명한 간단한 코드로 같은 목표를 달성할 수 있습니다.
Policy.Renew()
집계가 어떻게 방법을 알아내는지 보이십니까? 집계는 내부적으로 현재 기간과 새로운 기간이 이미 있는지 여부, 그리고 필요한 다른 사항을 알아낼 수 있습니다.
BDD(Behavior Driven Development)와 같은 기술을 사용하여 집계 루트를 단위 테스트하면 테스트가 블랙박스 및 상태 테스트 패러다임에 가까워지는 경향이 있습니다. 집계 루트와 엔터티는 최종적으로 상태 시스템이 되는 경우가 많으며 동작은 적절하게 일치합니다. 최종적으로 상태 유효성 검사, 더하기 및 빼기가 됩니다. 그림 3에 있는 갱신 예를 보면 상당히 많은 동작이 수행되고 있으며 이를 BDD 스타일의 테스트로 나타내는 방법은 쉽게 알 수 있습니다.
public class 
  When_renewing_an_active_policy_that_needs_renewal {

  Policy ThePolicy;
  DateTime OriginalEndingOn;

  [SetUp]
  public void Context() {
    ThePolicy = new Policy(new DateTime(1/1/2009));
    var somePayroll = new CompanyPayroll();
    ThePolicy.Covers(somePayroll);
    ThePolicy.Write();
    OriginalEndingOn = ThePolicy.EndingOn;
  }

  [Test]
  public void Should_create_a_new_period() { 
    ThePolicy.EndingOn.ShouldEqual(OriginalEndingOn.AddYears(1));
  }
}

도메인 서비스 모델 기본 작업
도메인에 ID나 수명 주기가 없는 작업이나 프로세스가 있는 경우가 있습니다. 도메인 서비스는 이러한 개념을 모델링하는 도구를 제공합니다. 이들은 일반적으로 상태를 저장하지 않고 응집성이 매우 높으며 단일 공용 메서드를 제공하는 경우가 많고 집합에 대해 작업을 수행하는 오버로드를 제공하는 경우도 있습니다.
필자는 몇 가지 이유 때문에 서비스를 사용하는 것을 선호합니다. 필자는 동작에 여러 종속성이 연관되어 있고 엔터티에서 해당 동작을 배치할 자연스러운 위치를 찾을 수 없는 경우 서비스를 사용합니다. 보편적 언어가 1차 개념으로서 프로세스나 작업에 대해 이야기하는 경우에는 서비스가 모델 조율의 중심점으로 적당한지를 질문합니다.
갱신의 경우에는 도메인 서비스를 사용할 수 있습니다. 이것은 대안 스타일입니다. Policy 엔터티의 Renew 메서드의 메서드로 직접 IAuditNotifier를 주입하는 것이 아니라 도메인 서비스를 추출하도록 선택하여 종속성 확인을 처리할 수 있습니다. 엔터티보다는 IOC 컨테이너에서 도메인 서비스를 확인하는 것이 더 자연스럽습니다. 여러 종속성이 있는 경우에는 이 전략이 타당성이 있지만 대안을 소개하겠습니다.
다음은 도메인 서비스의 간략한 예입니다.
public class PolicyRenewalProcesor {
  private readonly IAuditNotifier _notifier;

  public PolicyRenewalProcessor(IAuditNotifier notifier) {
    _notifier = notifier;
  }
  public void Renew(Policy policy) {
    policy.Renew();
    _notifier.ScheduleAuditFor(policy);
  }
}
서비스라는 단어는 개발자의 세계에서 과용되는 측면이 있습니다. SOA(서비스 지향 아키텍처)에서의 서비스를 떠올리는 경우도 있지만 응용 프로그램에서 특정 인물, 장소 또는 대상을 나타내지는 않지만 종종 프로세스를 구체화하는 작은 클래스를 서비스로 생각하는 경우도 있습니다. 도메인 서비스는 일반적으로 후자의 범주에 해당하며 도메인 전문가가 보편적 언어로 전달하는 동사나 비즈니스 작업에 따라 명명됩니다.
반면에 응용 프로그램 서비스는 계층 아키텍처를 도입하는 훌륭한 방법입니다. 클라이언트 응용 프로그램에 필요한 형태로 도메인 모델 내부로 데이터를 매핑하는 데 사용할 수 있습니다. 예를 들어 DataGrid에 표 형식 데이터를 표시해야 하지만 모델의 세분화되고 거친 개체 그래프를 유지하고 싶은 경우가 있습니다.
응용 프로그램 서비스는 예를 들어 정책 감사와 핵심 정책 워크플로 사이의 변환과 같이 여러 모델을 통합하는 데도 상당히 유용합니다. 이와 비슷하게 인프라 종속성을 혼합하는 데도 이를 사용합니다. WCF(Windows Communication Foundation)를 사용하여 도메인 모델을 공개하는 일반적인 시나리오를 가정해 보겠습니다. 필자의 순수한 도메인 모델에 WCF가 유출되도록 하기보다는 WCF 특성을 지정한 응용 프로그램 서비스를 사용하여 이러한 시나리오를 구현할 수 있습니다.
응용 프로그램 서비스는 광범위하고 단순한 경향이 있으며 응집성 있는 기능을 구체화합니다. 그림 4에 나오는 인터페이스와 부분적인 구현을 응용 프로그램 서비스의 좋은 예로 생각할 수 있습니다.
public IPolicyService {
  void Renew(PolicyRenewalDTO renewal);
  void Terminate(PolicyTerminationDTO termination);
  void Write(QuoteDTO quote);
}

public PolicyService : Service {
  private readonly ILogger _logger;
  public PolicyService(ILogger logger, IPolicyRepository policies) {
    _logger = logger;
    _policies = policies;
  }

  public void Renew(PolicyRenewalDTO renewal) {
    var policy = _policies.Find(renewal.PolicyID);
    policy.Renew();
    var logMessage = string.Format(
      "Policy {0} was successfully renewed by {1}.", 
      Policy.Number, renewal.RequestedBy);
    _logger.Log(logMessage);
  }
}

리포지토리 저장 및 집계 루트 분배
엔터티를 검색하려면 어디로 가야 할까요? 그리고 이를 저장하려면 어떻게 해야 할까요? 리포지토리 패턴이 이러한 질문에 대한 답이 될 수 있습니다. 리포지토리는 메모리 내 컬렉션을 나타내며 최종적으로 집계 루트당 하나의 리포지토리를 사용하는 것이 적당하다는 것을 짐작할 수 있을 것입니다.
리포지토리는 슈퍼 클래스 또는 Martin Fowler가 Layer Supertype 패턴이라고 지칭한 것의 좋은 후보입니다. 이전 예에서는 간단하게 제네릭을 사용하여 기본 리포지토리 인터페이스에서 파생할 수 있습니다.
public interface IRepository<T>
  where T : IEntity
{
  Find<T>(int id);
  Find<T>(Query<T> query);
  Save(T entity);
  Delete(T entity);
}
리포지토리는 SQL 문이나 저장 프로시저와 같은 데이터베이스나 지속성 개념이 모델과 혼합되고 도메인 캡처라는 당면한 임무를 방해하지 않도록 방지합니다. 이러한 인프라로부터의 모델 코드 분리는 바람직한 특성입니다. 보다 자세한 논의는 "ACL(Anti-Corruption Layer)" 보충 기사를 참조하십시오.
지금쯤 아마 독자 여러분은 필자가 집계 루트, 하위 엔터티 및 연결된 값 개체가 어떻게 디스크에 유지되는지에 대한 이야기를 하는 것이 아님을 눈치챘을 것입니다. 이는 의도적인 것입니다. 모델에서 동작을 수행하는 데 필요한 데이터를 저장하는 것은 모델 자체와 직접적으로 엮이는 사항입니다. 지속성은 인프라입니다.
이러한 기술에 대한 설명은 DDD를 소개하는 이 기사의 범위를 많이 벗어납니다. 모델의 데이터를 저장하기 위한 옵션에는 ORM(개체 관계형 매핑) 프레임워크부터 간단한 시나리오에서 "직접 해결하는" 데이터 매퍼를 위한 문서 지향 데이터베이스에 이르기까지 적합하고 발전된 옵션이 많다는 정도만 알아 두십시오.













데이터베이스에 대한 사항
아마도 지금쯤에는 엔터티를 저장하는 방법이 궁금할 것입니다. 물론 이 중요한 사항은 반드시 처리해야 하지만 모델을 지속하는 방법이나 위치는 DDD 개요와는 큰 관련이 없습니다.
많은 개발자와 데이터베이스 관리자는 데이터베이스가 모델이라고 가정하는 경우가 많습니다. 그리고 부분적으로는 이것이 사실입니다. 데이터베이스를 높은 수준으로 정규화하고 다이어그램 도구를 사용하여 시각화하면 도메인의 정보와 관계에 대한 많은 내용을 전달할 수 있습니다.
그러나 기본 기술로서의 데이터 모델링에는 아쉬운 부분이 있습니다. 같은 도메인의 기본적인 동작을 이해하려는 경우 ERD(엔터티 관계 다이어그램)나 엔터티 관계 모델 및 클래스 다이어그램과 같이 데이터만 사용하는 기법으로는 결과를 얻을 수 없습니다. 응용 프로그램 부분이 작동하는 방법과 작업을 수행하기 위해 형식이 공동 작업하는 방법을 볼 수 있어야 합니다.
필자는 모델링할 때 의사 전달 도구로 화이트보드에 시퀀스 다이어그램을 사용하는 경우가 많습니다. 이렇게 하면 UML(Unified Modeling Language)이나 모델 기반 아키텍처와 같은 복잡한 과정 없이도 동작 설계나 문제에 대한 의사 전달의 핵심을 대부분 충족할 수 있습니다. 화이트보드에 그린 다이어그램을 곧 지울 계획이라면 굳이 복잡한 과정을 거칠 필요가 없습니다. 이러한 다이어그램은 UML을 완벽하게 준수할 필요가 없으며 필자는 빠르게 그릴 수 있는 간단한 상자, 화살표, 물결선을 선호합니다.
아직 팀에서 시퀀스 다이어그램을 사용하고 있지 않다면 이 기술을 배울 것을 권장합니다. 이 기술을 활용하면 팀 구성원들이 SRP, 계층 아키텍처, 데이터 모델링에서의 동작 설계, 그리고 전반적인 아키텍처 고려 사항에 이르기까지 문제점을 충분히 생각하고 해결하는 데 상당히 도움이 됩니다.

DDD 시작하기
개체 지향 프로그래밍에 익숙해지는 것은 절대 쉬운 과정이 아닙니다. 전문 개발자라면 대부분 자질을 갖추고 있겠지만 노력과 책을 통한 학습, 그리고 반복적인 연습이 필요합니다. 또한 장인 정신과 끊임없는 배움의 자세를 갖추고 있다면 도움이 됩니다.
그러면 어떻게 시작해야 할까요. 간단히 말해 여러분이 해야 할 일을 하십시오. S.O.L.I.D. 원칙과 같은 내용을 배우고 Eric Evans의 서적으로 공부하십시오. 이러한 시간 투자의 대가는 충분할 것입니다. InfoQ에서는 몇 가지 핵심 개념을 소개하는, 좀더 작은 범위의 DDD 서적을 출간했습니다. 예산이 충분하지 않거나 아직 더 알아보고자 하는 경우에는 이 책부터 시작하기를 권장합니다. 기반 지식을 갖춘 다음에는 Yahoo! DDD 그룹에서 동료 디자이너가 겪고 있는 문제에 대해 알아보고 대화에 참여하십시오.
DDD는 새로운 원칙이나 방법론이 아니며 오랫동안 증명된 전략의 모음입니다. 연습을 시작할 준비가 되면 여러분의 상황에 가장 적합한 원칙, 기술 및 패턴부터 적용해 보십시오. DDD의 일부 요소는 다른 요소에 비해 더 보편적으로 적용됩니다. 보편적 언어를 알아내고 사용하여 핵심 도메인의 존재 이유를 이해하고 모델링하는 컨텍스트를 식별하는 일은 완전히 불투명하고 천편일률적인 리포지토리를 고정하는 것보다 훨씬 더 중요한 일입니다.
솔루션을 설계할 때는 가치를 높이는 설계를 하십시오. 디자이너가 예술을 하는 사람이고 개발자가 일종의 디자이너라고 한다면 우리의 매체는 비즈니스 가치가 되어야 합니다. 원칙의 준수나 지속성 기술의 선택과 같은 고려 사항도 때로는 중요해 보이지만 가치에 대한 인식은 이러한 사항보다 더 중요합니다.
이올린에 북마크하기(0) 이올린에 추천하기(0)

Posted by 좐군

2009/03/06 13:26 2009/03/06 13:26
, ,
Response
No Trackback , No Comment
RSS :
http://John.tobe30.com/tc/rss/response/82

Trackback URL : http://John.tobe30.com/tc/trackback/82

Leave a comment
[로그인][오픈아이디란?]

How To Install Trac on Windows

원문 : http://how-to-solutions.com/how-to-install-trac-on-windows.html

Trac is front end to subversion with integrated wiki for developers. Use this How To article to help you install Trac on a Windows computer that isn’t running Apache. The guide assumes you have a working Subversion repository and are using the TortoiseSVN shell on client PC’s.

Introduction

Firstly let me say Trac is a brilliant bit of software. It is basically a friendly front end to subversion which is a version control system. Trac allows you to use its in-built tracd software so you can view Subversion changes through a browser. Working with developers, this lets you track changes to code easily as well as support development goals through Trac’s project management tools.

This How To guide is by no means a replacement for the Trac documentation. The Trac site and the support provided by their developers is really very good. However I ran into a number of problems when installing the software on a standalone Windows server that wasn’t running Apache.

Installation Files

Installing the Software

1. OK so let’s assume you have a working repository which we will say is located at E:\repos and a folder with all of your code located at E:\code.

2. Let’s install Python - Double click the python-2.5.2.msi file and select ‘Install for all users’. Click Next and then Next again (change the location of the Python install if you wish). Click Next once more and Python will start installing. Click Finish and that’s Python installed.

3. Now let’s install the Python SVN file (”svn-python” etc) - Double click the file and then click NextNextagain and Next once more. The installation will run and click the Finish button when prompted.

4. Then we install Python SQLite - Double click the file and then click NextNext again and Next once more. The installation will run and click the Finish button when prompted.

5. Trac needs to be installed now - Double click the Trac exe and then click NextNext again and Next once more. The installation will run and click the Finish button when prompted.

6. Lastly we need to install Genshi - Double click the Genshi file and then click NextNext again and Nextonce more. The installation will run and click the Finish button when prompted.

Getting Trac Running

1. Create a folder called tracproject or something similar - I’d recommend putting it in the same directory as your repository.

2. Get your ez_setup.py file and move it into C:\Python25\Scripts folder(or wherever your Python install is located). Bring up a command prompt (Click on Start > Run and type ‘cmd‘). Enter the following making sure you hit Enter after each of the four lines.

cd c:\
cd pyth*
cd scr*
ez_setup.py

3. This will bring up about 10 lines of code and then leave the command prompt in the same directory. Now type the following and hit Enter.

trac-admin E:\project initenv

This will install Trac to the E:\project directory. Now the CMD window will prompt you to input four pieces of information. Look at what I used below to indicate what you should use.

Project Name [My Project] - I used “mycode”
Database connection string [sqlite:db/trac.db]> Leave blank by hitting Enter
Repository type [svn]> Leave blank by htting Enter
Path to Repository [/path/to/repos]> E:\repos

The CMD window will install Trac based on the existing repository. The more existing revisions you have in the repository the longer this process will take, it’s indexing each change you’ve ever made. Once the install is complete the last line should say “Congratulations!” but don’t close the cmd window!. So Trac is now installed but you’re not done yet. It must be configured correctly to get the most out of it’s use.

4. To easily handle accounts in Trac I would 100% recommend installing the Account Manager Pluginavailable from Trac Hacks (a handy site with lots of Trac plugins) - let’s do this now. In the same cmd window (which should still be in C:\Python25\Scripts) type the following and hit Enter.

easy_install http://trac-hacks.org/svn/accountmanagerplugin/trunk

This will bring up about 12 lines of code with the last line starting “Finished processing dependencies”.

5. In Windows open up the E:\project folder and go into the conf sub-directory. There’s a file called trac.ini- open it in an editor like Notepad. You need to copy the following lines below and paste them into Notepad above the [header_logo] section.

[components]
acct_mgr.admin.accountmanageradminpage = enabled
acct_mgr.api.accountmanager = enabled
acct_mgr.db.sessionstore = enabled
acct_mgr.htfile.htdigeststore = enabled
acct_mgr.pwhash.htdigesthashmethod = enabled
acct_mgr.web_ui.accountmodule = enabled
acct_mgr.web_ui.loginmodule = enabled
acct_mgr.web_ui.registrationmodule = enabled
trac.web.auth.loginmodule = disabled

Once that’s been pasted in save the ini file and close Notepad. In explorer go up a level to E:\project and create a new text file called passwd.txt - leave the file blank.

6. Lastly let’s give all anonymous users (those who aren’t logged in) admin access. In the same CMD window type the following and hit Enter.

trac-admin E:\project permission add anonymous TRAC_ADMIN

Note this will not return any lines. We will remove the admin access later once you, the real admin, have created your account. And with that we can start Tracd. In CMD type the following and hit Enter.

tracd –p 8000 E:\project

7. Open up your favourite browser and paste this URL: http://localhost:8000/. You should see a link to the name you gave your project, such as mycode. Click on that and there you have Tracd - the front end of the Trac software.

8.In the top right there’s a tab called Admin - click on it. On the menu on the right click on Configuration and when the page loads select HtDigestStore where the filename is E:\project\passwd.txt and the realm is “trac“.

9. Below Configuration is Users - click on it. Create yourself an admin account. Now using the menu go to Permissions. On the right of that page you will see the Grant Permission section. Use the subject field for the username you gave yourself on the Users page and select the TRAC_ADMIN as Action. Click Add and you will see your username in the middle column of the page with TRAC_ADMIN next to it. For the subject anonymous click on the TRAC_ADMIN so it’s ticked and then click on the Remove selected items button.

10. From now on you will need to use that Admin account to Login and make changes to the Trac environment. By default anonymous users can still view all of the Tracd menu’s to see changes to the repository and view tickets.

I hope this How To guide has helped you get Trac running on your systems. Please feel free to make comments/suggestions/improvement.

이올린에 북마크하기(0) 이올린에 추천하기(0)

Posted by 좐군

2009/01/09 04:01 2009/01/09 04:01
, , ,
Response
No Trackback , No Comment
RSS :
http://John.tobe30.com/tc/rss/response/64

Trackback URL : http://John.tobe30.com/tc/trackback/64

Leave a comment
[로그인][오픈아이디란?]

trac 윈도우에 설치

사용자 삽입 이미지

원문 : http://www.ncube.net/entry/윈도우에서-프로젝트-관리툴-Trac-설치와-기타-Plugin-설치

1. Trac의 설치(윈도우 환경에서)
TOW (TracOnWindows) http://sourceforge.net/projects/traconwindows/에서 패키지 다운로드
다운받은 패키지 파일의 압축을 풀고 C:\로 이동 경로는 C:\TOW가 되어야 함 C:\TOW\start-tow.bat를 실행하면 Trac 실행.
테스트는 http://localhost:8080/projects/HelloTOW 으로 접속하면 확인할 수 있음.

2. Trac 프로젝트 추가
C:\TOW>create-svn-repo.bat <프로젝트명>
C:\TOW>create-trac-repo.bat <프로젝트명>

3. trac-admin 실행 방법
C:\TOW>trac-admin.bat <ProjectName> <Commands>
Commands 확인은 C:\TOW>trac-admin.bat <ProjectName> help

※ C:\TOW\README.txt 파일을 확인해도 된다.

4. Plugin의 설치 (easy_install 이용)
http://www.trac-hacks.org/에서 자신에게 필요한 Plugin 소스 다운로드
다운받은 파일의 압축을 풀고 압축을 푼 폴더로 이동해 egg 파일을 만드는 과정을 진행해야 한다.

예) C:\TOW\ticketdeleteplugin\0.10>C:\TOW\Python\python.exe setup.py install
주의)Plugin의 setup.py 파일이 있는 곳으로 이동 후 egg 파일을 만들어야 한다.

생성된 egg 파일(예:TracTicketDelete-1.1.4-py2.4.egg)을 C:\TOW로 복사하고 easy_install 과정 실행

예) C:\TOW\easy_install.bat TracTicketDelete-1.1.4-py2.4.egg

Plugin의 설치가 완료되면 trac.ini 파일을 수정하는 과정이 필요하다.
trac.ini 파일은 C:\TOW\!TracRepo\Projects\<!프로젝트명>\conf\trac.ini에 위치
아래 내용은 이번에 설치하면서 설정한 trac.ini 파일의 내용이다.
[components]
acct_mgr.admin.accountmanageradminpage = enabled
acct_mgr.api.accountmanager = enabled
acct_mgr.db.sessionstore = disabled
acct_mgr.htfile.abstractpasswordfilestore = disabled
acct_mgr.htfile.htdigeststore = disabled
acct_mgr.htfile.htpasswdstore = enabled
acct_mgr.http.httpauthstore = enabled
acct_mgr.pwhash.htdigesthashmethod = disabled
acct_mgr.pwhash.htpasswdhashmethod = disabled
acct_mgr.web_ui.accountmodule = enabled
acct_mgr.web_ui.loginmodule = disabled
acct_mgr.web_ui.registrationmodule = enabled
iniadmin.iniadmin.iniadminplugin = enabled
navhider.* = enabled
trac.web.auth.loginmodule = enabled
tracgantt.* = enabled
tracnav.* = enabled
tracrpc.* = enabled
tracrpcext.* = enabled
tractoc.* = enabled
tracwysiwyg.* = enabled
webadmin.* = enabled
ticketdelete.web_ui.ticketdeleteplugin = enabled

ticketdeleteplugin은 ticketdelete.web_ui.ticketdeleteplugin = enabled 를 추가함으로써 활성화 할 수 있다.

TOW Standard 버전에 포함된 플러그인의 활성은 이 글을 참고하시고 다른 플로그인은 각 플러그인의 설명을 참고하면 된다.


이번에 설치한 플러그인의 목록
http://www.trac-hacks.org/wiki/TicketDeletePlugin
http://willbarton.com/code/tracgantt/
http://www.trac-hacks.org/wiki/NavHiderPlugin

그외 다른 플러그인은 http://www.trac-hacks.org/에서 확인할 수 있다.

참고) TracGannt 플러그인의 경우 Gannt Chart 옵션 부분에서 잘못된 부분이 있는데 아래와 같이 수정하면 된다.
[gantt-charts]
date_format = %d/%m/%Y
include_summary = true
show_opened = true
summary_length = 16
use_creation_date = true

Trac의 커스텀필드의 날짜포맷과 Gannt Chart의 날짜포맷이 다르기 때문에 발생하는 문제로 보여진다.

참고사이트
http://traconwindows.wordpress.com/
http://cafe.naver.com/mjava.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=146
http://uzys.tistory.com/36

이올린에 북마크하기(0) 이올린에 추천하기(0)

Posted by 좐군

2008/12/30 02:33 2008/12/30 02:33
, ,
Response
No Trackback , No Comment
RSS :
http://John.tobe30.com/tc/rss/response/51

Trackback URL : http://John.tobe30.com/tc/trackback/51

Leave a comment
[로그인][오픈아이디란?]

  소프트웨어 분야에서 소프트웨어 설계만큼 신기하면서도 어려운 공정이 없다는 생각이다. 로버트 L 글래스 큰 형님 말처럼 30여년이 넘게(지금은 45여년이 넘게) 소프트웨어를 설계해왔고, 상식적으로 필요하다 싶은 설계 방법론과 설계 언어를 모두 갖추고 있지만, '설계'에 대해 명쾌하고 가슴이 와 닿는 정의를 내리기는 무척 어렵다.

이런 상황에서도 대가들은 뭔가 달라도 다르다. 오늘은 존 크리스토퍼 존스 큰 형님이 설계에 대해 정의한 문구를 소개하고 싶다. 개인적으로 아주 좋아하는 설계 관련 이야기이기도 하다.

근본적인 문제는 예측이 올바르지 않을 경우 현실화되지 못하는 _미래_ 상태를 예측하기 위해 설계자가 _현재_ 주어진 정보를 사용해야 한다는 사실이다. 설계의 마지막 결과물은 결과물을 만드는 수단을 펼치기 앞서 미리 가정해놓아야 한다. 설계자는 영향을 미치는 사건 연쇄가 시작되는 초기에 세상에 영향을 미칠 시점을 기준으로 시간을 거슬러 올라가면서 작업해야 한다.

쉽게 설명해서, 설계자는 설계의 결과가 어떻게 동작할지 모두 알기에, 속된 말로 짜고치는 고스톱을 친다는 말이다. 심심풀이로 주변에 프로그램을 잘 짜는 친구들을 대상으로 인터뷰를 해보면 한결같은 대답이 나온다.

질문: 개발 과정 중에서 언제부터 프로그램 구현을 시작합니까? 대답: 내가 짠 프로그램이 제대로 돌거라는 확신이 설 때부터.

서투른 개발자는 프로그램 구현에 있어 부딪히는 모든 함정에 따 빠지면서 가까스로 목표를 향해 전진하지만, 뛰어난 개발자는 마치 매트릭스에서 네오가 총알을 부드럽게 피하듯 주변에 함정이 어디있었냐는 듯(실제로 함정에 빠지긴 하지만 워낙 회복 속도가 빨라서 주변 사람들에게는 함정을 피한 듯이 보일 뿐이다. :))이 목표를 향해 그대로 돌진하다.

크리스토퍼 존스 큰 형님에 이어 로버트 L. 글래스 큰 형님도 한마디 거든다.

연구 결과를 이해하려면 먼저 짧은 소프트웨어 역사 속에서 전통이 되어버린 사고에 대한 집착을 버려야 한다. 설계의 외적인 표현에 연연하지 말고 사고의 흐름에 초점을 맞춰야 한다. 설계의 비밀은 _마음_속에 있다.

이런 평범하다면 지극히 평범한 진리를 이해하지 못하기 때문에 제대로 된 프로그램을 만들기 위해서는 객체지향형 언어인 C++나 자바나 파이썬이나 루비타 기타 등등의 언어를 사용해야_만_한다고 교조주의적인 주장(예: "아직도 C를 쓰세요? 설계에 대해 X도 잘 모르시는군요.")이 나온다. 설계의 비밀은 프로그램 언어에 있지 않고 방법론에도 있지 않다. 여러분 _마음_속에 있다.

로버트 L. 글래스 큰형님은 설계의 본질을 딱 네 줄로 설명한다.

  1. 마음 속으로 모델을 만들어본다.
  2. 마음 속으로 모델을 실행한다. 즉, 시물레이션을 통해 모델이 문제를 해결하는지 확인한다.
  3. (대게 모델이 너무 단순해서) 문제를 해결하지 못하면, 불충분한 모델에서 실패하는 부분을 찾아서 개선한다.
  4. 모델이 문제를 해결할 때까지 1-3단계를 반복한다.

즉, 설계는 정신적이고, 아주 빠르고, 반복적이며, 사실상 시행착오를 거듭하는 과정이며, 마음이 문제 해결책을 구상한다. 즉 설계의 본질은 신속한 모델링, 시물레이션이며, 설계의 핵심 요소는 해결책을 제안하고 실패하는 능력과 실패를 극복하는 능력이다.

로버트 L. 글래스 큰형님의 마지막 아름다운 말씀을 전하면서 마무리 하겠다.

설계는 마음 속에서 번개처럼 떠오르는 무언가임을. 그리고 어떤 사람의 번개는 다른 사람의 번개보다 훨씬 빠르다는 사실을.

원문 ; http://tapm.blogspot.com/2007/03/2-1.html
이올린에 북마크하기(0) 이올린에 추천하기(0)

Posted by 좐군

2008/12/17 09:11 2008/12/17 09:11
Response
No Trackback , No Comment
RSS :
http://John.tobe30.com/tc/rss/response/41

Trackback URL : http://John.tobe30.com/tc/trackback/41

Leave a comment
[로그인][오픈아이디란?]

XP : Extreme Programming

XP를 접한지 2~3년의 시간이 지났다. 처음에는 혼자서 적용해 볼 수 있는 것들을 시도해 보았고, 최근에는 조직 안에서 XP를 적용하기 위한 시도들을 해오고 있다. PP(Pair Programming), TDD(Test Driven Development), US(User Story) 등 새롭고 신선한 실천방법들에 매력을 느꼈고 그 효용성을 체험해 보고 싶었다.

이번 주말에 ‘Extreme Programming Explained’ 2판을 다시 읽어 보았다. 그리고 내가 놓치고 있는 것이 무엇인지 알게되었다.

가치, 원칙, 실천방법…. XP는 실천방법만으로 이루어진 개발 방법론이 아니다. XP가 추구하는 가치와, 그 가치를 위한 원칙들을 기반으로 많은 실천방법들이 합쳐져서 최고의 효과를 발휘하는 것이다. 즉, XP를 도입하기 위해서는 그 가치와 원칙에 대해서 서로 공유하고 합의를 이루는 과정이 선결되어야만 한다.

그래서 다시 한번 XP의 가치와 원칙을 정리해 보기로 했다. 그리고 팀내에서 이에 대한 의견을 모아서 모두가 동의하는 원칙을 세울 필요가 있다고 생각한다.

[XP가 중요시 하는 가치]

  • 의사소통 : 문제를 해결하고 효과적으로 협동하기 위해 의사소통이 중요하다.
  • 단순성 : 제대로 작동할만한 가장 단순한 것은 무엇일까?
  • 피드백 : 변화는 피드백을 필요로 한다. 점진적 개선으로 완벽을 추구한다.
  • 용기 : 용기는 다른 가치들과 조화를 이룰 때 강력해진다.
  • 존중 : 모든 사람은 인간으로서 동등한 가치를 지닌다. 팀에 속한 모든 개인의 기여를 존중해야 한다.

[XP 적용 원칙]

  • 인간성 : 인간의 기본적 욕구를 충족시켜줘야 하며, 인간의 장점을 살리기 위해 노력해야 한다.
  • 경제성 : 돈의 시간적 가치, 시스템과 팀의 선택의 가치를 중요시 한다.
  • 상호 이익 : 모든 활동은 관련된 모든 사람에게 이익이 되어야 한다.
  • 자기유사성 : 어떤 해결책의 구조를 다른 맥락에서도 그대로 적용할 수 있다.
  • 개선 : 프로세스나 설계, 스토리를 완벽하게 만들려고 노력한다.
  • 다양성 : 어떤 설계에 대한 생각이 두 가지 나왔다면, 이것은 문제가 아니라 기회다.
  • 반성 : 실수를 숨기지 않고 오히려 실수를 드러내어 거기에서 배운다.
  • 흐름 : 개발의 모든 단계를 동시에 작업함으로써 가치 있는 소프트웨어를 흐르듯이 끊임없이 제공하는 것이다.
  • 기회 : 문제를 기회로 전환할 수 있다.
  • 잉여 : 잉여를 만들기 위해 드는 비용보다 재앙을 면할 수 있어 얻는 이익이 더 크다.
  • 실패 : 실패가 지식을 늘려주는 한, 그것은 허비가 아니다. 실패를 감수하는 것이 성공으로 가는 가장 짧고 확실한 길이다.
  • 품질 : 품질 기준을 높일 경우 제품 전달이 빨라지는 경우가 많다.
  • 아기 발걸음 : 올바른 방향이라고 알아챌 수 있는 일 중 당신이 할 수 있는 최소한은 무엇입니까?
  • 받아들인 책임 : 책임감은 오직 책임질 마음이 있는 사람이 받아들일 수 있을 뿐이다. 책임이 있는 곳에는 권위도 따라온다.

팀과 개인이 중요하게 생각하는 가치는 우선순위는 다를 수 있겠지만 대부분 동감을 할 것이다. 하지만 가치만으로는 실천방법을 정확히 정할 수 없다. 의사소통을 위해 ‘기립 회의’를 할 수도 있고 자세히 기술된 문서를 요구할 수도 있다. 이렇듯 이 가치를 얻기 위해서는 좀 더 명확한 원칙을 세울 필요가 있다. 위에 나열된 XP의 원칙들 외에도 팀에서 다양한 원칙을 정립할 수 있을 것이다. 이 원칙들을 바탕으로 의사결정을 한다면
모두가 공감하고 모두에게 이익이 되는 실천방법을 찾을 수 있게 될 것이다.

원문 : http://fantazic.com/archives/83

이올린에 북마크하기(0) 이올린에 추천하기(0)

Posted by 좐군

2008/12/17 07:23 2008/12/17 07:23
,
Response
No Trackback , No Comment
RSS :
http://John.tobe30.com/tc/rss/response/40

Trackback URL : http://John.tobe30.com/tc/trackback/40

Leave a comment
[로그인][오픈아이디란?]
   얼마전 책을 보다가 "지역성의 원리"라는 내용을 발견했다. 캐싱 시스템을 이해하는데 도움되었다. 굉장히 이론적이 내용이지 아주 흥미롭게 느껴져 간단해 정리해봤다.

지역성의 원리
   참조의 지역성(Locality of reference or Principle of locality)라고도 하는데 쉽게 설명하자면 한번 참조한 데이터(명령어)는 다시 참조할 가능성이 높다는 것이다. 다시 참조할 데이터가 공간적으로 인근에 있는 특성을 공간적 지역성(Spatial locality)라 하고, 시간적으로 인근에 있는 특성을 시간적 지역성(Temporal locality)라고 한다. 이 특성은 페이징이나 캐시 도입의 이론적 배경이 된다.
    캐시 메모리를 예를들면, CPU가 명령어를 수행하는 과정을 보면 PC(Program Count)가 가르키는 주소의 명령어를 메인 메모리에서 CPU내로 읽어와서 연산한다. 대부분 순차적(Loop나 Goto문은 제외) 불러오게 되는데 만일 1개씩 메인 메모리에서 읽어오는 것보다 한꺼번 10개씩 읽어와 CPU내의 캐시 메모리로 저장했다가 이를 읽어서 연산하는 것이 훨씬 빠를 것이다.
   간단한 예를 들면 캐시의 교체 알고리즘 중에 LRU(Least Recently Use)라는 것이 있다. 이는 가장 오랜동안 사용하지 않는 블록(데이터의 집합단위)을 교체 알고리즘으로 시간적 지역성에 근간을 둔 것이다. Loop 또한 시간적 지역성의 대표적이 예이다.
 
'개인적으로 속도를 높일 수 있는 방법에 유난히 관심히 많이 간다. 인간은 어쩔 수 없이 속도나 효율을 무시할 수 없는가보다'

참조 : http://en.wikipedia.org/wiki/Locality_of_reference
이올린에 북마크하기(0) 이올린에 추천하기(0)

Posted by 좐군

2008/12/14 05:31 2008/12/14 05:31

Trackback URL : http://John.tobe30.com/tc/trackback/32

Leave a comment
[로그인][오픈아이디란?]