2011년 4월 15일 금요일

오라클 계층형 게시판용 SQL

예를들어 다음과 같은 구조로 게시판을 만들어야 한다면?


1

  2
 
    3
    
       6
    
    4


  5
 
  7


create table tbl_board (
  seqno number,
  title varchar2(300) not null,
  content varchar2(4000) not null,
  writer varchar2(50) not null,
  regdate date default sysdate,
  updatedate date default sysdate,
  gid number,
  ord number,
  pid number,
  depth number
);

alter table tbl_board add constraint pk_board primary key (seqno);





drop sequence seq_board;

create sequence seq_board increment by 1;

delete  tbl_board;
--원글 등록--
insert into tbl_board (seqno, title, content, writer, gid, ord, pid, depth)
values (seq_board.nextval, 'title1','content1','user00', seq_board.currval, 0, 0, 0);

--2
--select * from tbl_board start with pid= 1 connect by pid = prior seqno;

--select (ord + (select count(seqno) + 1  r from tbl_board start with pid= 1 connect by pid = prior seqno) ) from tbl_board where seqno = 1;

update tbl_board set ord = ord + 1 where gid = 1 and ord >= (select (ord + (select count(seqno) + 1  r from tbl_board start with pid= 1 connect by pid = prior seqno) ) from tbl_board where seqno = 1);

insert into tbl_board (seqno, title, content, writer, gid, ord, pid, depth)
values (seq_board.nextval, 'title2','content2','user00', 1, (select (ord + (select count(seqno) + 1  r from tbl_board start with pid= 1 connect by pid = prior seqno) ) from tbl_board where seqno = 1), 1, 1);

--3
--select (ord + (select count(seqno) + 1  r from tbl_board start with pid= 2 connect by pid = prior seqno) ) from tbl_board where seqno = 2;

update tbl_board set ord = ord + 1 where gid = 1 and ord >= (select (ord + (select count(seqno) + 1  r from tbl_board start with pid= 2 connect by pid = prior seqno) ) from tbl_board where seqno = 2);

insert into tbl_board (seqno, title, content, writer, gid, ord, pid, depth)
values (seq_board.nextval, 'title3','content3','user00', 1, (select (ord + (select count(seqno) + 1  r from tbl_board start with pid= 2 connect by pid = prior seqno) ) from tbl_board where seqno = 2), 2, 2);

--4

--select * from tbl_board start with pid= 1 connect by pid = prior seqno;

--select (ord + (select count(seqno) + 1  r from tbl_board start with pid= 1 connect by pid = prior seqno) ) from tbl_board where seqno = 1;

update tbl_board set ord = ord + 1 where gid = 1 and ord >= (select (ord + (select count(seqno) + 1  r from tbl_board start with pid= 2 connect by pid = prior seqno) ) from tbl_board where seqno = 2);

insert into tbl_board (seqno, title, content, writer, gid, ord, pid, depth)
values (seq_board.nextval, 'title3','content3','user00', 1, (select (ord + (select count(seqno) + 1  r from tbl_board start with pid= 1 connect by pid = prior seqno) ) from tbl_board where seqno = 1), 2, 2);


--5

--select * from tbl_board start with pid= 1 connect by pid = prior seqno;

--select (ord + (select count(seqno) + 1  r from tbl_board start with pid= 1 connect by pid = prior seqno) ) from tbl_board where seqno = 1;

update tbl_board set ord = ord + 1 where gid = 1 and ord >= (select (ord + (select count(seqno) + 1  r from tbl_board start with pid= 1 connect by pid = prior seqno) ) from tbl_board where seqno = 1);

insert into tbl_board (seqno, title, content, writer, gid, ord, pid, depth)
values (seq_board.nextval, 'title3','content3','user00', 1, (select (ord + (select count(seqno) + 1  r from tbl_board start with pid= 1 connect by pid = prior seqno) ) from tbl_board where seqno = 1), 1, 1);


--6

--select * from tbl_board start with pid= 3 connect by pid = prior seqno;

--select (ord + (select count(seqno) + 1  r from tbl_board start with pid= 3 connect by pid = prior seqno) ) from tbl_board where seqno = 3;

update tbl_board set ord = ord + 1 where gid = 1 and ord >= (select (ord + (select count(seqno) + 1  r from tbl_board start with pid= 3 connect by pid = prior seqno) ) from tbl_board where seqno = 3);


insert into tbl_board (seqno, title, content, writer, gid, ord, pid, depth)
values (seq_board.nextval, 'title6','content6','user00', 1, (select (ord + (select count(seqno) + 1  r from tbl_board start with pid= 3 connect by pid = prior seqno) ) from tbl_board where seqno = 3), 3, 3);


--7

select (ord + (select count(seqno) + 1  r from tbl_board start with pid= 1 connect by pid = prior seqno) ) from tbl_board where seqno = 1;

update tbl_board set ord = ord + 1 where gid = 1 and ord >= (select (ord + (select count(seqno) + 1  r from tbl_board start with pid= 1 connect by pid = prior seqno) ) from tbl_board where seqno = 1);

insert into tbl_board (seqno, title, content, writer, gid, ord, pid, depth)
values (seq_board.nextval, 'title7','content7','user00', 1, (select (ord + (select count(seqno) + 1  r from tbl_board start with pid= 1 connect by pid = prior seqno) ) from tbl_board where seqno = 1), 1, 2);

2011년 4월 12일 화요일

의존성 주입의 개념에 관하여

객체지향 프로그래밍에서 가장 신경을 많이 쓰는 것은 역시나 '객체의 구성'입니다.

예를 들어  A,B,C 라는 객체가 있다고 가정해 보면 가장 쉬운 방식의 구성은 '기차'와 같은 방식으로 연결하는 구조라고 할 수 있습니다.

이 방식을 전문적으로 ' Demeter'방식이라고 합니다.

이 방식은  A클래스안에  B b = new B( );  와 같은 방식으로 다음에 연결될 객체를 의존적으로 사용하는 방식을 의미합니다.

 Demeter 방식은 하나의 클래스를 여러 곳에서 사용하는 경우(그물망 구조)에는 아주 최악의 복잡성을 가지게 됩니다.

따라서 이런 상태에서는 효율적인 설계를 위해서 '기차'대신에 'G마켓'방식을 사용합니다.
(당근 공식용어일리가 없잖앗!)


전문적으로 'Facade'패턴이라고 하기도 하는데 우리가  G마켓을 통해서 물건을 구매하면 안쪽에서 실제 업체를 몰라도 되는 것과 비슷한 방식입니다.

우리가 알아야 하는 것은 'G마켓'의 역할을 하는 객체만 알고 사용하면 됩니다.

이 방식의 복잡성을 하나로 모으는 효과를 가집니다.(간단히 여러분이 여러개의 인터넷 쇼핑몰을 돌아다닐 필요가 없는것과 마찬가지 입니다)


이 방식의 코드는 예를 들어 A클래스 안에서  B target = Facade.get("B") 처럼 A가 G마켓 역할을 하는 존재만 알면 되도록 하는 구조를 사용합니다.

하지만 Facade역할을 하는 코드가 없다면 이 역시 무용지물이므로 전체구조가 경직되는 것을 피할 수는 없습니다.

이래서 등장한 방식이.. 음..


이해를 위한 거니까..

'시라노 연애 조작단' 방식과 같은 방식입니다.

즉 어떤 객체가 알아채지 못하게 알아서 모든 상황을 준비하는겁니다.

예를 들어 A가 B객체가 필요하다면

누군가  A를 필요로 할때  B객체를 미리 준비 시켜서 동행시키는 방식입니다.

즉 외부에서 필요한 객체(dependency) 를 집어넣는다(injection)는 개념으로 봐야합니다.

영화에서 보면 한 커플을 맺어주기 위해서 많은 스텝들이 움직이듯이..

외부에 거대한 존재가 A가 필요한 모든 다른 객체들을 준비해 두었다가 A를 사용하는 순간에 완벽한 상황을 만들어서 처리하는 방식이라고 생각할 수 있습니다.

의존성 주입은 A안에는 B 를 받아들이는 코드만 준비해 두고..

외부에서 B를 A에 넣은 상태로 만들어서 사용하는 방식이므로

A의 코드안에서 실제 new 하는 코드를 없앨 수 있게 됩니다.

2011년 4월 10일 일요일

상속을 어떻게 적용하면 좋을까? 문제입니다.

패스트 푸드(맥도널드나 버거킹)에 가보면 많은 메뉴가 있습니다.

예를 들어 맥도널드 메뉴를 몇 개만 가정해 봅니다.

빅맥, 불고기버거, 새우버거

이 모든 메뉴들은 세트메뉴를 지원하고 있습니다.

그리고 이 메뉴들은 특별히 활인이나 적립이 허락됩니다.

보통의 통신사 카드들은 10%의 할인율을 가지고,


적립카드는 5%의 금액을 적립해 줍니다.

그렇다면 위의 데이터들을 기초로 해서 클래스로 만들려면 어떻게 해야 할까요?

상속인가? 조합인가?