반응형

1. 프로그램 개발 완료 후, 수정하게 되는 경우 기 개발된 로직과의 충돌(상호모순) 또는 무시하게 되는 경우를
    사전에 예방할 수 있는 방법은?  또는 테스트 할 수 있는 방법은?
    (예) 계산서 발행 프로그램에서 거래명세서 발행분만 발행 할 수 있도록 변경 하였더니
        '매출할인'계산서(거래명세서 없음)도 발행 할 수 없게 되는 bug 생성.

2. 현업과의 업무분석 시 주의 점
  - 모든 현업의 요구사항은 그 앞에 하나의 말이 생략 되어 있다. 바로
     "지금은(현재는)" 이다.
  - 어떠한 요구사항도 변경 될 수 있다는 점을 간과해서는 안된다.
    "그런 프로세서는 없습니다." 라는 현업의 말 속에는
    "지금은 그런 프로세스는 없습니다. 그러나 나중에는 발생 할 수 있습니다." 라는 뜻임을 명심할 것!

3. 생산, 매출, 반품, 환입 .... 회계(계산서)
  - 생산 부터 이후의 모든 프로세스 까지 연결고리가 끊어지지 않도록 설계 되어야 한다.
  - 생산(제조사업장), 도매(판매사업장) 사업장간의 자유로운 재고이동 및 매출/반품이 고려 되어야 한다.
    (매출발생한 사업장으로 반품(재고, 계산서)이 발생)

4. 폐업이나 사업주 변경 등으로 거래처 잔고가 이동 할 때, 실적 또한 이동 해야 반품 시에 원래(변경전) 거래처를 
   찾아가서 단가정보 등을 찾을 수 있다.
   여기서 실적이동 이란 실제로 전표내역이 이동한다기 보다, 변경 된 거래처코드 간 이력을 관리해야 한다는 의미 임.
   변경된 거래처간 이력이 없을 경우 부동처조회에도 영향을 미친다. 즉 과거 거래처에서 수금이 6개월 이상 없어서
   부동처 임에도 불구 하고  신규 거래처로 잔고 이동할 경우, 이동한 일자가 6개월 미만이라면 수금부동처에서 누락이 된다.

5. 설계변경시 유의점
  - 변경하게 될 경우 과거 및 현재의 데이터를 어떻게 할 것인가?
    (과거 데이터의 마이그레이션 및 현재 발생중에 있는 데이터의 처리)


반응형
반응형

 
임백준 저
 
한빛미디어
2008.09.01

1. 복잡하고 까다로운 요구사항이 최종 사용자에게 미치는 영향은 무엇인가
 
2. 시스템 설계 전반에 미치는 영향은 무엇인가
 
3. 그것은 구현될 수 있는가
 
4. 요구사항에 담긴 내용은 최종 목적에 온전히 부합하는가
 
5. 빠진 내용은 없는가
 
6. 서로 모순되는 요구사항은 없는가
 
7. 그것으로 인해서 보안,성능,확장가능성등에 미치는 부정적인 영향은 없는가
 
8. 요구사항의 변동에 대해서 어떻게 대처할지에 대한 대응 프로세스가 있는가
반응형
반응형

1. 비지니스 룰 단위의 별도 클래스 분리설계 시
TDataModule상의 TDataset과 연동문제는 어떻게 해결 해야 할지 ?
-- 즉, TDataset 및 연결된 TDataSource, TUpdateSQL등의 Event Procedure 처리가 분리된 클래스에서
처리할 수 없으므로 이벤트 처리는 여전히 TDataModule상에서 해야 하는 문제.
<방안1>
해당 비지니스 룰 클래스를 TDataModule을 상속 받게 만든다.

2. 1번의 방안1에 의해 DataModule 을 상속받은 클래스를 만들 때, 해당 Unit 내에서 또다른 클래스를 만들 때
DataModule을 상속받은 클래스가 메인 폼에서 동적으로 생성되는 클래스 라면 접근 상의 문제 발생은 어떻게 ?
또한 DataModule 상속 클래스와 다른 클래스 간의 coupling 이 존재 한다면 DataModule 상속 클래스 와
다른 클래스를 별도로 생성 및 관리를 해야 좋을지 아니면 DataModule 상속 클래스 내에서 다른 클래스를
멤버변수로 가져 가야 할지도 고민.

3. 1번과 비슷한 경우로, TDataModule 상속받은 클래스 와 TForm을 상속 받은 클래스 간에
DataSet, DataSource등의 event 발생시 TForm 상속 클래스에서 어떤 처리를 해야 할때 어떻게 해야 하는가?
(예) DataSource의 OnDataChange 이벤트 때마다 폼에서 어떤 처리를 해야 한다고 할때
어떻게 해야 uncouping 하면서도 원하는 처리를 구현 할 수 있을까?

반응형
반응형
* 테이블 디자인을 하면서 주의해야 할 사항을 정리 해 보았다*
 
1. PK 영역에는 변경될 수 있는 값을 넣지 말자.
   → 해당 테이블을 참조하는 테이블이 있으면 변경 할 수 없으므로.
즉 트랜잭션 데이터의 경우 일반적으로 '(영업, 생산, 반품 등 행위가 실제로 발생한) 업무일자 +  일련번호'로 PK를 부여 하는 경우가 많다. 그런데 해당 테이블을 참조하는(즉, FK로 참조) 테이블이 있다면 날짜의 변경이 필요한 경우에 곤란해 진다.
따라서 이를 해소 할 수 있는 대안으로 PK에는 "자료등록일자(log일자) + 일련번호"를 부여 하고 실제 업무일자는 별도 컬럼으로 관리를 하므로서 업무일자가 변경되어야 할 경우에도 유연하게 처리할 수 있다.

※ SQL서버의 경우 SQL서버2000 이상에서는 UPDATE, DELETE에 대해서 CASCADE를 지원한다. 따라서 DB의 기능을 이용할 수 있다. 그러나 지원하지 않는 DB의 경우는 Trigger등을 사용해야 하지만, 참조 하는 테이블이 많을 경우 이것도 불편하다.

따라서 설계 자체를 잘 하는 것이 좋을 것이다.

[SQL서버의 CASCADE 예제] 

-- 부모 테이블
create table parents
( keycolumn int primary key,
  datacolumn char(10)
)

insert into parents values (1, 'AAAA')
insert into parents values (2, 'BBBB')

-- 부모 테이블을 FK로 참조하는 자식 테이블
create table child
( childkey int primary key,
  childdata char(10),
  parentskey int not null,
  FOREIGN KEY (parentskey) REFERENCES parents(keycolumn) ON UPDATE CASCADE
) 
insert into child values(10, '가가가가', 1)
insert into child values(20, '나나나나', 2)

select * from child

  childkey    childdata  parentskey
  ----------- ---------- -----------
  10          가가가가       1
  20          나나나나       2

-- 부모 테이블의 PK 변경
update parents
set keycolumn = 100
where keycolumn = 1

-- 자식 테이블의 FK도 같이 변경되었는지 확인
select * from child

  childkey    childdata  parentskey
  ----------- ---------- -----------
  10          가가가가       100
  20          나나나나       2
   

2. FK가 NULL값을 가질 수 있도록 하면 NULL인 값을 SELECT해야 할 경우 INDEX를 사용할 수 없으므로 주의해야 한다.
   
3. 동시성문제를 항상 고려하자. 즉 동시에 다중 사용자가 INSERT, UPDATE, DELETE가 발생 할 경우에 대한 처리.
  -> 자동증가(IDENTITY) 필드를 지원하는 DB와 그렇지 않은 경우도 고려
 
4. ENTITY의 PK에 해당하는 실체가 한개가 존재 하는지 아니면 여러개가 존재 하는지에 따라서 릴레이션이 달라질 수 있다.
즉, 거래처, 사원과 같이 PK에 해당하는 실체가 1개만 있는 경우와 제품과 같이 여러개의 수량으로 존재할 수 있는 경우에 따라서 1:M 될수도 있고 M:M이 될수도 있다.
또한 제품이라고 해도 온라인에서 판매되는 상품과 같이 하나의 코드에 여러개의 재고가 있는 경우도 있고 선박이나 건물과 같이 오직 하나만 있는 경우도 있으므로, 반드시 실제(현실세계)를 고려해야 한다.
즉, PK가 바로 실체 그 자신과 동격인지, 아니면 여러개의 실체를 대표하는 대표코드 성격인지를 파악해야 한다.
다시 말해서 하나의 row가 instance 성격인지 아니면 object(class) 성격인지를 확인해야 한다.
object 성격이라면 필수적으로 수량 관리가 들어 간다.
 
5. ENTITY와 ENTITY간의 릴레이션이 오직 한번만 이루어 지는지 아니면 여러번 이루어 질 수 있는지 고려해야 한다.
예를들어, M:M 관계를 풀기 위해서는 양쪽 ENTITY의 PK로 교차 ENTITY의 PK를 만들게 되는데 그 PK만으로 유니크 할 수도 있고, 만약 그런 관계가 여러번 발생한다면 일련번호등의 PK가 추가되어야 한다.
 
6. 어떤 자료가 변경 될 경우 단순히 UPDATE만 할 것 인지, 아니면 이력으로 관리 해야 할 것인지를 판단 해야 한다.
    (마스터는 물론 Transaction 데이터도)

 

반응형

+ Recent posts