Programming2011. 7. 28. 13:49

본격적으로 코딩에 들어가겠습니다

지금 하는것은 게시판에서 쓰기 부분입니다

먼저 jsp를 생성합니다 저는 SmartEditorJSP.jsp를 만들었습니다

스마트 에디터는 css와 자바스크립트로 되어있기 때문에 head부분에 선언을 해줍니다

----------------------------------------------------------------------------------

<head>

<link href="css/default.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="js/HuskyEZCreator.js" charset="utf-8"></script>

</head>

----------------------------------------------------------------------------------

선언을 했으면 그다음에는 스마트에디터를 쓰기 위해서 <textarea>를 선언하여 css로 적용 하면됩니다(옷을 입혀주는거죠 ㅎ)

----------------------------------------------------------------------------------

<body>

<textarea name="ir1" id="ir1" style="width:450px; height:150px; display:none;"></textarea>

</body>

----------------------------------------------------------------------------------

사이즈는 width & height를 조절해서 알맞게 수정하시면 됩니다

그리고 input버튼을 만들어주세요

----------------------------------------------------------------------------------

<input type="button" onclick="_onSubmit(this)" value="확인"></input>

----------------------------------------------------------------------------------

여기에 보면 onclick 함수가 있습니다 클릭했을경우 스마트와함께 등록이되는거죠

----------------------------------------------------------------------------------

<script>

function _onSubmit(elClicked){
// 에디터의 내용을 에디터 생성시에 사용했던 textarea에 넣어 줍니다.
oEditors.getById["ir1"].exec("UPDATE_IR_FIELD", []);

// 에디터의 내용에 대한 값 검증은 이곳에서 document.getElementById("ir1").value를 이용해서 처리하면 됩니다.

try{
elClicked.form.submit();
}catch(e){}
}

</script>

----------------------------------------------------------------------------------

이렇게 그대로 <heard> 부분에 선언해주세요

아그전에 <form>설정을 해야합니다 스트럿츠로 액션을 줘야합니다

----------------------------------------------------------------------------------

<form action="smartReg.action" method="post">

----------------------------------------------------------------------------------

액션선언은 조금있다 작성하겠습니다

결론은

----------------------------------------------------------------------------------

<body>

<form action="smartReg.action" method="post">

<textarea name="ir1" id="ir1" style="width:450px; height:150px; display:none;"></textarea>

<input type="button" onclick="_onSubmit(this)" value="확인"></input>

</form>

</body>

----------------------------------------------------------------------------------

이렇게 됩니다

자아 그러면 쓰기의 마지막으로 이렇게 만든 textarea를 스마트에디터 스킨을 입혀주세요

* 중요한점은 <head> 부분이 아닌 <body>부분에 등록해주세요!!

----------------------------------------------------------------------------------

<script type="text/javascript">
///네이버 스마트 에디터 스킨호출//////////////////
var oEditors = []; //
nhn.husky.EZCreator.createInIFrame({ //
oAppRef: oEditors, //
elPlaceHolder: "ir1", //
sSkinURI: "SEditorSkin.html", //
fCreator: "createSEditorInIFrame" //
}); //
</script>

----------------------------------------------------------------------------------

왜 바디에다가 등록을 한다면 스크립트가 바로 바디에서 활성화 시켜줘야하기 때문에 이렇게 등록합니다

그리고 textarea를 만약에 2개 이상 만들고싶다면

<textarea name="ir1" id="ir1">

<textarea name="ir2" id="ir2"> <---만들어서 elPlaceHolder: "ir2" 하나더 만들어 주면 됩니다

이렇게 쓰기 부분은 끝입니다

(2부 완료)

Posted by 신의물방울
Programming2011. 7. 28. 12:58

네이버 개발자 센터 http://dev.naver.com/opensource/

먼저 위 사이트에 접속하면 스마트에디터가있습니다

그다음 다운로드 눌러서 SmartEditor Basic 0.3.17를 다운받습니다

받은 파일을 압축을 풀어서 이클립스에 부분적으로 붙여넣기 해주세요

자아~~여기에서 없는게 보이죠?? jar파일이 없을거에요 이건 제가 첨부파일로 올렸습니다~~

헉 한페이지동 5메가 까지만 올리수있네요 그래서 바로 밑에 페이지에 lib(2)파일을 올리겠습니다 ㅠㅠ 귀찮지만 받아주세요 ㅎ

그리고 마지막으로 jindo.min.js 파일을 받아야합니다 이건 제가 첨부했습니다 js폴더에 붙여넣기해주세요

그러면 이렇게 셋팅은 끝났습니다 2편에서는 본격적으로 적용해보겠습니다

Posted by 신의물방울
Programming2011. 7. 28. 12:44

iBatis 이거만 알면 바로 실전에 사용할수 있다!!라는걸 해보겠습니다

먼저 iBatis는 무엇인가!?

ORM(Object Relational Mapping) 이라고 하는데

DB와 객체와의 관계를 맵핑시켜 퍼시스턴스 로직처리를 도와주는 프레임워크입니다.

여기에서 퍼시스턴스 프레임워크가 무엇일까요??

사전적의미는 persistence 1. 고집 2. (없어지지 않고 오래 동안) 지속됨, 영속됨

우리는 컴퓨터를 종료하면 그전에 있는 정보들은 끊어져서 지속되지않습니다 그래서 파일을 저장하거나 DB에 저장을해서 그걸 유지를 합니다 자바에서는 퍼시스턴스이용해서 그걸 저장을 하게됩니다 자바에서는 JDBC , .NET에서는 ADO.NET를 이용해서 DB에 저장합니다 이걸 좀더 간편하게 하기위해서 프레임워크가 있는데 이걸 퍼시스턴스 프레임워크라고합니다 결론은 DB관련된 작업을 형상화 하기위해 사용합니다

대충 이런거구나 라고 생각하시고 넘어가세요~

그리고 iBatis의 강력한 특징은 바로바로 생산성!!! JDBC 코드들보면 커넥트 열고 닫고 엄청 길잔아요 그걸 62%정도 줄어드는 간결한 코드와 간단한 설정이 강력한 특징입니다(62%는 책에 이렇게나와있네요)

이제 본격적으로 iBatis 설치를 하겠습니다

http://ibatis.apache.org/java.cgi 여기들어가셔서 2.3.4 버젼을 다운받아주세요 현재 3 버젼까지나왔는데 전 2버젼으로 설명하겠습니다 다하고 2버젼과 3버젼을 비교하겠습니다

다운받으셨으면 압축을 풀면 \ibatis-2.3.4.726\lib\ibatis-2.3.4.726.jar 파일을 이클립스 프로젝트 하나 생성하셔서 lib폴더에 붙여넣기 하세요

자 여기서 중요!!

iBatis를 사용할려면 설정파일 총 4개만 있으면 됩니다!!!

전 바로 사용할수 있도록 설명을 하겠습니다. 단 좀더 자세히알고 싶을경우 "위키북스에서 나온 iBatis 인 액션" 을 보시기 바랍니다 설명 자세히 잘 나와있습니다.

위에 4개의 파일들은 서로 다 연결이 되어있습니다 하나라도 없으면 안되는 것들이죠

그러면 왜 연관이있는지 알아보고 차근차근 설명하겠습니다(아 배고프다 ..ㅠㅠ)

1. MyAppSqlConfig.java

-----------------------------------------------------------------------------------------------------

public class MyAppSqlConfig
{
private static final SqlMapClient sqlMap; // Table과 Bean사이의 매핑을 담당하는 클래스 인스턴스
static {
try
{
String resource = "SqlMapConfig.xml"; // 주설정 파일
Reader reader = Resources.getResourceAsReader (resource);
sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader); //주설정파일을 읽어 들인다.
}
catch (Exception e)
{
e.printStackTrace();
throw new RuntimeException ("Error initializing MyAppSqlConfig class. Cause: " + e);
}
}
public static SqlMapClient getSqlMapInstance ()
{
return sqlMap;
}
}

-----------------------------------------------------------------------------------------------------

위 소스는 주설정파일을 읽어들이기 위한 유틸클래스입니다 이 클래스가 DAO할때 호출해서 사용하는 클래스입니다 나중 DAO구현할때 그때 다시 설명하겠습니다 여기에서 꼭 수정을 해야하는 부분은 String resource = "SqlMapConfig.xml"; 이거입니다. 주설정 파일을 불러와서 읽습니다

그래서 DAO에서는 SqlMapClient sqlMap = MyAppSqlConfig.getSqlMapInstance(); 이렇게 쓰면 그 자원을 쓰게됩니다 차후에 하는방법 설명하겠습니다

2. SqlMapConfig.properties

-----------------------------------------------------------------------------------------------------

driver=oracle.jdbc.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:ORCL
username=scott
password=tiger

-----------------------------------------------------------------------------------------------------

딱보면 아시겠죠? 아래의 코드가 JDBC코드인데 그걸 위 코드처럼 간편하게 설정파일을 만들었습니다

-----------------------------------------------------------------

String jdbc_driver="oracle.jdbc.driver.OracleDriver";
String jdbc_url="jdbc:oracle:thin:@127.0.0.1:1521:XE";


void connect(){
try{
Class.forName(jdbc_driver);
conn=DriverManager.getConnection(jdbc_url, "jspbook", "1234");

-----------------------------------------------------------------

오라클 driver설정과 url,username,password 정보를 properties파일에 작성했습니다

3. SqlMapConfig.xml

-----------------------------------------------------------------------------------------------------

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE sqlMapConfig
PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">

<!-- Always ensure to use the correct XML header as above! -->

<sqlMapConfig>

<properties resource="SqlMapConfig.properties" /> <!-- properties 파일 읽어들인다 -->

<settings
cacheModelsEnabled="true"
enhancementEnabled="true"
lazyLoadingEnabled="true"
maxRequests="32"
maxSessions="10"
maxTransactions="5"
useStatementNamespaces="false"
/>

<!-- Type aliases allow you to use a shorter name for long fully qualified class names. -->
<typeAlias alias="order" type="testdomain.Order"/> <!-- 별칭 정의 -->


<transactionManager type="JDBC" >
<dataSource type="SIMPLE">
<property name="JDBC.Driver" value="${driver}"/>
<property name="JDBC.ConnectionURL" value="${url}"/>
<property name="JDBC.Username" value="${username}"/>
<property name="JDBC.Password" value="${password}"/>
</dataSource>
</transactionManager>

<sqlMap resource="iBatis.xml" /> <!-- 쿼리문이 있는 xml파일 읽어들인다 -->

</sqlMapConfig>

-----------------------------------------------------------------------------------------------------

위코드가 iBatis 주설정 파일입니다

<settings></settings> 부분은 디폴트되어있습니다 수정할필요없습니다

그대로 사용하시고 꼭수정 해야하는 부분은 <sqlMap resource="iBatis.xml" /> 이 부분입니다

이부분은 SQL 작성된 xml파일을 가져오는 부분입니다

그리고 <properties resource="SqlMapConfig.properties" /> 이부분도 수정해야합니다

앞서 작성한 오라클정보가 있는 properties파일을 설정합니다

뭐가 많죠? 소스 그대로 복사 하셔서 검은색 부분만 수정하시면됩니다

4. iBatis.xml

-----------------------------------------------------------------------------------------------------

이부분이 하이라이트기 때문에 다음 게시물에 작성하겠습니다

-----------------------------------------------------------------------------------------------------

4. iBatis.xml

-------------------------------------------------------------------------------------------

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap
PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="Person">

<!-- Use type aliases to avoid typing the full classname every time. -->
<typeAlias alias="Person" type="test.Person"/>

<resultMap id="PersonResult" class="Person">
<result property="id" column="PER_ID"/>
<result property="firstName" column="PER_FIRST_NAME"/>
<result property="lastName" column="PER_LAST_NAME"/>
<result property="birthDate" column="PER_BIRTH_DATE"/>
<result property="weightInKilograms" column="PER_WEIGHT_KG"/>
<result property="heightInMeters" column="PER_HEIGHT_M"/>
</resultMap>
<!-- Select with no parameters using the result map for Account class. -->

<select id="selectAllPerson" resultMap="PersonResult">
select * from PERSON
</select>

<select id="getPerson" parameterClass="int" resultClass="Person">
SELECT
PER_ID as id,
PER_FIRST_NAME as firstName,
PER_LAST_NAME as lastName,
PER_BIRTH_DATE as birthDate,
PER_WEIGHT_KG as weightInKilograms,
PER_HEIGHT_M as heightInMeters
FROM PERSON
WHERE PER_ID = #value#
</select>

<insert id="insertPerson" parameterClass="Person">
INSERT INTO
PERSON (PER_ID, PER_FIRST_NAME, PER_LAST_NAME,
PER_BIRTH_DATE, PER_WEIGHT_KG, PER_HEIGHT_M)
VALUES (#id#, #firstName#, #lastName#, #birthDate#, #weightInKilograms#, #heightInMeters#)
</insert>

<update id="updatePerson" parameterClass="Person">
UPDATE PERSON
SET PER_FIRST_NAME = #firstName#,
PER_LAST_NAME = #lastName#, PER_BIRTH_DATE = #birthDate#,
PER_WEIGHT_KG = #weightInKilograms#,
PER_HEIGHT_M = #heightInMeters#
WHERE PER_ID = #id#
</update>

<delete id="deletePerson" parameterClass="Person">
DELETE PERSON
WHERE PER_ID = #id#
</delete>

</sqlMap>

-------------------------------------------------------------------------------------------

<typeAlias alias="Person" type="test.Person"/>

이구문은 별칭을 정의합니다 패키지명이 길어서 타이핑치는것도 시간잡아먹습니다 그럴경우 type="패키지.클래스" 작성하고

alias="별칭" 을 적으면 됩니다

예) test.Person 클래스를 Person로 사용하겠다!

<resultMap id="PersonResult" class="Person">
<result property="id" column="PER_ID"/>
<result property="firstName" column="PER_FIRST_NAME"/>
<result property="lastName" column="PER_LAST_NAME"/>
<result property="birthDate" column="PER_BIRTH_DATE"/>
<result property="weightInKilograms" column="PER_WEIGHT_KG"/>
<result property="heightInMeters" column="PER_HEIGHT_M"/>
</resultMap>

이부분이 포인트 입니다

SQL 컬럼과 자바빈즈를 서로 맵핑 시킵니다


public class Person {
private int id;
private String firstName;
private String lastName;
private java.sql.Date birthDate;
private double weightInKilograms;
private double heightInMeters;

//setter,getter 생략
}

CREATE TABLE PERSON(
PER_ID NUMBER (5, 0) NOT NULL,
PER_FIRST_NAME VARCHAR (40) NOT NULL,
PER_LAST_NAME VARCHAR (40) NOT NULL,
PER_BIRTH_DATE DATE ,
PER_WEIGHT_KG NUMBER (4, 2) NOT NULL,
PER_HEIGHT_M NUMBER (4, 2) NOT NULL,
PRIMARY KEY (PER_ID)
);
insert into person values(1, 'Chalie', 'Whisky', sysdate, 50, 20);


위 소스를 보시면 Person 자바빈즈PERSON SQL테이블이 있습니다

<result property="id" column="PER_ID"/>

이걸 보시면 id 와 PER_ID 서로 맵핑이 되었습니다

Posted by 신의물방울
Programming2011. 7. 28. 12:41

Tiles에 대한 자세한 내용은 

http://tiles.apache.org/

참조 한다.

■ Tiles를 사용하는 이유. 

 1. 매 페이지마다 include를 시키게 되면 나중에 그 파일이 변경 됐을 때 문제가 발생한다. 다 뜯어 고쳐야 한다. 그래서 따로 설정문서에다가 include 파일들을 준비해두고 필요시 가져다 쓰라는 것이다. 나중에 페이지 include할 파일 이름이 바뀔 경우 설정문서에서 만 바꿔주면 된다. 
 2. 레이아웃을 지원해 준다. 레이아웃패턴을 이용해서 Tiles를 사용할 수 있도록 지원해 준다.

■ Tiles의 진행 순서.



 Action에서 결과를 전달하는데 Result가 tiles로 가라고 알려준다. 그럼 Interceptor에서 Plugin인 web.xml에 정의 되어있는 listener에게 알려준다. 그럼 listener는 현재 tiles.xml을 받아서 Plugin에게 알려준다. 그럼 그 Plugin은 tiles.xml 에 정의 되어 있는 각각의 정의 문서를 통해서 적절할 페이지로 이동시킨다. 그러기 위해서는 web.xml에서 tiles-definitions으로 정의하고 있는 그 문서를 참조하기 위한 event listener를 반드시 정의해줘야 한다.

■ 필요한 library

Struts2 library의 lib 폴더(struts-2.0.14\lib) 에서 아래 네개 파일을 추가한다.

struts2-tiles-plugin-2.0.14, tiles-api-2.0.4, tiles-core-2.0.4, tiles-jsp-2.0.4

■ web.xml

<!-- title plug in listener 리스너를 정의 해준다.-->
 <listener>
  <listener-class>
   org.apache.struts2.tiles.StrutsTilesListener
  </listener-class>
 </listener>

■ tiles.xml(정의문서 : web.xml과 같은 위치에 있다)

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE tiles-definitions PUBLIC
       "-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"
       "http://tiles.apache.org/dtds/tiles-config_2_0.dtd">

<tiles-definitions>
    <definition name="index" template="/tiles/classicLayout.jsp"> <!-- index를 요구하면 이 페이지로 전달하겠다. -->
        <put-attribute name="title"  value="Struts2 Tiles Example"/> 
        <put-attribute name="menu"   value="/tiles/menu.jsp"/>
        <put-attribute name="header" value="/tiles/header.jsp"/>
        <put-attribute name="body"   value="/tiles/body.jsp"/>
        <put-attribute name="footer" value="/tiles/footer.jsp"/>
    </definition>
    
    <definition name="menu1" extends="index">
        <put-attribute name="body"   value="/tiles/body-menu1.jsp"/> <!-- "/tiles/body.jsp"/ 이 페이지를 /tiles/body-menu1.jsp"/ 페이지로 바꿔라 -->
    </definition>
 
 <definition name="menu2" extends="index">
        <put-attribute name="body"   value="/tiles/body-menu2.jsp"/>
    </definition>
</tiles-definitions>

*  즉 include해야할 파일을 설정 문서에다가 설정해두고 각각의 페이지에서는 그 속성의 이름만을 쓴다.
 
■ classicLayout.jsp

<%@ page contentType="text/html; charset=euc-kr"%>
<%@ taglib prefix="tiles"  uri="http://tiles.apache.org/tags-tiles"%> <!-- tiles 태그를 사용하겠다고 정의 -->

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <title><tiles:getAsString name="title" /></title> <!-- 문자열을 가져올 때 -->
    </head>
    <body>

    <table border=0 cellpadding=0 cellspacing=1 bgcolor="#a0a0a0" width="100%">
        <tr height=100 valign="middle" bgcolor="#ffffff">
            <td colspan=2><tiles:insertAttribute name="header"/></td> <!-- 페이지를 가져올 때 -->
        </tr>
        <tr height="670" bgcolor="#ffffff">
            <td width="15%" valign="top"><tiles:insertAttribute name="menu"/></td>
            <td width="85%" align="center"><tiles:insertAttribute name="body"/></td>
        </tr>
        <tr bgcolor="#ffffff">
            <td colspan=2><tiles:insertAttribute name="footer"/></td>
        </tr>
    </table>
    </body>
</html>

* title, header, menu, body 등의 속성은 tiles.xml(정의문서)에 꼭 정의가 되어있어야 한다.

■ tiles.xml

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
    <package name="tiles" namespace="/tiles" extends="struts-default,tiles-default"> <!-- tiles-default이게 정의 되어 있어야 type에서 tiles를 인식한다 -->
        <action name="index">
            <result type="tiles">index</result> 
        </action>
        <action name="menu1">
            <result type="tiles">menu1</result>
        </action>
        <action name="menu2">
            <result type="tiles">menu2</result>
        </action>
    </package>
</struts>   

* Client가 index을 요구하면 tiles.xml(정의문서)에서 정의하고 있는 index라고 정의 되어있는 속성 이름을 전달하겠다고 알려준다. 

Posted by 신의물방울
Programming2011. 7. 16. 19:35

StarUML에서 시퀀스 다이어그램을 그리는 방법은 아래 URL에 잘 설명 되어 있습니다.
http://staruml.sourceforge.net/docs/user-guide(ko)/ch05_3.html

설명이 대체로 잘 되어 있는 편이지만, 어떤 부분은 자세하게 설명이 안되어 있어서 알아내느라 애를 먹은 부분이 있었습니다.

첫번째로 초반 설명에 나오는 "[Toolbox] -> [Sequence] -> [Object] 버튼을 클릭하고" 에서 [Toolbox] -> [Sequence] 버튼을 찾을수가 없더군요. Model Explorer에서 우클릭해서 Add Diagram -> Sequence Diagram 하시면 됩니다.


두번째로 저장했던 파일을 다시 로드 했는데 Sequence Diagram이 나타나지 않을때 Diagram Explorer에서 아래와 같이 선택하면  됩니다.

그래도 전반적으로 잘 사용하고 있습니다. 특히 패킷 주고 받는 과정을 시퀀스 다이어그램으로 정리해서 공유하면 좋더군요.
Posted by 신의물방울
Programming2011. 7. 16. 19:34
http://staruml.sourceforge.net/docs/user-guide(ko)/ch05_3.html

시퀀스 다이어그램에서 편집할 수 있는 요소들은 다음과 같습니다.

  • Object
  • Stimulus
  • SelfStimulus
  • Combined Fragment
  • Interaction Operand
  • FrameSubsytem

Object

Object 생성 방법:

Object를 생성하려면,

  1. [Toolbox] -> [Sequence] -> [Object] 버튼을 클릭하고
  2. Main 윈도우창에서 Object가 위치할 곳을 클릭합니다.
  3. 퀵다이얼로그에 object의 이름을 입력합니다.
  4. 그리고 [Enter] 키를 누릅니다.

Active Object 설정 방법:

Object를 Active Object로 변경하려면,

  1. 할당된 Class의 IsActivie 속성을 true로 변경하면 됩니다. 
  2. 위의 예에서는 MyClass의 IsActive 속성을 변경합니다.
  3. 결과는 다음과 같습니다.
  4. 만약 Class가 할당되어 있지 않다면 Active Object로 변경할 수 없습니다.

Multi Object 설정 방법:

Object를 Multi Object로 설정하려면,

  1. Properties창에서 IsMultiInstance 속성을 true로 설정합니다.
  2. 그러면 object는 multi object로 보여집니다.

Class로부터 Object 생성  방법:

class로부터 object를 생성하기 위해서는

  1. model explorer에서 class를 선택합니다.
  2. 선택된 class를 main window로 드래그/드롭합니다.
  3. 그러면 object가 다이어그램상에 생성됩니다.

Object로부터 Class 생성 방법:

Object에 대해서 Class가 할당되어 있지 않다면

  1. Object를 더블 클릭해서 Quick Dialog의 Add Class 버튼을 이용하여 새로운 Class를 생성하고 Object에 할당할 수 있습니다.

  2. [Enter element name] 다이얼로그에서 새로운 class의 이름을 입력합니다.
  3. 그러면 새로운 class가 생성되고 object에 할당됩니다.
  4. 만약 존재하는 class를 object에 할당하려면, object의 classifier 속성에서  버튼을 클릭합니다. 그리고 [Select a model element] 다이얼로그에서 할당할 class를 선택합니다.

Shortcut Create Syntax로 객체에서 나가는 Stimulus 생성 방법:

현재 선택된 객체에서 다른 객체로 나가는 stimulus를 생성하려면

  1. 객체를 더블 클릭하고나 객체가 선택된 상태에서 [Enter]키를 누릅니다.
  2. 그리고 Quick Dialog가 나타나면, "->" 문자열(들어오는 Stimulus는 "<-" 문자열, 나가고 리턴을 가지는 Stimulus는 "<->") 다음에 대상 객체의 이름과 Stimulus 이름을 입력합니다.
  3. 그리고 [Enter]키를 누르면 선택된 객체에서 지정한 객체로 나가는 Stimulus를 생성하고 현재 다이어그램에서 가장 마지막 순서로 배치합니다.

Stimulus

Semantics

자극(Stimulus)은 두 인스턴스(Instance)간의 커뮤니케이션을 나타냅니다.

Stimulus 생성 방법:

Stimulus를 생성하려면,

  1. [Toolbox] -> [Sequence] -> [Stimulus ] 버튼을 클릭하고 
  2. Main 윈도우창에서 자극을 주는 방향으로 Object(또는 Lifeline)에서 다른 Object(또는 Lifeline)으로 마우스를 누르고 드래그하면 됩니다.
  3. Stimulus의 퀵다이얼로그가 나타나면 stimulus의 이름을 입력하고 [Enter] 키를 누릅니다.
  4. 그러면 다음과 같이 stimulus가 생성됩니다.

Class에서 정의된 Operation을 stimulus로 사용 방법:

Stimulus의 Receiver측의 Class가 할당된 경우에 Receiver의 Operation을 Stimulus로 할당하려면,

  1. stimulus를 더블 클릭합니다.
  2. 퀵다이얼로그에서  버튼을 클릭합니다.
  3. [Select an operation] 다이얼로그가 나타나면 할당할 operation을 선택하고 [OK] 버튼을 누릅니다.
  4. 선택된 operation에 매핑된 새로운 stimulus가 다음과 같이 추가됩니다.

Object에서 Class의 Opeation 생성 방법:

Stimulus의 Receiver측 Class에 포함될 Operation을 생성해서 Stimulus로 할당하려면,

  1. stimulus를 더블클릭합니다. 그리고 퀵다이얼로그에서  버튼을 클릭합니다.
  2. 그리고 새로운 operation의 이름을 입력하고 [OK] 버튼을 클릭합니다.
  3. 그러면 새로운 operation이 추가됩니다.
     
  4. 새로운 operation이 추가되었는지 model explorer에서 확인합니다.
     

Shortcut Create Syntax로 앞의 순서를 갖는 Stimulus 생성 방법:

현재 선택된 Stimulus 앞의 순서를 가지는 다른 Stimulus를 생성하려면 

  1. Stimulus를 더블 클릭하거나 Stimulus가 선택된 상태에서 [Enter]키를 누릅니다.
  2. 그리고 Quick Dialog가 나타나면, "~>" 문자열(들어오는 Stimulu는 "<~" 문자열) 다음에 대상 객체의 이름과 Stimulus 이름을 입력합니다.
  3. 그리고 [Enter]키를 누르면 지정한 객체로 나가는 새로운 Stimulus가 생성되고, 선택된 Stimulus 위에 배치됩니다.

Shortcut Create Syntax로 뒤의 순서를 갖는 Stimulus 생성 방법:

현재 선택된 Stimulus 뒤의 순서를 가지는 다른 Stimulus를 생성하려면 

  1. Stimulus를 더블 클릭하거나 Stimulus가 선택된 상태에서 [Enter]키를 누릅니다.
  2. 그리고 Quick Dialog가 나타나면, "_>" 문자열(들어오는 Stimulu는 "<_" 문자열) 다음에 대상 객체의 이름과 Stimulus 이름을 입력합니다.
  3. 그리고 [Enter]키를 누르면 지정한 객체로 나가는 새로운 Stimulus가 생성되고, 선택된 Stimulus 밑에 배치됩니다.

Shortcut Create Syntax로 Sub Stimulus 생성 방법:

현재 선택된 Stimulus의 Activation에 포함되는 다른 Stimulus를 생성하려면

In order to create a sub stimulus of selected stimulus,

  1. Stimulus를 더블 클릭하거나 Stimulus가 선택된 상태에서 [Enter]키를 누릅니다. 
  2. 그리고 Quick Dialog가 나타나면, "->" 문자열(들어오는 Stimulu는 "<-" 문자열) 다음에 대상 객체의 이름과 Stimulus 이름을 입력합니다.
  3. 그리고 [Enter]키를 누르면 지정한 객체로 나가는 새로운 Stimulus가 생성되고, 선택된 Stimulus의 Activation의 맨 마지막 Stimulus 위치로 배치됩니다.

Stimulus 연결 재설정 방법: Procedure for reconnecting to another object

Stimulus의 양쪽 끝을 다른 요소로 연결하려면,

  1. stimulus의 끝을 클릭합니다.
  2. 그리고 연결할 또다른 object로 드래그/드롭합니다.
  3. 그러면 다음과 같이 stimulus가 다른 object에 연결됩니다.

Stimulus의 ActionKind 변경 방법:

Stimulus의 ActionKind 속성값은 5가지 종류 중에 하나로 설정되어야 하며, ActionKind의 종류에 따라서 다음과 같이 다르게 보입니다. ActionKind의 종류는 Properties에서 변경할 수 있습니다.

ActionKind Shape
CALL
SEND
RETURN
CREATE
DESTROY

SelfStimulus

SlefStimulus 생성 방법:

SelfStimulus를 생성하려면,

  1. [Toolbox] -> [Sequence] -> [SelfStimulus] 버튼을 클릭하고 
  2. Main 윈도우창에서 SelfStimulus를 삽입할 Object(또는 Lifeline)에서 마우스를 클릭합니다.
  3. Object의 퀵다이얼로그가 나타나면 stimulus의 이름을 입력하고 [Enter] 키를 누릅니다.
  4. 다음과 같이 self-stimulus가 보여집니다.

Combined Fragment

Combined Fragment 생성 방법:

Combined Fragment를 생성하려면,

  1. [Toolbox] -> [Sequence] -> [Combined Fragment] 버튼을 클릭하고 
  2. Main 윈도우창에서 Combined Fragment가 위치할 곳을 클릭하고 원하는 범위만큼 드래그합니다.
  3. 그러면 combined fragment가 생성됩니다.
  4. 그리고 interaction operator를 다음과 같이 변경합니다.
  5. interaction operator 변경후에 다음과 같이 combined fragment가 보여집니다.

Interaction Operand 생성 방법:

Interaction Operand를 생성하려면, 

In order to create Interaction Operand,

  1. [Toolbox] -> [Sequence] -> [Interaction Operand] 버튼을 클릭하고
  2. Interaction Operand가 삽입될 Combined Fragment에 클릭합니다.
  3. 새로운 interaction operand가 combined fragment에 추가되면 interaction operand를 클릭합니다.
  4. interaction operand의 크기 조절점이 보여지면 드래그해서 범위를 정렬합니다.

Frame

Frame 생성 방법:

Frame을 생성하려면,

  1. [Toolbox] -> [Sequence] -> [Frame] 버튼을 클릭하고 
  2. Main 윈도우창에서 Frame이 위치할 곳을 클릭하고 범위를 드래그합니다.
  3. 그러면 새로운 frame이 다음과 같이 생성됩니다.

Diagram

다이어그램에서 시퀀스 넘버 보이기:

다이어그램에서 Stimulus의 시퀀스 넘버를 나타내거나 감추려면

  1. model explorer 또는 main window에서 sequence diagram을 선택합니다.
  2. diagram의 ShowSequenceNumber 속성 값을 true 또는 false로 변경합니다.
  3. 다음은 ShowSequenceNumber 속성값이 false 일때의 sequence diagram입니다.

다이어그램에서 메시지의 시그너처 스타일 변경 방법:

다이어그램에서 Stimulus의 signature는 다음과 같이 4가지가 존재합니다.

stimulus의 signature를 변경하려면 시Model Expolorer의 다이어그램을 선택하거나, Main 윈도우의 다이어그램을 선택하고 Message Signature 속성값을 변경합니다.

Style Example
NONE
NAMEONLY
TYPEONLY
NAMEANDTYPE

다이어그램의 모든 Activation 스타일 변경 방법:

다이어그램에서 Stimulus의 Activation을 나타내거나 감추려면 Model Expolorer의 다이어그램을 선택하거나, Main 윈도우의 다이어그램을 선택하고 ShowActivation 속성을 true 또는 false로 설정합니다.

Posted by 신의물방울
Programming2011. 7. 16. 19:33

* UML : 특정언어에 비종속적 객체지향 분석 설계

1. 요구정의
개발자가 개발요구 업체의 업무담당자와 필요한 기능을 나열하는 것이다

대학관리 시스템
1) 학생이 접수처에 수강신청을 한다
2) 교수가 성적을 등록한다
3) 학생이 성적을 확인한다
4) 관리자가 등록금 용지를 발부한다
.......................
누가 --------- 어디서 -------- 뭘할까

2. 분석
3. 설계
4. 구현



* UML프로그램은 여럿 있을거라 생각되는데 그중에서 StarUML을 다운 받아서 해봅시다.





홈페이지 입니다.
좌측메뉴의 StarUML다운로드 클릭



다운로드 페이지입니다.
StarUML 버전 5.0 클릭



아래쪽 staruml-5.0-with-cm.exe를 클릭하여 다운

다운을 완료하면 파일을 실행하여 설치합니다.
설치과정은 특별한게 없습니다. 그냥 표준설치 가이드를 따라서 클릭 몇번 해주면 완료!



처음 실행시 모습입니다.
OK를 누릅시다.



우리는 Use Case Model을 할 겁니다
우측 Model Explorer를 보면 첫번째 항목에 있습니다.
이걸 펼치면 Main 이 보일 겁니다. 이 Main을 클릭 하여 창을 띄웁니다.



Main창이 새로 띄워졌습니다.



이제 촤측의 메뉴들이 처음과는 다르게 바뀌었군요.
우리는 지금 보이는 이것들을 사용하게 됩니다.
우선 Actor을 선택하고 마우스 커서를 Main 창으로 이동합니다.



Main창에서 마우스를 드래그 하면 위의 그림처럼 가상의 박스가 생깁니다.
이것이 Actor 그림의 크기입니다. 적당한 크기가 되었으면 드래그를 멈춥니다.



사람 모양이 생기는군요. 원하는 이름을 네모박스 안에 기입합니다. 



위와 같은 방식으로 3개를 만들어 보았습니다.
그런대 위치가 제각각이군요. 좌측으로 나란히 정렬해 봅시다.
3개의 Actor를 선택합니다. 그런다음에는 
우측 최상단에 작게 붉은색으로 네모박스 표시한게 보이나요? 
이것을 클릭하여 봅시다.



짜잔~! 좌측으로 자동 정렬이 되었습니다. 편하군요...
혹시 크기도 이런식으로 일괄 조절하는 방법 아시는 분은 제보 바랍니다. 
저는 아무리 찾아도 못 찾겠더군요. ㅡ,.ㅡ



다음은 UseCase를 넣어 봅시다.
좌측 메뉴의 UseCase를 선택한 후 Main창에서 마우스 드래그.



마우스 드래그를 하면 위의 그림처럼 UseCase가 생성됩니다.
마찬가지로 사용할 이름을 적어 넣어줍니다.



회원가입, 로그인, 아이디 찾기, 비밀번호 찾기, 관리자 로그인 을 생성했습니다.

이번에는 Actor과 UseCase를 연결하여 봅시다. 둘의 관계는 DirectedAssociation으로 합니다.
이건 상황에 따라서 Generalization으로 할 수도 있고 Dependency등을 할 수도 있습니다.



적당한 위치에 선을 긋습니다.



잘 생성되었군요.



같은 방식으로 나머지것들의 과정도 표시합니다.



완성된 모습입니다.


위와 같은 방식으로 다양한 요구정의를 만들어 주면 됩니다.
로그인, 구매, 상품등록 과정 등 다양한 것들을 만들어 주면 되겠습니다.

Posted by 신의물방울
Programming2011. 7. 16. 19:31
http://blog.naver.com/kottodat?Redirect=Log&logNo=80104635200

몇몇 분들의 요청으로 간략하게 적어보겠습니다만...

제가 UML을 정식으로 배운 것도 아니고 그냥 대충 제멋대로 이해하고 사용하는 것 이기 때문에

실제 정석으로 배운 분들이 보기에 여러가지 잘못된 점이 많이 있을겁니다.

잘못된 부분이 보이거나 의견이 있으시다면 코멘트로 달아주시면 감사하겠습니다.

잘못된 점을 수정하고 좋은 조언을 달게 받아 수정을 하겠습니다.

아참... 스크롤의 압박이 무지 심합니다.

일단 StarUML 프로그램 다운로드 링크입니다.

http://sourceforge.net/projects/staruml/files/staruml/5.0/

프로그램을 다운받아서 설치하시면 되겠습니다.

비지오로 사용하시는 분들은 비지오로 하셔도 무관합니다.

UML로 클래스 다이어그램을 그리는 목적

왜 우리는 클래스 다이어그램을 그려야 하는가.

소스코드를 작정해 놓고 그것만 보고서 구조가 어떻게 되어있고 동작이 어떻게 이루어 지는가를

알아내기는 무척 어렵습니다.

하지만...

이정도만 보면 대충 어떻게 되는지 알 수 있지 않을까요?

여튼 직접 코드를 짜지 않고서도 구조를 어느정도 미리 그려보는 용도도있고

타인이 코드를 직접 분석하는 것 보다 이렇게 다이어 그램을 통해 어떻게 돌아가는지

알 수 있기도 하고 그 외에도 여러가지 이점이 많습니다.

자~ 그럼 이제부터 하나씩 파보도록 하겠습니다.

일단 클래스입니다.

클래스를 만드는 것은 매우 간단합니다.

클래스를 선택하고 드래그 하면 끝이니까요.

그리고 변수와 함수들을 추가해 줍니다.

클래스에 마우스 커서를 대고 오른클릭을 하면 메뉴가 뜹니다.

변수와 함수를 각각 추가해 줍니다.

아참

생성한 클래스명 변수명 함수명은

더블클릭을 하면 아래 그림처럼 에딧창이 나타나면서 변경이 가능합니다.

이녀석의 이름을 바꿔주고 구성품 클래스를 하나 만들어 보겠습니다.

player는 equip를 가지고 있습니다.

하지만 처리를 좀 원할하게 하기 위해서 클래스로 만들었습니다.

그리고 player가 소유한 변수중에 equip라고 있는게 보이시죠?

좀 더 쉽게 예를 들어볼까요?

자동차 바퀴라는 클래스에

휠과 타이어라는 변수가 있습니다.

하지만 휠과 타이어는 각각 여러가지 속성이 존재하죠

제가 차 바퀴에 대해 잘 몰라서 제조회사, 특성 이라고만 적어 놓았지만

타이어의 경우 스노 타이어인지 차종이나 크기 등은 어떤거에 맞는 것인지 등등

여러가지 속성이 있습니다.

그런 모든값을 자동차 바퀴 라는 클래스에 몰아넣는 것은 별로 좋은 생각이 아니라고 봅니다.

그래서 따로 클래스를 만들어서 자동차 바퀴라는 클래스에 포함시키는 것이죠

뭐 간단하고 친절하게 composition이라고 쓰여저 있는걸 선택해서 둘을 이어주면 됩니다.

그 위에 Aggregation이라고 속이 빈 마름모가 보일겁니다.

이건 아주 살짝 다릅니다.

차이점이 하나 존재하거든요

바로 그 클래스가 릴리즈되는 시점의 차이 입니다.

composition의 경우 소유하는 클래스가 죽을때 소유당하는 클래스가 같이 죽지만

aggregaton의 경우에는 소유하는 클래스가 죽을때 소유당하는 녀석들이 같이 죽지 않는다는

차이점이 있습니다.

aggregation의 경우에도 클래스가 다른 한 클래스를 보유한다는 것에는 차이가 없습니다.

하지만!

속이 빈 마름모로 연결을 해 놓을경우 자식(?)보다 부모(?)가 먼저 죽을 수 있습니다.

예를 들면 다음과 같습니다.

맵을 띄울때 맵이 가진 요소들이 있을겁니다.

예로 나무 가로등 건물 등이 있다고 가정하죠

이때 맵은 분명히 오브젝트들을 소유하고 있습니다.

하지만 오브젝트를 읽어서 초기화 하고 삭제하는 일은 맵이라는 클래스가 하지 않습니다.

맵은 리소스 관리자 클래스에게 오브젝트를 읽어달라고 하고 포인터를 받아서 소유합니다.

맵이라는 클래스에서 release라는 함수를 불러서 자신을 릴리즈 할 경우에도

리소스 관리자에게 오브젝츠들을 릴리즈 해달라고 요청하지 않는 이상 오브젝트들은 살아남습니다.

오브젝트들은 자기 소유자가 죽더라도 자신은 죽지 않습니다.

소스코드로 보면 좀 더 이해가 잘 되실까 해서 간단히 적어보겠습니다.

aggregation의 경우 다른 클래스에게서 리소스를 읽어달라고 요청하고 포인터만 받아서 사용하고

자신이 리소스를 릴리즈 하지 않습니다.

하지만 composition의 경우 자신이 직접 리소스를 읽어서 사용하고 자신 스스로 해제해 버립니다.

클래스 자신만 쓰고 버리면 그만인 경우에도

리소스 관리자에게 한번 읽었으면 지금 당장은 사용하지 않더라도 나중에 다시 사용할 일이 있으면

현재 사용하는 리스트만 초기화 해버리고 메니저에게 일일히 해제하라고 이야기 하지 않는 경우가

많이 있습니다.

자주 사용하는것은 남기고 크기가 크거나 자주 쓰지 않는건 물론 자주 릴리즈 해야겠지요

이야기가 삼천포로 좀 빠졌지만...;

다시 돌아와서

이번엔 좀 큰그림을 그려놓고 설명하겠습니다.

일단 graphics라는 package를 하나 바닥에 깔아놓은 것이 눈에 띄죠

저녀석은 namespace입니다.

우리가 자주 사용하는 것 중에 namaspace std라는 것을 자주 사용하죠

그안에 vector map string 등등 우리가 좋아하고 자주 사용하는 것들이 들어있습니다만

저런 이름들은 자주 사용할지도 모르기 때문에 사용하는 것 입니다.

제가 위에 그린 예제도 저녀석들은 하나의 라이브러리로 만들어 놓았다고 가정할 경우

리소스라는 클래스가 있습니다만 물론 gsResource라던가로 하겠지만

혹여 어떤사람이 gsResource라는 클래스를 만들어 버린다던가

설마? 하는 문제를 위해서 라는 의미가 일단 가장 큽니다.

Association 실선으로 이어진 것을 제휴관계라고 하는데요

간단하게 말하자면 '두 클래스가 서로의 정보를 이용한다'라는 정도로 이해하시면 됩니다.

카메라는 자신의 눈에 해당하는 곳의 바로앞에 오게되면 카메라 위치를 강제적으로 옮기거나

못보게 해야하는 곳으로 맞추는 것 등을 방지하던가 맵의 데이터를 많이 사용합니다.

반대로 맵의 경우 카메라의 절두체에 해당하는 곳 밖의 오브젝트들을 그리지 않아야 하고

멀리 있는것이면 폴리곤을 조금 사용하는 대처품으로 교체한다던가 카메라를 강제로 옮기지 않고

카메라의 눈 앞에있는 오브젝트를 반투명하게 한다던가 기타 등등등

카메라의 위치 정보와 절두체 등의 정보를 많이 사용합니다.

서로 상대방이 가진 정보를 사용할 일이 많기 때문에 제휴관계 라고 표시를 해둡니다.

DirectedAssociation 일방적 제휴관계라고 하네요

클라이언트는 graphics라는 녀석중에서 그래픽이라는 facade클래스를 통해 그래픽 데이터를

처리합니다.

일단 이녀석은 라이브러리로서

#include "gsgraphic.h"

pragma commant( lib, "gsgraphic.lib" )

using namespace graphics ;

이렇게 해놓고 쓸 녀석인 만큼 그래픽이라는 클래스에서 클라이언트에 대해 뭔가를 특정하기엔

무리가 있으며 클라이언트쪽에 뭔가 요청하거나 할 일이 없습니다.

클라이언트가 일방적으로 뭔가 넣고 초기화 하라고 시켜서 초기화 하고

말 그대로 하라는 일만 소처럼 열심히 하는거죠

그래서 일방적 제휴라고 하는 것 같습니다.

위 그림처럼 점선으로 이어놓은 것을 Dependency 의존관계 라고 합니다.

지형지물이던 맵이던 이펙트던 스스로 리소스를 파일에서 읽는짓은 하지 못합니다.

왜냐구요?

만약 저녀석들이 각각 리소스를 파일에서 읽는 작업을 한다고 가정하면....

5개 클래스 각각 파일을 읽고 파일의 정보들을 구조체에 담고 분류하는일을 갖고 있어야 할겁니다.

5개 클래스에 동일한 코드와 비슷한코드가 똑같이 박혀있는 것부터가 일단 용납이 안되며

리소스 재사용이나 쌓아둔 양에따라 적당히 잘 안쓰는건 릴리즈 한다던가 하는 관리를 위해서라도

리소스를 관리하는 클래스를 따로 두고 관리해야 하지 않을까 합니다.

일단 딴 이야기는 이쯤 하고...;

클래스의 일부 기능을 타 클래스의 힘을 빌려서 해야할 경우에 의존적이라고 하고

저렇게 점선에 화살표로 표기합니다.

그 외에 의존하는 클래스의 변화에 영향을 받기도 한다고 기억하고 있습니다만

리소스를 읽는 과정 자체가 리소스 클래스가 가지고 있고 리소스 객체의 형태가 변한다면

각자 받아온 값을 활용하는 법도 확실히 바뀌는 일이 있을지 모르겠군요

다음은 Multiplicity입니다. 수량이라는 게죠

맵은 반드시 1개가 존재하고 오브젝트는 0개가 될수도 있고 몇개가 될수도 있습니다.

저런식으로 수치를 넣어주는 것 입니다만...

쓰기 나름입니다.

1 - * 이라고 해도 위 그림과 같은 의미이고

1 - 5 라고 하면 반드시 1개와 5개가 맞물린다는 것입니다.

10개짜리 분산서버와 유져들간의 커뮤니케이션은 10 - * 일테고 말이죠

하지만 이것을 꼭 표기해 줄 필요는 없다고 생각합니다.

대부분 1:1로 맞물리는 경우이고 꼭 필요하거나 강조하고 싶은 부분에서만 표기를 하고

당연하다 싶은 부분은 그냥 생략하는게 좋다고 생각합니다.

reflexive 반사?

클래스들은 자기 자신이 자기 자신과 영향을 주고받을 수도 있습니다.

스크롤의 압박도 심하고 머리도 아픈데 여기서 또 이상한게 나왔네

아... 이건 또 뭡니까? 하시는 분들이 계시겠지만 생각보다 간단합니다.

코드 자체는 엉터리지만 그런건 좀 넘어가 주세요...;

이녀석은 자기 자신을 일방적으로 제휴합니다.

next만 알지 자기 이전에 대해서는 알지를 못합니다.

push함수에서는 자기 다음녀석을 생성해서 값을 써 넣는일만 하겠죠

저런식으로 자기 스스로에게 영향을 미치는 것을 반사~ 라고 합니다.

지금껀 반사 일방적 제휴겠죠 reflexive DirectedAssociation

자기 전과 후의 값을 알면 그냥 반사제휴일테고 말이죠 reflexive Association

그 외에 이런것들이 있습니다.

위 그림은 싱글톤 클래스 입니다.

자기 자신에게 연결된 끝이 마름모꼴인 직선을 주시해 주세요

싱글톤 클래스도 반사제휴의 대표적인 예 입니다.

그 외에도 저 그림을 보고 알아야 하는 것이

myClass *test ;

test = test->getPointer( ) ;

위와같이 코드를 짤텐데 말이죠

저녀석이 static 정적 맴버를 사용한 정적 함수처럼 작동하고 있고

싱글톤 클래스의 포인터를 얻고있다는 의미로 getPointer( ) 와 <<static>>를 표기해 주었습니다.

그 다음

-m_pThis: myClass *

밑줄 underbar은 이 변수가 static 정적 변수라는 것을 의미합니다.

-기호는 이 변수가 private변수라는 것을 의미

맴버 변수의 속성

: myClass *는 m_pThis라는 변수의 변수형이 myClass형 포인터 라는 것을 의미합니다.

함수의 경우

-init( HWND hWnd, int width, int height ) : bool

속성 함수명 인자 : 반환값

위와같은 형식으로 표기가 가능합니다.

음... 거의 끝이 나 가는군요

위 그림은 데이터 팩토링에 대해서 나타난 것입니다.

일단 맵과 오브젝트를 잇는 선에 1 - 0.*이라고 해서 한개의 맵과 다수의 오브젝트가 있을 수 있고

<<Factoring>>라고 표기도 해줬습니다.

그리고 지형 지형지물 캐릭터 클래스를 보면 자기 스스로를 의존하고 있는 반사 의존을 표기해

준 상태인데요 저것은 자기 자신의 메모리를 할당해서 되돌리는 함수를 의존한다는 뜻 입니다.

가능하면 <<메모리를 할당해서 되돌려주는 함수명>>으로 하는 것이 좋을 듯 합니다.

오브젝트 클래스를 보면

오브젝트라는 클래스 이름과 operation1( ) operation2( ) 라는 두개의 함수명이

옆으로 살짝 기울어져 있는 것이 보이실겁니다.

일단 클래스 이름이 기울어져 있는 것은

저것이 추상 클래스로서 인스턴스를 생성하지 않을 것이라는 것을 의미하고

함수 두개의 이름이 기울어져 있는 것은 저 함수들이 가상함수라는 것을 의미합니다.

저런식으로 가상함수와 추상 클래스를 표기해서 인터페이스를 그리는 방법도 있겠지만

저는 자바사용자가 아니고 C++에서는 interface라는 개념도 없어서 인터페이스에 관해서는

자세히 모르겠네요 ;ㅅ;

제 블로그에 있는 정보들은 모두 수정 및 퍼가는것을 제한하고 있지 않으며

오른클릭과 Ctrl + C도 먹으니까 자유롭게 활용하시면 됩니다.

그리고 필요하신 것을 요청하시면 가능한 것이라면 도와드리는 주의랍니다.

마음껏 가져가세요~

Posted by 신의물방울
Programming/Database2011. 7. 12. 17:14
■ ERD는 엔티티 간의 관계를 나타내는 그림입니다

ERD(Entity Relationship Diagram: 엔티티 관계도, 개체 관계도)는 DFD(데이터 흐름도)와 함께 시스템 분석과 설계에서 매우 유용하게 사용되는 다이아그램입니다. 

ERD에서 엔터티(entity)란 프로세스 상에 존재하는 데이터 개체로 물리적이거나 추상적인 것을 모두 포함합니다. 엔터티의 예로는 고객, 근로자, 청구서, 상품, 영수증, 창고, 지사, 영업사원 등이 있습니다.

ERD는, 요구사항으로 부터 엔터티를 정의하고, 엔티티 간의 관계를 정의하고, 각 엔티티의 속성을 나타낸 그림입니다.



DFD가 프로세스를 중심으로 데이터의 흐름을 나타내는 그림이라면, ERD는 데이터를 중심으로 데이터 간의 관게를 나타내는 그림입니다. 컴퓨터 프로그램 개발에 비유하자면, DFD는 구조형 프로그램밍(structured programming)에 적합하다면, ERD는 객체지향형 프로그램밍(object oriented programming)에 적합합니다.

예를 들어 '근로자'라는 엔터티가 있다면, 그 엔터티에 속하는 '홍길동'이라는 엔터티 인스턴스가 존재할 수 있다. ERD에서 엔터티는 직사각형으로 그리며, 각 엔터티간의 관계는 좌측 그림에 예시되어 있는 것과 같은 표기방법을 이용하여 관계를 나타내게 됩니다

■ ERD 구성요소

ERD 그림을 구성하는 요소는 엔티티(entity), 관계(relationship), 속성(attribute) 등 3가지가 있습니다.

▶ 엔티티(entity)

엔티티는 시스템을 이루고 있는 사물이나 사건으로, 개체(object)라고도 합니다.
ERD에서 엔티티는 사각형(□)으로 나타내며, 사각형 안에는 엔티티의 이름을 넣습니다.



▶ 관계(relationship)

관계는 엔티티간 간의 연관성을 나타냅니다. 연관성은 '소유하다(own)', '소속된다(belong)'. '첨부되다(attach)' 등이 있습니다. 
ERD에서 관계는, 두엔티티 간을 선으로 연결하고 중간에 마름모(-◇-)로 나타내며, 마름모 안에는 관계의 이름을 넣습니다.
또한 두 엔티티 간의 관계는 1대1, 1대N, N대N가 있으면, N개가 있는 곳은 검고 작은 점(●)으로 표시합니다. 예를 들면 1대1(-◇-), 1대N(-◇-●), N대N(●-◇-●)과 같이 표시합니다.



▶ 속성(attribute)

속성은 엔티티가 가지고 있는 속성 데이터로, 엔티티가 도면이라면, 속성은 작성자, 작성일자. 도면 이름, 도면 번호 등이 될 수 있습니다. 
ERD에서 속성은 엔티티에서 선으로 연결된 동그라미(-○)로 표시됩니다. 동그라미 내에는 속성들을 모두 기술합니다.



■ ERD의 작성방법

ERD의 작성방법은 다음과 같습니다. 

- 업무를 분석하여 엔티티를 찾아내고, 각각 엔티티에 이름을 부여합니다.
- 각각의 엔티티에 대한 속성을 찾아 내어 정리합니다.
- 엔티티를 적절히 배치한 후, 관련된 엔티티 간에 선을 잇고, 관계를 표시합니다.
- 엔티티에 대한 속성을 표시합니다.

■ 모든 속성은 엔티티가 될 수 있습니다.

ERD에서 엔티티의 속성을 정의할 때 주의할 사항이 있습니다. 
예를 들어 위에서 이야기한 도면에 대한 속성으로 작성자, 작성일자. 도면 이름, 도면 번호가 있다고 할 때, 이중에서 작성자를 속성으로 볼 수도 있지만, 엔티티로 정의 할 수도 있습니다. 작성자가 엔티티가 된다면, 작성자의 속성은 이름, 사번, 소속, 전화번호, 전자우편 주소 등이 될 수 있습니다. 또 작성자와 도면 간에는 '생성하다(create)'는 관계가 생기게 됩니다.

작성자를 도면의 속성으로 정의하는 것이 나을지, 다른 엔티티로 정의하는 것이 나을지는 다른 요소를 고려해야합니다. 만약 작성자가 다른 엔티티에서도 사용된다면 엔티티로 만든 후 관계를 맺어 주는 편이 좋고, 다른 곳에서 사용하지 않고, 오직 도면에서만 사용된다면 도면의 속성으로 정의하는 편이 좋습니다.
Posted by 신의물방울
Programming/Database2011. 7. 12. 17:13
출처: www.dbguide.net


1. 데이터 모델
  1.1 데이터 모델의 정의
데이터의 집합을 기술하는데 사용되는 개념이며, 데이터를 조작할 수 있는 연산들의 모임을 의미한다. 데이터는 키(주 식별자)와 일반 칼럼(속성, Attribute)올 표현이 되며 키와 칼럼들이 모인 로우(레코드), 하나 이상의 로우가 모인 테이블(모델링 단계에서는 엔티티)이 되는데, 모든 용어들이 데이터의 표현에 사용된다.
  1.2 데이터 모델의 종류
가. 개념적 모델(Conceptual Model)
현실 세계의 업무규칙(업무처리흐름상의 규칙, 양식 등의 자료를 구성하는 데이터들의 상관관계 규칙)을 개략적으로 데이터 모델을 사용하여 표현을 하되, 각각의 사업장, 부서 등에 대해서 개별적인 데이터 모델이 작성될 수 있다.
나. 논리적 모델(Logical Model)
개념적 데이터 모델을 통합한 것으로써, 각각의 사업장, 부서 등의 데이터를 구성하는 속성들의 
도메인(자릿수, 형태, 초기 값 등)이 통합되어 표현 된다. 

논리적 데이터 모델은 특히 다음과 같은 특성을 가지고 있다.
 데이터베이스 설계 시 사용 
 주어진 현실세계로부터 개념의 집합을 명세
 높은 수준의 추상화에서 현실세계를 표현하는 도구
 현실세계를 이해하기 쉽고 해석하기 쉽도록 현실세계를 명세

논리적 데이터 모델의 평가기준은 다음과 같다.
 표현성(Expressiveness) 
 단순성(Simplicity)
 최소성(Minimality)
 정형성((Formality)

다. 물리적 모델(Physical Model)
논리적 데이터 모델과 비교한 물리적 데이터 모델의 특징은 다음과 같다.
 특정 DBMS에 의해 지원됨
 컴퓨터에 의해 처리될 수 있는 데이터 명세를 지원
 종류 : 계층형 모델, CODASYL 모델, 관계형 모델

  1.3 데이터베이스 구축과정으로 본 데이터 모델의 의의
데이터베이스 구축과정은 현실세계의 데이터와 업무를 데이터 모델의 세계로 Mapping시키는 과정이라고 할 수 있다. 데이터베이스는 현실 세계의 데이터와 업무를 그들의 세계로 안내하는데 있어서 그들이 채택한 모델을 통하여 안내한다. 즉, 모델의 표현규칙, 작성규칙을 따라 현실세계의 자료와 업무가 표현된다. 다시 말하면 컴퓨터세계와 현실세계의 연결다리 역할을 하는 것이 바로 이 모델이다. 데이터베이스 관리시스템(DBMS) 또한 이 모델을 근거로 각종 자동화 처리기를 제작했다. 따라서, 데이터베이스 시스템을 구축 시에 필수적으로 그들이 채택한 데이터 모델에 대하여 정통할 필요가 있다. 
2. 데이터 모델링
  2.1 데이터 모델링 절차
다음은 일반적인 데이터 모델링 절차이다. 
일반론적인 데이터 모델링 절차 그림에서 '데이터 모델 콘테스트' 및 '업종별 표준 데이터 모델'의 제작과 관련하여 엔티티 정의, 관계 정의, 엔티티-관계도 작성, 주/부 식별자 정의, 외부 식별자 정의, 세부속성 정의에 대해서만 설명하기로 한다. 나머지 부분들은 일반 책자들에 잘 설명이 되어 있으므로 참고하기 바란다.
  2.2 엔티티 정의
가. 엔티티의 종류
엔티티의 종류는 독립 엔티티(Kernel Entity, Master Entity), 업무중심 엔티티(Transaction Entity), 종속 엔티티(Dependent Entity), 교차 엔티티(Associative Entity, Relative Entity)의 4종류로 분류된다.
1) 독립 엔티티(Kernel Entity, Master Entity)
    사람, 물건, 장소, 개념처럼 원래부터 현실세계에 존재하는 엔티티.
    예) 사원, 고객, 영업부, 창고, 생산계획, 계정과목 … 

2) 업무중심 엔티티(Transaction Entity)
    업무가 실행되면서 발생하는 엔티티
    예) 주문, 납품, 대금청구, 대금지급 … 

3) 종속 엔티티(Dependent Entity)
    주로 1차 정규화(1st Normalization)로 인하여 관련 중심엔티티로 부터 분리된 엔티티
    예) 주문품목, 납품품목 … 

4) 교차 엔티티(Associative Entity, Relative Entity)
    다:다 관계를 해소하려는 목적으로 인위적으로 만들어진 엔티티 

나. 엔티티의 자격조건
엔티티의 종류는 독립 엔티티(Kernel Entity, Master Entity), 업무중심 엔티티(Transaction Entity), 종속 엔티티(Dependent Entity), 교차 엔티티(Associative Entity, Relative Entity)의 4종류로 분류된다.

다. 엔티티의 예
다음 표는 엔티티의 사례를 보여주는 표이다.
① 사람 (사원(직원, 행원, 공원,…), 계약자(가입자, 회원,…), 이용자(학생, 환자,…))
② 물건 (재료(부품, 원자재, 연료, …), 상품(제품,…), 시설(건물, 창고, 운송센터,…), 지점(영업소, 소매점,…))
③ 사건 (계약(수주,발주,…), 작업(공정, 보관, 선전, 광고,…), 사고(재해, 고장,…))
④ 장소 (구획(창고, 선반, 진열케이스, 생산라인, …), 지역(판매구역, 관할구, 선거구,…), 하천, 항만(부두, 선창,…))
⑤ 개념 (목표, 계획(지침, 방침, 지표, 판매목표, 생산계획, 판매계획, 인원계획,…), 시간(월, 일, 년, 시각, 시각분할,…), 평가(기준, 지표))
⑥ 금전 (예입금(구좌,…), 예산(년간예산, 수정예산, 실행예산,…), 차입(단기, 장기,…), 융자(단기, 장기,…))

  2.3 관계(Relationship) 정의
가. 기수성(Cardinality)
기수성은 다음과 같이 정의된다.
 1:1, 1:M, M:N 관계
 해당엔티티 1건에 대한 상대엔티티의 기수성을 상대 엔티티쪽에 표기
 표기 방법(James Martine 표기법)

나. 선택성(Optionality)
선택성은 다음과 같이 정의된다.
 집합의미 (포함, 불포함)
 1:0 (Optional), 1:1 (Mandatory)
 해당엔티티 1건에 대한 상대엔티티의 기수성을 상대엔티티쪽에 표기
 표기 방법(James Martine 표기법)

다. 관계의 완성 : 기수성과 선택성의 통합 [James Martin]
기수성과 선택성을 통합하면 관계가 완성이 된다.
 해당 엔티티를 기준으로 기수성의 경우의 수와 선택성의 경우의 수를 합하여 최소값과 
  최대값의 경우의 수를 구한 후 해당 엔티티쪽에 최대값을 바깥쪽에 최소값을 표기한다.
 상대 엔티티도 유사한 방법으로 표기한다.

라. 관계의 완성 사례
다음은 '고객'엔티티와 '주문'엔티티에 대하여 관계를 작성하는 절차를 보여주는 사례이다.
 기수성 : 각 고객은 하나 이상의 주문을 할 수도 있고 안 할 수도 있다.
 선택성 : 각 주문은 고객이 하는 것도 있고 그렇지 않을 수도 있다. (사원이 할 수도 있다.)

관계를 완성할 때 흔히 나올 수 있는 경우에 대한 대처 방법을 설명하기로 한다.
첫째, 기수성과 선택성의 통합 시 다:다 관계가 나올 수가 있는데 이는 Table Join이 안되므
        로 (외부 키의 표시가 불능) 교차 엔티티를 이용하여 표기한다. 

둘째, 관계는 두 엔티티간의 업무규칙(Business Rule)을 토대로 인위적인 방법으로 기수성
        과 선택성을 구하여 이를 통합하여 완성된다. 

셋째, 관계(Relationship) 표기의 의미는 두 엔티티 중에서 외부키(Foreign Key)가 놓이는
        자식 엔티티를 구분하기 위한 것이 첫째 임무이다. 외부키는 부모엔티티의 기본키(Pri
        mary Key)가 되기 때문이다. 둘째 임무는 외부키 무결성(관계무결성)을 구하기 위한
        것이다. 

넷째, 기수성 표기, 선택성 표기, 관계통합 표기 방법이 각 교수나 RDBMS 업체에 따라 다를
        수 있는데 큰 문제가 되지 않는다. 왜 관계(Relationship)를 구하는 가의 이유만 알면
        되기 때문이다.

  2.4 엔티티-관계도(Entity Relationship Diagram)의 작성
가. 작도방법
다음은 엔티티-관계도를 효과적으로 작성하는 기법을 설명하기로 한다.
 사각형의 도형 안에 엔티티명을 기록
 업무흐름의 진행순서와 관련된 엔티티는 진행순서를 고려하여 좌에서 우 또는 상에서 하로   중심부에 배열 ("주문"→ "출고")
 중심에 배열된 엔티티와 관계를 가진 연관엔티티(종속엔티티)를 가까운 쪽으로 배열
  ("주문" : "주문품목", "출고" : "출고품목")
 배열된 엔티티와 관계를 갖는 핵심엔티티(Kernal Entity)를 외곽으로 전개
  ("주문", "고객", "영업담당자", "창고", "품목", "제품")
 해당엔티티의 한 건에 대한 상대엔티티의 기수성(Cardinality)을 상대 엔티티쪽에 표기함으
  로써 관계의 기수성을 표기 :
 해당엔티티의 한 건에 대한 상대엔티티의 선택성(Optionality)을 상대 엔티티쪽에 표기함으
  로써 관계의 선택성을 표기 :

나. 주요성공요소
엔티티-관계도를 작성하는데 있어서 주요성공요소는 다음과 같다.
 엔티티를 식별하고, 관계를 도출한 후 ERD작도법에 맞추어 ERD를 작성 
 업무흐름 및 업무규칙의 ERD작도 시 활용

다. 엔티티-관계도와 관련된 실무적인 의미 및 검증기준
다음은 엔티티-관계도의 실무적인 의미와 작성시 유의사항이다.
첫째, 엔티티-관계도는 데이터베이스의 형상(Schema)을 결정하는 매우 중요한 그림이다.
둘째, 엔티티-관계도는 업무흐름을 나타낼 수 있어야 하며, 중요한 데이터속성들이 모두 표현되어 있어야 한다. 따라서 엔티티-관계도는 표현규칙 및 작성규칙에 충실하게 따라서 작성이 되어야 한다.
셋째, 엔티티-관계도를 그리다 보면 선이 겹치는 경우가 많이 발생하는데, 이는 상기한 작도방법을 따르지 않은 것으로 많은 문제를 야기할 수 있다.

다음은 실무적으로 엔티티-관계도를 효과적으로 작성하는 절차이다.
 엔티티의 배열
 관계의 연결 
 기수성 정의 (기수성명 표기) 
 선택성 정의 (선택성명 표기) 
 기수성과 선택성의 통합 : 엔티티-관계도의 완성 
 관계가 다:다일 경우에 교차엔티티를 이용하여 일대다로 분리함

다음은 엔티티-관계도의 검증기준이다.
 작성규칙 및 데이터모델 표현규칙 적합성, 단순성, 확장성, 비중복성, 공유성
 모든 속성의 표현 
 관계표기의 적합성 
 사용자의 데이터요구(화면, 보고서 등)에의 성능 우수성

  2.5 주식별자(Primary Identifier, primary Key, 주키) 정의
다음은 주식별자에 대한 정의절차이다. 이해하기 쉬우므로 간략하게 절차만 설명한다.
 
 각 엔티티별로 하나의 주식별자 선택 
 후보 식별자 중 가장 중요한 하나를 주식별자로, 나머지를 대체키로 지정 
 Subtype엔티티의 주식별자는 Supertype엔티티의 주식별자와 동일하게 선택 
 데이터 이름에 대한 표준약어목록의 이용

  2.6 외부식별자(Foreign Identifier, Foreign Key, 외부키) 정의
가. 외부식별자의 특징
외부식별자는 다음과 같은 특징을 가진다.
 두 엔티티간의 관계를 결정하여 주는 속성으로 관계에 의한 자식엔티티에 위치하며 부모엔
  티티의 주식별자가 같은 값을 갖는다.
 논리적 데이터 모델내의 모든 관계에 관련된 외부키를 규명한다.

나. 외부식별자의 표기 사례
다음 그림은 외부식별자의 표기 예를 보여준다.

  2.7 속성 정의
가. 속성 정의
속성이란 엔티티를 구성하는 더 이상 분리될 수 없는 정보단위로 식별자 종류(기본, 대체, 외부 키)와 비식별자(non-key)로 구분한다.

나. 효과적인 속성 정의방법
다음과 같은 방법으로 속성을 찾아 정의한다.
 정보 분석단계에서 수집된 각종자료 참조
 엔티티, 관계 정의시 파악 
 기존 정보시스템 분석 - 관련 DB나 file의 field 
 속성의 이름을 부여 - 표준화 규칙 사용, 자료사전에 기록

다. 속성 정의 예
다음 표는 제품 엔티티에 대한 속성 정의 예이다. 
엔티티 속성 속성유형 식별자구분 비고
제품 제품코드 설계 PK
  제품명 기초  
  기대수요 기초    
  재주문요구 기초    

  2.8 데이터 모델 검증 및 주요성공요소
가. 데이터 모델 검증 방법
데이터 모델 검증은 아래와 같은 범위의 품질기준에 맞추어 검증한다.
 Group Check 
Business rule에 의한 완전한 이해와 E-R Modeling에 대한 완전한 이해를 가진 숙련된 분석가가 최선의 답이며, Project 팀 내의 동료끼리 상호 모델을 Check하고 오류를 찾아 본다.
 사용자(End User) 확인 
정기적으로 사용자에게 모델을 제시하면서 확인하거나, 사용자를 참여시켜 Error와 누락된 것을 check한다.
 업무규칙(Business Rule)
 엔티티품질 검증
 속성품질 검증
 관계품질 검증
 완전성 검증
사용자 INTERVIEW, 서류양식, 장표, 보고서 등과 비교 점검하여 추가되거나 누락된 것이 없는지를 확인하고, 향후 입력, 출력보고서가 모두 적용될 수 있는지를 점검한다.

나. 주요성공요소
데이터 모델링을 잘하기 위하여 다음과 같은 내용들을 숙지한다. 
첫째,
분석단계의 Data Modeling(산출물: Logical ERD)과 설계단계(산출물: Physical ERD)의 구분
 Business Rule이 같기 때문에 분석단계의 ERD(Entity로 표시)와 설계단계의 
  ERD(Table로 표시)의 근본구조는 달라지지 않는다. 
 분석단계의 ERD에서 약 20%내외만이 수정이 되어 설계단계의 ERD로 바뀐다. 
 설계단계에서는 성능(Performance)을 고려한 Summary, Duplicate, Processin
  g Table이 만들어진다.
둘째,
엔티티-관계도(ERD) 작성 및 검증요령
 현재의 장표, 양식, 업무 매뉴얼, 보고서, 사용자인터뷰 내용 등에서 Entity추출
  기준 (정보관리대상, 유일한 키의 존재, 키 이외의 속성 가질 것) 엔티티(Entity)
  를 추출 하여 적어 놓는다.) 
 엔티티 사이의 Business Rule을 분석하여 그들 사이의 관계를 찾는다. 
관계유형> 
▶ Dynamic flow(업무흐름도에 의존 :주문→생산지시→제품입고 → 출고 →납품)
▶ Static flow(데이터 자체의 관계 : BOM Type, Super-Sub Type)
▶ Transient flow(시간이 가면 변하는 것 : 정산-미정산 분개의 확정 시점)
 향후 입력화면, 출력보고서가 현재의 ERD에서 추측될 수가 있고 계산하기 편한
  가 등의 기준으로 엔티티-관계도를 검증한다.
세째,
엔티티(Entity, Table)를 분해한 후 합칠 수 있다
 엔티티-관계도 작성시 핵심엔티티(독립엔티티, 코드엔티티 : kernel Entity)를
  구별함
 Sub-system만 제작한 다음 나중에 통합할 수 있다. 
네째,
엔티티-관계도를 제대로 못 그리는 이유 : Business Rule을 제대로 분석하지 못했기 때문
 Business Rule에 숨어있는 Data를 분석해내지 못했고 그들 Data사이의 관계를
  분석하지 못했기 때문
 ER 방법론 미 숙지 
 Business Rule해독 90%, ER방법론 숙지 10% 
다섯째,
관계형 데이터베이스 모델링은 속성(Attribute)끼리의 Logical Model이다
 속성(Attribute끼리의 Business Rule → Relationship 
 물리적 의미(Physical meaning) → Relational Key(외부키)의 정의
여섯째,
관계형 데이터베이스는 속성(Attribute)접근 방식이지 Pointer접근방식(COBOL문의 OCCURS, Redefine)이 아님, 즉 같은 TYPE의 속성은 중복되면 안 된다.
일곱째,
엔티티-관계도(ERD)작성시 속성 검출 및 정규화 유의사항
 속성(Attribute)은 가장 최소로 자른다. (예 : 년월일→년, 월, 일) 
 주키(Primary Key)가 나누어지는 것은 분석이 잘못되었기 때문이다 
 1차, 2차, 3차 정규화를 잘 할 것
여덟째,
다대다(Many to Many)관계가 해소되어야 하는 이유와 해소 방법
 속성(Attribute)사이에만 관계(Relationship)가 생성하는데, Many to Many는
  관계를 맞출 수가 없다. 
 비교엔티티 (연결엔티티, 교차엔티티)를 집어넣어준다 
  : 양쪽의 엔티티(Entity)와 속성(Attribute)이 서로 key나 Data부분의 속성
  (Attribute)으로 들어가기만 하면 된다.
아홉째,
Logical Design(Data중심)과 Physical Design(사용하는 DBMS, System 중심)을 완전히 분리할 것
 Summary Table은 Relationship으로 표시가 불가하다. 
(Logical Data Modeling에서는 표시가 안됨)
 Physical개념 : Processing 개념
열째,
엔티티-관계도 (ERD)를 작성시 Top-Down과 Bottom-up을 병행하면서 진행한다. 왜냐하면 Entity의 분할과 Attribute의 상세한 define이 발생하기 때문이다.
열한째,
엔티티-관계도 작성시 선택성(Optionality)을 구분해줄 필요가 있으나 치명적이지 않다.
Posted by 신의물방울