2011.03.18 16:23
> UML의 확장메커니즘 - 스테레오타입

  UML에서는 3가지 확장메커니즘 - tagged value, stereo types, constraints - 을 제공하고 있는데, 그 중 하나가 스테레오타입이다. 스테레오타입은 이중꺽쇄(« »)로 나타내며 모델링 요소에 스테레오타입이 표시되면 모델링 요소는 그 의미가 확장된다.

 예) 클래스 표기법에 «interface» 를 표시하여 인터페이스를 나타낸다.

> 클래스와 객체간의 관계 - «instantiate»

  클래스와 객체간의 관계는 «instantiate» 스테레오 타입을 사용한 의존관계로 나타낸다. 클래스의 변화가 객체에 영향을 미치므로 화살표 방향은 클래스를 가리키게 된다.

 
Posted by kimgisa.net
2011.03.18 16:04

  의존관계(dependency)는 공급자(supplier)와 클라이언트(client)간의 관계로 공급자의 변경이 클라이언트에 영향을 미치는 경우 사용된다. UML로 의존관계를 나타내는 방법은 점선으로 두 요소를 이은 뒤 공급자(supply)쪽에 화살표를 표시한다.

The UML Reference Manual [Rumbaugh 1]에서는 의존관계를 다음과 같이 정의하고 있다.

A relationship between two elements in which a change to one element (the supplier) may affect or supply information needed by the other element (the client).






Posted by kimgisa.net
2010.05.08 11:07
Maven을 통해 build를 하다보면 가끔 자바 버전의 하위호환성 문제로 인해 build가 되지 않을 때가 있다.

> 에러내용
  에러내용중에 Java 버전과 관련된 내용이 포함되어 있음을 발견할 수 있다.

[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.000s
[INFO] Finished at: Sat May 08 11:06:22 KST 2010
[INFO] Final Memory: 3M/15M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.0.2:compile (default-compile) on project HibernateEntity: Compilation failure: Compilation failure:
D:\workspace\HibernateEntity\src\main\java\kr\nextree\nexbay\domain\entity\User.java:[15,1] annotations are not supported in -source 1.3
(use -source 5 or higher to enable annotations)

@Entity


> 해결방법
  pom.xml에 다음과 같이 maven compile plug-in을 선언하고 java 버전을 세팅해준다.

  <build>
    <plugins>
   <plugin>
     <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <configuration>
    <source>1.6</source>
    <target>1.6</target>
  </configuration>
      </plugin>
 </plugins>
  </build>




Posted by kimgisa.net
2010.02.25 14:41

비즈니스의 주요 개념에는 자원, 프로세스, 목표, 규칙등이 있다.
아래 다이어그램은 기본적인 비즈니스 개념들과 그들간의 관계를 나타낸 메타모델이다.

A basic meta-model of business modeling concepts
(원본 : 'Willey - Business Modeling With UML'의 Chapter 3 참조)

Posted by kimgisa.net
2010.01.22 10:16

 정보기술 아키텍처(ITA/EA)는 기관의 임무와 성과달성을 위해 업무와 IT를 효율적으로 관리하는 내용을 담은 정부차원의 법제도이다. 흔히 도시계획과 비유하여 설명되는 ITA/EA의 등장배경 및 개념, 효과에 대해서 알아보자.

정보기술아키텍처 (ITA/EA)의 등장배경

  1. 업무와 정보시스템의 체계적 관리의 어려움
  2. 종합적 정보화 계획 및 현황 관리의 부족으로 정보화 투자 우선순위 결정과 중복투자의 위험이 존재
  3. 시스템간 정보공동활용과 상호 운영성 미확보



정보기술아키텍처 개념

 기관의 임무와 성과 달성에 필요한 업무와 정보시스템 등 무형의 자원들을 구조적으로 정리하고, 이를 바탕으로 정보화를 효율적으로 추진하고 관리, 개선하도록 하는 것 (조직의 가시화, 체계화, 표준화)


주요용어정의

  - 업무아키텍처 : 업무, 업무별 기능.절차, 정보와 이들 간의 관계를 식별하고 정의한 구조를 말한다.
  - 데이터아키텍처 : 업무와 응용에서 사용되는 데이터 및 이들 간의 관계를 식별하고 정의한 구조를 말한다.
  - 응용아키텍처 : 업무를 지원하는 응용서비스 및 응용시스템과 이들간의 관계를 식별하고 정의한 구조를 말한다.
  - 기술아키텍처 : 응용서비스 및 응용시스템을 지원하는 기술자원 및 이들 간의 관계를 식별하고 정의한 구조를 말한다.


정보기술아키텍처 효과


  종합적인 정보화 현황 및 계획을 제공 => 정보화 의사 결정을 제공
  조직의 업무와 목표에 맞는 정보시스템의 도입과 운영
  효율적인 정보기술 자원 관리 지원 및 중복 투자 제거
  시스템간 원할 연계와 정보 공동활용을 제공
  업무변화 및 신기술 등장에 유연하게 대응


참고자료
(한국정보화진흥원 자료실-법/지침)

  - 정보기술아키텍처 도입운영 지침(정통부고시)
  - [소개자료]공공부문 정보화 혁신의 첫걸음-정보기술아키텍처
  - 알기쉬운 ITA, 정보화 혁신의 첫걸음
  - ITAEA 홍보동영상

Posted by kimgisa.net
2010.01.07 21:20
객체지향 이론에서의 클래스화(classification)와 일반화(generalization) 관계를 알아보자.
이 관계를 이해하기 위해서는 먼저 Type과 Object의 의미를 이해해야 한다.

Type과 Object란 무엇인가?

 - Type 은 개념을 의미한다. UML에서는 Class로 표현된다. (= Concept, Class)
 - Object 는 Type이 인스턴스화된 실체를 의미한다.



예를 들어, 우리집에서 키우는 누렁이, 이웃집에 있는 삽삽이는 Object 이고, 이러한 Object들은
개(Dog)라는 Type의 인스턴스이다.


Classification(클래스화)란, Type과 Object 와의 관계이다. 객체들이 특정개념에 속할 때, 클래스화 관계로 나타낼 수 있다. (↔ 인스턴스화, instantiation)


  
Generalization(일반화)는 Type간의 관계이다. 특정개념이 다른개념을 완전히 포함할 때, 일반화 관계로 나타낼 수 있다. (↔ 특수화, Specialization)



Posted by kimgisa.net
2009.12.29 10:05

본 내용은 Code Complete 2nd p.136~138에 실린 내용입니다.

복잡성 관리의 중요성

 소프트웨어 프로젝트에 대한 보고서에서 프로젝트 실패의 원인을 보고할 때, 프로젝트가 실패하는 주된 요인으로 기술적인 이유를 들고 있는 경우는 거의 없다. 프로젝트의 거의 대부부은 품질이 떨어지는 요구 사항, 계획 수립, 관리 등의 이유로 실패한다. 하지만 프로젝트가 기술적인 이유 때문에 실패한 경우에는 그 원인을 복잡성의 관리 부족에서 찾을 수 있다. 소프트웨어에서는 어느 누구도 무엇이 일어나는지 모를 정도로 복잡성이 증가한다. 프로젝트에서 특정한 영역의 코드를 변경했을 때 다른 부분에 대한 어떤 영향을 미치는지 완벽하게 이해하는 사람이 없을 정도의 시점에 도달하면, 더 이상 발전할 수 없게 된다.

소프트웨어 설계를 구현하는 두 가지 방법이 있다. 한 가지 방법은 어느 누가 봐도 문제가 없을 정도록 간단하게 만드는 것이고, 다른 한 가지 방법은 어느 누구도 문제를 찾을 수 없을 정도로 복잡하게 만드는 것이다.

- C. A. R. Hoare

[Key Point] 복잡성 관리는 소프트웨어 개발에서 가장 중요한 기술적인 주제이다. 개인적으로 소프트웨어의 기본적인 기술적 의무는 복잡성을 관리하는 것이라고 생각한다.

 복잡성은 소프트웨어 개발의 새로운 특징이 아니다. 컴퓨터 분야의 선구자인 Edsger Dijkstra는 컴퓨팅의 한 비트에서부터 수백 메가 바이트(또 다른 표현으로는 1부터 10의 9승)에 이르는 거리를 재는 작업이라고 지적하였다.(dijkstra 1989). 이 엄청난 비율은 정말 어마어마한 것이다. Dijkstra는 이 내용을 "이 의미론적 수준의 숫자와 비교해 볼 때, 보통의 수학 공식은 평범하다. 심오한 개념적인 계층 구조에 대한 필요성을 불러일으킴으로써, 자동 컴퓨터는 우리에게 역사에 없던 새로운 본질적인 문제들을 제시하였다."라고 표현하였다. 물론 소프트웨어는 1989년보다 훨씬 복잡해졌고, Dijkstra가 말한 1부터 10의 9승 비율은 오늘날에는 1부터 10의 15승이 되었다. Dijkstra는 현대적인 컴퓨터 프로그램을 보관할 수 있을 만큼 큰 두뇌를 가진 사람은 아무도 없다고 지적한 바 있다. 이 말은 곧 소프트웨어 개발자인 우리들이 절대로 전체 프로그램을 억지로 한번에 두뇌에 밀어 넣으려고 해서는 안 된다는 것을 의미한다. 최종 목표는 한번에 생각해야 하는 프로그램의 양을 최소화하는 것이다. 마치 곡예에서 공이나 접시를 다루듯이 정신을 다루는 것과 같다. 여러분이 한번에 다루어야 하는 공의 개수가 많아지면 많아질수록 공을 떨어뜨릴 확률도 높아지게 되고, 결국 이는 설계 상에서나 코드 상에서의 오류를 야기한다.

지나친 복잡성에 빠져들었을 때의 한 가지 증상은 확실하게 부적절한 방법을 끈질기게 적용하려는 자신을 발견하는 순간이다. 이는 마치 기계를 다룰 줄 모르는 사람이 자동차가 고장났을 때, 배터리에 물을 붓고 재떨이를 비우는 것과 같다.
- P.J. Plauger

 소프트웨어 아키텍처 수준에서는 시스템을 서브시스템으로 나누어 문제의 복잡성을 줄인다. 인간은 복잡한 부분 하나보다 여러 개의 간단한 정보를 더 빠르게 이해한다. 모든 소프트웨어 설계 기술의 목표는 복잡한 문제를 간단한 부분으로 나누는 것이다. 서브시스템이 독립적일수록, 보다 안전하게 한 번에 복잡한 부분의 한 부분을 집중적으로 살펴볼 수 있다. 주의 깊게 정의된 객체는 한 번에 하나의 기능에만 집중할 수 있도록 작업을 분활한다. 패키지도 통합의 상위 수준에서 동일한 장점을 제공한다.

루틴을 짧게 유지하면 머리를 더 적게 쓸 수 있다. 구현 수준에서의 용어보다는 문제 도메인 수준에서의 용어로 프로그램을 작성하고 추상화 수준을 높이면 머리를 더 적게 쓸 수 있다.

결론적으로, 인간의 선천적인 한계를 보완할 줄 아는 프로그래머는 자신뿐만 아니라 다른 사람도 이해하게 쉽고 오류가 적은 코드를 작성한다.


복잡성을 해결하기 위한 방법
비용이 지나치게 많이 드는 비효율적인 설계는 다음과 같은 상황에서 발생한다.

  • 간단한 문제를 복잡하게 해결할 때
  • 복잡한 문제를 간단하고 잘못된 방법으로 해결할 때
  • 복잡한 문제를 부적절하고 복잡하게 해결할 때

Dijkstra가 지적했듯이, 현대적인 소프트웨어는 선천적으로 복잡하며, 아무리 노력해도 결국엔 실제 세계 문제가 내포하고 있는 선천적인 복잡성에 부딪히게 될 것이다. 다음은 복잡성을 관리하기 위한 두 가지 접근 방법이다.

  • 한 번에 처리해야 하는 본질적인 복잡성의 양을 최소화한다.
  • 비본질적인 복잡성이 불필요하게 증가하지 않도록 한다.

일단 소프트웨어에서 다른 기술적인 목표들이 복잡성 관리보다 중요하지 않다는 사실을 이해하게 된다면, 설계 시 고려해야 할 사항들이 간단해진다.


Posted by kimgisa.net
2009.12.29 09:47

문제상황 : AbstractJpaTests 를 상속받아 작성한 스프링 통합테스트 코드를 실행했더니, 다음과 같은 에러메시지가 발생하였다.

java.lang.IllegalArgumentException: Can not set java.lang.Object field org.springframework.test.jpa.AbstractJpaTests.shadowParent to com.ibm.dw.spring2.EmployeeServiceIntegrationTest
 at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(Unknown Source)
 at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(Unknown Source)
 at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(Unknown Source)
 at sun.reflect.UnsafeObjectFieldAccessorImpl.set(Unknown Source)
 at java.lang.reflect.Field.set(Unknown Source)
 at org.springframework.test.jpa.AbstractJpaTests.runBare(AbstractJpaTests.java:245)
 at junit.framework.TestResult$1.protect(TestResult.java:106)
 at junit.framework.TestResult.runProtected(TestResult.java:124)
 at junit.framework.TestResult.run(TestResult.java:109)
 at junit.framework.TestCase.run(TestCase.java:120)
 at junit.framework.TestSuite.runTest(TestSuite.java:230)
 at junit.framework.TestSuite.run(TestSuite.java:225)
 at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
 at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

해결방법 : AbstractJpaTests 상속받은 테스트 클래스에서 shouldUseShadowLoader 메소드를 오버라이딩하여 false를 리턴하도록 한다.
 



참고 : Spring Framework API - org.springframework.test.jpa.AbstractJpaTests

shouldUseShadowLoader

protected boolean shouldUseShadowLoader()
Subclasses should override this method if they wish to disable shadow class loading.

The default implementation deactivates shadow class loading if Spring's InstrumentationSavingAgent has been configured on VM startup.



Posted by kimgisa.net
2009.12.02 14:27
Flash, Flex 개발 시 사용되는 프로그래밍 언어인 Action Script 3에 대한 Adobe 공식 문서이다.
AS3의 기본 문법에서 부터 사용 예제와 고급 사용기법까지 다양한 내용을 다루고 있다.

짬짬이 봐야지....

링크 : http://livedocs.adobe.com/flash/9.0_kr/main/flash_as3_programming.pdf
Posted by kimgisa.net
2009.10.08 23:36

  클라우드 컴퓨팅 서비스인 Google App Engine(이하 GAE)은 구글에서 제공하는 웹 어플리케이션 플랫폼이다. 이 플랫폼은 웹 어플리케이션을 올릴 수 있는 호스팅 공간과 데이터저장소(DataStore)를 제공한다. 개발언어로는 Python과 Java를 지원하고 있으며, 서버에 올린 어플리케이션은 제한된 트래픽내에서는 무료로 사용할 수 있다. 역시 무시무시한 구글이다.~!!


 GAE가 처음으로 공개된 것은 2008년 4월이다. 처음 발표되었을 때는 개발언어로써 Python만 지원했으나, 2009년 4월 Java언어를 지원하는 Google App Engine for Java를 발표했다. 이클립스 구글 플러그인이 제공되어 손쉽게 웹 어플리케이션을 개발하고 App Engine 서버에 배포할 수 있다.

  - Google Plugin for Eclipse 다운로드

 Google App Engine 사이트에 가면 유용한 문서들이 많이 있다. 특히 처음 GAE를 접하는 개발자를 위해 Getting Started를 제공하는데, 자바와 이클립스를 조금만 다룰 수 있는 개발자라면 짧은 시간만 노력을 기울이면 간단히 Guest book 예제를 서버에 올리고 실행시켜볼 수 있다. (http://kimgisa2009.appspot.com

 IBM developerWorks에서 제공되는 강좌도 참고하면 좋을 듯하다. (영문으로된 구글 사이트에서 Getting Started 읽을 때는 눈 빠지는 줄 알았는데, 이 자료는 한글로 되어 있어 한눈에 쏙쏙 들어온다^^) 

  - IBM developerWorks - Google App Engine for Java: Part1: 새로운 시작

Posted by kimgisa.net