반응형
Declare @i Int, @maxi Int
Declare @j Int, @maxj Int
Declare @sr int
Declare @Output varchar(4000)
--Declare @tmpOutput varchar(max)
Declare @SqlVersion varchar(5)
Declare @last varchar(155), @current varchar(255), @typ varchar(255), @description varchar(4000)

create Table #Tables  (id int identity(1, 1), Object_id int, Name varchar(155), Type varchar(20), [description] varchar(4000))
create Table #Columns (id int identity(1,1), Name varchar(155), Type Varchar(155), Nullable varchar(2), [description] varchar(4000))
create Table #Fk(id int identity(1,1), Name varchar(155), col Varchar(155), refObj varchar(155), refCol varchar(155))
create Table #Constraint(id int identity(1,1), Name varchar(155), col Varchar(155), definition varchar(1000))
create Table #Indexes(id int identity(1,1), Name varchar(155), Type Varchar(25), cols varchar(1000))

 If (substring(@@VERSION, 1, 25 ) = 'Microsoft SQL Server 2008')
   set @SqlVersion = '2008'
else if (substring(@@VERSION, 1, 26 ) = 'Microsoft SQL Server  2000')
   set @SqlVersion = '2000'
else
   set @SqlVersion = '2008'

Print '<html>'
Print '<head>'
Print '<title>::' + DB_name() + '::</title>'
Print '<style>'
   
Print '      body {'
Print '      font-family:verdana;'
Print '      font-size:9pt;'
Print '      }'
     
Print '      td {'
Print '      font-family:verdana;'
Print '      font-size:9pt;'
Print '      }'
     
Print '      th {'
Print '      font-family:verdana;'
Print '      font-size:9pt;'
Print '      background:#d3d3d3;'
Print '      }'
Print '      table'
Print '      {'
Print '      background:#d3d3d3;'
Print '      }'
Print '      tr'
Print '      {'
Print '      background:#ffffff;'
Print '      }'
Print '   </style>'
Print '</head>'
Print '<body>'

set nocount on
   if @SqlVersion = '2000'
      begin
      insert into #Tables (Object_id, Name, Type, [description])
         --FOR 2000
         select object_id(table_name),  '[' + table_schema + '].[' + table_name + ']', 
         case when table_type = 'BASE TABLE'  then 'Table'   else 'View' end,
         cast(p.value as varchar(4000))
         from information_schema.tables t
         left outer join sysproperties p on p.id = object_id(t.table_name) and smallid = 0 and p.name = 'MS_Description'
         order by table_type, table_schema, table_name
      end
   else if @SqlVersion = '2008'
      begin
      insert into #Tables (Object_id, Name, Type, [description])
      --FOR 2008
      Select o.object_id,  '[' + s.name + '].[' + o.name + ']',
            case when type = 'V' then 'View' when type = 'U' then 'Table' end, 
            cast(p.value as varchar(4000))
            from sys.objects o
               left outer join sys.schemas s on s.schema_id = o.schema_id
               left outer join sys.extended_properties p on p.major_id = o.object_id and minor_id = 0 and p.name = 'MS_Description'
            where type in ('U', 'V')
            order by type, s.name, o.name
      end
Set @maxi = @@rowcount
set @i = 1

print '<table border="0" cellspacing="0" cellpadding="0" width="550px" align="center"><tr><td colspan="3" style="height:50;font-size:14pt;text-align:center;"><a name="index"></a><b>Index</b></td></tr></table>'
print '<table border="0" cellspacing="1" cellpadding="0" width="550px" align="center"><tr><th>Sr</th><th>Object</th><th>Type</th></tr>'
While(@i <= @maxi)
begin
   select @Output =  '<tr><td align="center">' + Cast((@i) as varchar) + '</td><td><a href="#' + Type + ':' + name + '">' + name + '</a></td><td>' + Type + '</td></tr>'
         from #Tables where id = @i
  
   print @Output
   set @i = @i + 1
end
print '</table><br />'

set @i = 1
While(@i <= @maxi)
begin
   --table header
   select @Output =  '<tr><th align="left"><a name="' + Type + ':' + name + '"></a><b>' + Type + ':' + name + '</b></th></tr>',  @description = [description]
         from #Tables where id = @i
  
   print '<br /><br /><br /><table border="0" cellspacing="0" cellpadding="0" width="750px"><tr><td align="right"><a href="#index">Index</a></td></tr>'
   print @Output
   print '</table><br />'
   print '<table border="0" cellspacing="0" cellpadding="0" width="750px"><tr><td><b>Description</b></td></tr><tr><td>' + isnull(@description, '') + '</td></tr></table><br />'

   --table columns
   truncate table #Columns
   if @SqlVersion = '2000'
      begin
      insert into #Columns  (Name, Type, Nullable, [description])
      --FOR 2000
      Select c.name,
               type_name(xtype) + (
               case when (type_name(xtype) = 'varchar' or type_name(xtype) = 'nvarchar' or type_name(xtype) ='char' or type_name(xtype) ='nchar')
                  then '(' + cast(length as varchar) + ')'
                when type_name(xtype) = 'decimal' 
                     then '(' + cast(prec as varchar) + ',' + cast(scale as varchar)   + ')'
               else ''
               end           
               ),
               case when isnullable = 1 then 'Y' else 'N'  end,
               cast(p.value as varchar(8000))
            from syscolumns c
               inner join #Tables t on t.object_id = c.id
               left outer join sysproperties p on p.id = c.id and p.smallid = c.colid and p.name = 'MS_Description'
            where t.id = @i
            order by c.colorder
      end
   else if @SqlVersion = '2008'
      begin
      insert into #Columns  (Name, Type, Nullable, [description])
      --FOR 2008  
      Select c.name,
               type_name(user_type_id) + (
               case when (type_name(user_type_id) = 'varchar' or type_name(user_type_id) = 'nvarchar' or type_name(user_type_id) ='char' or type_name(user_type_id) ='nchar')
                  then '(' + cast(max_length as varchar) + ')'
                when type_name(user_type_id) = 'decimal' 
                     then '(' + cast([precision] as varchar) + ',' + cast(scale as varchar)   + ')'
               else ''
               end           
               ),
               case when is_nullable = 1 then 'Y' else 'N'  end,
               cast(p.value as varchar(4000))
      from sys.columns c
            inner join #Tables t on t.object_id = c.object_id
            left outer join sys.extended_properties p on p.major_id = c.object_id and p.minor_id  = c.column_id and p.name = 'MS_Description'
      where t.id = @i
      order by c.column_id
      end
   Set @maxj =   @@rowcount
   set @j = 1

   print '<table border="0" cellspacing="0" cellpadding="0" width="750px"><tr><td><b>Table Columns</b></td></tr></table>'
   print '<table border="0" cellspacing="1" cellpadding="0" width="750px"><tr><th>Sr.</th><th>Name</th><th>Datatype</th><th>Nullable</th><th>Description</th></tr>'
  
   While(@j <= @maxj)
   begin
      select @Output = '<tr><td width="20px" align="center">' + Cast((@j) as varchar) + '</td><td width="150px">' + isnull(name,'')  + '</td><td width="150px">' +  upper(isnull(Type,'')) + '</td><td width="50px" align="center">' + isnull(Nullable,'N') + '</td><td>' + isnull([description],'') + '</td></tr>'
         from #Columns  where id = @j
     
      print    @Output   
      Set @j = @j + 1;
   end

   print '</table><br />'

   --reference key
   truncate table #FK
   if @SqlVersion = '2000'
      begin
      insert into #FK  (Name, col, refObj, refCol)
   --      FOR 2000
      select object_name(constid), s.name,  object_name(rkeyid) ,  s1.name 
            from sysforeignkeys f
               inner join sysobjects o on o.id = f.constid
               inner join syscolumns s on s.id = f.fkeyid and s.colorder = f.fkey
               inner join syscolumns s1 on s1.id = f.rkeyid and s1.colorder = f.rkey
               inner join #Tables t on t.object_id = f.fkeyid
            where t.id = @i
            order by 1
      end  
   else if @SqlVersion = '2008'
      begin
      insert into #FK  (Name, col, refObj, refCol)
--      FOR 2008
      select f.name, COL_NAME (fc.parent_object_id, fc.parent_column_id) , object_name(fc.referenced_object_id) , COL_NAME (fc.referenced_object_id, fc.referenced_column_id)    
      from sys.foreign_keys f
         inner  join  sys.foreign_key_columns  fc  on f.object_id = fc.constraint_object_id  
         inner join #Tables t on t.object_id = f.parent_object_id
      where t.id = @i
      order by f.name
      end
  
   Set @maxj =   @@rowcount
   set @j = 1
   if (@maxj >0)
   begin

      print '<table border="0" cellspacing="0" cellpadding="0" width="750px"><tr><td><b>Refrence Keys</b></td></tr></table>'
      print '<table border="0" cellspacing="1" cellpadding="0" width="750px"><tr><th>Sr.</th><th>Name</th><th>Column</th><th>Reference To</th></tr>'

      While(@j <= @maxj)
      begin

         select @Output = '<tr><td width="20px" align="center">' + Cast((@j) as varchar) + '</td><td width="150px">' + isnull(name,'')  + '</td><td width="150px">' +  isnull(col,'') + '</td><td>[' + isnull(refObj,'N') + '].[' +  isnull(refCol,'N') + ']</td></tr>'
            from #FK  where id = @j

         print @Output
         Set @j = @j + 1;
      end

      print '</table><br />'
   end

   --Default Constraints
   truncate table #Constraint
   if @SqlVersion = '2000'
      begin
      insert into #Constraint  (Name, col, definition)
      select object_name(c.constid), col_name(c.id, c.colid), s.text
            from sysconstraints c
               inner join #Tables t on t.object_id = c.id
               left outer join syscomments s on s.id = c.constid
            where t.id = @i
            and
            convert(varchar,+ (c.status & 1)/1)
            + convert(varchar,(c.status & 2)/2)
            + convert(varchar,(c.status & 4)/4)
            + convert(varchar,(c.status & 8)/8)
            + convert(varchar,(c.status & 16)/16)
            + convert(varchar,(c.status & 32)/32)
            + convert(varchar,(c.status & 64)/64)
            + convert(varchar,(c.status & 128)/128) = '10101000'
      end
   else if @SqlVersion = '2008'
      begin
      insert into #Constraint  (Name, col, definition)
      select c.name,  col_name(parent_object_id, parent_column_id), c.definition
      from sys.default_constraints c
         inner join #Tables t on t.object_id = c.parent_object_id
      where t.id = @i
      order by c.name
      end
   Set @maxj =   @@rowcount
   set @j = 1
   if (@maxj >0)
   begin

      print '<table border="0" cellspacing="0" cellpadding="0" width="750px"><tr><td><b>Default Constraints</b></td></tr></table>'
      print '<table border="0" cellspacing="1" cellpadding="0" width="750px"><tr><th>Sr.</th><th>Name</th><th>Column</th><th>Value</th></tr>'

      While(@j <= @maxj)
      begin

         select @Output = '<tr><td width="20px" align="center">' + Cast((@j) as varchar) + '</td><td width="250px">' + isnull(name,'')  + '</td><td width="150px">' +  isnull(col,'') + '</td><td>' +  isnull(definition,'') + '</td></tr>'
            from #Constraint  where id = @j

         print @Output
         Set @j = @j + 1;
      end

   print '</table><br />'
   end


   --Check  Constraints
   truncate table #Constraint
   if @SqlVersion = '2000'
      begin
      insert into #Constraint  (Name, col, definition)
         select object_name(c.constid), col_name(c.id, c.colid), s.text
            from sysconstraints c
               inner join #Tables t on t.object_id = c.id
               left outer join syscomments s on s.id = c.constid
            where t.id = @i
            and ( convert(varchar,+ (c.status & 1)/1)
               + convert(varchar,(c.status & 2)/2)
               + convert(varchar,(c.status & 4)/4)
               + convert(varchar,(c.status & 8)/8)
               + convert(varchar,(c.status & 16)/16)
               + convert(varchar,(c.status & 32)/32)
               + convert(varchar,(c.status & 64)/64)
               + convert(varchar,(c.status & 128)/128) = '00101000'
            or convert(varchar,+ (c.status & 1)/1)
               + convert(varchar,(c.status & 2)/2)
               + convert(varchar,(c.status & 4)/4)
               + convert(varchar,(c.status & 8)/8)
               + convert(varchar,(c.status & 16)/16)
               + convert(varchar,(c.status & 32)/32)
               + convert(varchar,(c.status & 64)/64)
               + convert(varchar,(c.status & 128)/128) = '00100100')

      end
   else if @SqlVersion = '2008'
      begin
      insert into #Constraint  (Name, col, definition)
         select c.name,  col_name(parent_object_id, parent_column_id), definition
         from sys.check_constraints c
            inner join #Tables t on t.object_id = c.parent_object_id
         where t.id = @i
         order by c.name
      end
   Set @maxj =   @@rowcount
  
   set @j = 1
   if (@maxj >0)
   begin

      print '<table border="0" cellspacing="0" cellpadding="0" width="750px"><tr><td><b>Check  Constraints</b></td></tr></table>'
      print '<table border="0" cellspacing="1" cellpadding="0" width="750px"><tr><th>Sr.</th><th>Name</th><th>Column</th><th>Definition</th></tr>'

      While(@j <= @maxj)
      begin

         select @Output = '<tr><td width="20px" align="center">' + Cast((@j) as varchar) + '</td><td width="250px">' + isnull(name,'')  + '</td><td width="150px">' +  isnull(col,'') + '</td><td>' +  isnull(definition,'') + '</td></tr>'
            from #Constraint  where id = @j
         print @Output
         Set @j = @j + 1;
      end

      print '</table><br />'
   end


   --Triggers
   truncate table #Constraint
   if @SqlVersion = '2000'
      begin
      insert into #Constraint  (Name)
         select tr.name
         FROM sysobjects tr
            inner join #Tables t on t.object_id = tr.parent_obj
         where t.id = @i and tr.type = 'TR'
         order by tr.name
      end
   else if @SqlVersion = '2008'
      begin
      insert into #Constraint  (Name)
         SELECT tr.name
         FROM sys.triggers tr
            inner join #Tables t on t.object_id = tr.parent_id
         where t.id = @i
         order by tr.name
      end
   Set @maxj =   @@rowcount
  
   set @j = 1
   if (@maxj >0)
   begin

      print '<table border="0" cellspacing="0" cellpadding="0" width="750px"><tr><td><b>Triggers</b></td></tr></table>'
      print '<table border="0" cellspacing="1" cellpadding="0" width="750px"><tr><th>Sr.</th><th>Name</th><th>Description</th></tr>'

      While(@j <= @maxj)
      begin
         select @Output = '<tr><td width="20px" align="center">' + Cast((@j) as varchar) + '</td><td width="150px">' + isnull(name,'')  + '</td><td></td></tr>'
            from #Constraint  where id = @j
         print @Output
         Set @j = @j + 1;
      end

      print '</table><br />'
   end

   --Indexes
   truncate table #Indexes
   if @SqlVersion = '2000'
      begin
      insert into #Indexes  (Name, type, cols)
         select i.name, case when i.indid = 0 then 'Heap' when i.indid = 1 then 'Clustered' else 'Nonclustered' end , c.name
         from sysindexes i
            inner join sysindexkeys k  on k.indid = i.indid  and k.id = i.id
            inner join syscolumns c on c.id = k.id and c.colorder = k.colid
            inner join #Tables t on t.object_id = i.id
         where t.id = @i and i.name not like '_WA%'
         order by i.name, i.keycnt
      end
   else if @SqlVersion = '2008'
      begin
      insert into #Indexes  (Name, type, cols)
         select i.name, case when i.type = 0 then 'Heap' when i.type = 1 then 'Clustered' else 'Nonclustered' end,  col_name(i.object_id, c.column_id)
            from sys.indexes i
               inner join sys.index_columns c on i.index_id = c.index_id and c.object_id = i.object_id
               inner join #Tables t on t.object_id = i.object_id
            where t.id = @i
            order by i.name, c.column_id
      end

   Set @maxj =   @@rowcount
  
   set @j = 1
   set @sr = 1
   if (@maxj >0)
   begin

      print '<table border="0" cellspacing="0" cellpadding="0" width="750px"><tr><td><b>Indexes</b></td></tr></table>'
      print '<table border="0" cellspacing="1" cellpadding="0" width="750px"><tr><th>Sr.</th><th>Name</th><th>Type</th><th>Columns</th></tr>'
      set @Output = ''
      set @last = ''
      set @current = ''
      While(@j <= @maxj)
      begin
         select @current = isnull(name,'') from #Indexes  where id = @j
               
         if @last <> @current  and @last <> ''
            begin  
            print '<tr><td width="20px" align="center">' + Cast((@sr) as varchar) + '</td><td width="150px">' + @last + '</td><td width="150px">' + @typ + '</td><td>' + @Output  + '</td></tr>'
            set @Output  = ''
            set @sr = @sr + 1
            end
        
           
         select @Output = @Output + cols + '<br />' , @typ = type
               from #Indexes  where id = @j
        
         set @last = @current   
         Set @j = @j + 1;
      end
      if @Output <> ''
            begin  
            print '<tr><td width="20px" align="center">' + Cast((@sr) as varchar) + '</td><td width="150px">' + @last + '</td><td width="150px">' + @typ + '</td><td>' + @Output  + '</td></tr>'
            end

      print '</table><br />'
   end

    Set @i = @i + 1;
   Print @Output
end


Print '</body>'
Print '</html>'

drop table #Tables
drop table #Columns
drop table #FK
drop table #Constraint
drop table #Indexes
set nocount off

----------
간단하게 보려면 아래의 쿼리 실행
SELECT TABLE_NAME, ORDINAL_POSITION, COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, IS_NULLABLE, COLUMN_DEFAULT
FROM INFORMATION_SCHEMA.COLUMNS
ORDER BY TABLE_NAME, ORDINAL_POSITION


반응형

'삽질로그' 카테고리의 다른 글

외장 HDD FAT32로 포멧하는 방법  (0) 2010.01.04
TortoiseSVN 초보자 가이드  (3) 2010.01.03
원격지원을 위한 SW  (1) 2009.12.16
원격지원 Tool TeamViewer  (0) 2009.12.15
TOAD 한글깨질때  (0) 2009.12.06
반응형
<html>
<frameset rows="1*">
   <frame name="main" src="http://dev.abydos.kr/">
</frameset>
</html>
Inline Translator가 로드되지 못했습니다. 다시 시도하시려면 새로고침해주세요.
반응형

'개발도 하냐?' 카테고리의 다른 글

CakePHP Framework  (0) 2010.06.09
editplus setting  (0) 2010.06.06
SI프로젝트 산출물  (0) 2009.12.14
BitTorrent 의 정리  (0) 2009.12.12
SI개발자 발전단계  (0) 2009.12.06
반응형

PCAnywhere (http://www.symantec.com/region/kr/product/pcanywhere/pca11.0/) 유료
- 리눅스, 맥, 윈도우 지원

Radmin (http://www.radmin.co.kr) 유료
- 상당히 빠른 속도, 윈도우만 지원.

myDesk (http://mydesk.co.kr) 무료
원격제어 프로그램은 아니지만 파일을 공유하는 개념에서 시작되는 프로그램이며, 여러종류의 컴퓨터들안에 있는 (심지어 PDA까지도) 파일들을 공유하고 실행할 수 있다. 한번 써볼만한 프로그램.

UltraVNC (http://ultravnc.com)무료
- 상당히 깔끔하고 좋은 프로그램. 원하는 기능은 플러그인 형태로 제공되기때문에 설치를 하기만 하면 되며 무료

파란 pc원격 접속 (http://pccontrol.paran.com/new/default.jsp)
- 웹기반의 원격제어 홈페이지.

TeamViewer (http://www.teamviewer.com) 무료
- server 에 설치하기위해서는 상용버전을 써야한다
- 설치가필요없는 한글포터블버전
반응형

'삽질로그' 카테고리의 다른 글

TortoiseSVN 초보자 가이드  (3) 2010.01.03
MSSQL 테이블명세 출력용 쿼리  (0) 2009.12.28
원격지원 Tool TeamViewer  (0) 2009.12.15
TOAD 한글깨질때  (0) 2009.12.06
웹폰트 적용시키기  (0) 2009.11.27
반응형
원격지원 도구
- 네트워크와는 거의 관계없이 지원이 가능한 프로그램을 소개한다.

장점
1. 무료
2. 네트워크 영향을 덜 받는 다.
3. 연결이 쉽다.
4. 가입이 필요없다.
5. 별도의 설치가 없다.
6. 여러 OS 지원 가능

단점
1. 기업용인 경우는 무료가 아니다.

http://www.teamviewer.com/

다운로드한 파일을 실행하면 설치 혹은 실행을 묻는 데 그냥 실행하면 된다.

아래 그림처럼 방화벽이 있는 경우는 방화벽 해제를 하면

아래 그림처럼 준비 상태가 되며

도움을 요청한 사용자는 자신의 ID와 Password를 도와줄 Assistant에게 불러 주면 자동으로 접속된다.

반응형

'삽질로그' 카테고리의 다른 글

MSSQL 테이블명세 출력용 쿼리  (0) 2009.12.28
원격지원을 위한 SW  (1) 2009.12.16
TOAD 한글깨질때  (0) 2009.12.06
웹폰트 적용시키기  (0) 2009.11.27
회사 svn, trac 설정  (0) 2009.11.25
반응형
1. 분석
   1.1. 현업요구사항정의서
        : 해당 프로젝트를 수행하는 가장 기본이 되며 고객의 needs을 담고 있는 문서입니다.
          이를 통해 다양한 스펙산정이 가능합니다. 이부분에서 요구ID를 도출합니다.
   1.2. 기능챠트
        : 현업요구사항을 근간으로 큰 카테고리를 만들어 한눈에 해당 프로젝트가 무슨 일을 하는
          것인지 보여줄 있습니다.
          * 이부분은 개발방법론에 따라 유스케이스다이어그램으로 대치할 수도 있을 것으로
            판단되어지고, 기능챠트와 같이 가도 무관하다는 판단입니다.
   1.3. 프로세스 정의서
        : 기능챠트를 기준으로 각각의 프로세스를 보여줍니다. 때에 따라 확대된 프로세스의
         표현도 가능합니다.
         * 개발방법론에 따라 시퀀스다이어그램을 넣어도 무방하다는 판단입니다.
   1.4. 인터페이스정의서
        : 상기 현업요구사항정의서,기능챠트,프로세스정의서를 근간으로하여 레가시 및 대외계
          시스템, 웹서비스 등 어떤식으로 인터페이스를 해야 한다는 정의를 담고 있습니다.
   1.5. 기타

2. 설계
   2.1. UI(화면)설계서
        : 웹App 혹은 CS App 든 간에 고객이 사용하고자 하는 화면단을 보여주는 문서입니다.
   2.2. ERD
        : 해당 업무의 DB를 생성하고 테이블관의 상관 관계를 표현하는 문서로 더이상 설명이
          필요없으리라 믿습니다.
   2.3. 테이블목록
        : 테이블정의서도 있지만, 테이블목록은 관리자가 한눈에 시스템을 구성하고 있는 DB
          테이블을 보여준다는 측면에서 필수라는 판단입니다.
   2.4. 테이블정의서
        : 테이블필드 value와 설명, 바이트수 등을 표기합니다.
   2.5. 프로그램 목록
        : 실직적으로 설계단계에 프로그램목록이 나오지 않지만 일단 설계 단계에 넣는 것이
          타당한 것 같습니다.
          * 개발방법론에 따라 클래스다이어그램, 컨포넌트명세서, 클래스정의서 등도 포함 될 수
            있을 것 같습니다.
   2.6. 개발표준 정의서
        : 변수명, brace, 클래스네임,파일명,규칙등 코딩관련 규칙을 정의함으로써 일선 담당자가
          소스코드를 확인해도 눈에 익숙할 수 있게 하기위한 문서입니다.
   2.7. 단위테스트 시나리오
        : 분석,설계의 기본적인 요건이 충적되면 이쯤하여 단위테스트시나리오가 나와야 할 것
          같습니다. 아마도 고객의 싸인이 필요한 부분일 것입니다.
   2.8. 통합테스트 시나리오
        : 설계단에서 하기는 많은 어려움이 있지만, 단위테스트를 근간으로 고객의 요청을 좀더
          보완하여 통합테스트시나리오를 작성합니다. 고객의 싸인은 필수입니다.
   2.9. 기타
 
3. 개발
   3.1. 소스코드(개발원시코드)
        : 말그대로 오류수정까지 끝난 원시코드 자체를 말합니다.
   3.2. 단위테스트 결과서
        : 단위테스트시나리오를 기준으로 테스트한 결과를 보여줍니다. 아마도 많은 문제점을
          안고 있고, 이 과정을 통해 고객의 요구사항도 많은 변동이 있는 시점입니다.
          * 변경요청서도 필요할 시점입니다.
   3.3. 결함/오류보고서
        : 단위테스트를 통해 알게된 에러의 원인과 수정에 대한 내용을 나타냅니다.
          이를 통해 오류코드정의서를 뽑아내고 보완합니다.
   3.4. 오류코드 정의서
        : 해당시스템에서 발생할 수 있는 오류들을 코드화하여 보여줍니다.
   3.5. 통합테스트 결과서
        : 단위테스트를 통해 보완된 내용들을 포함하고, 통합테스트시나리오의 보완을 통해
          실시된 통합테스트 결과를 보여줍니다. 개발을 완료했냐 안했냐의 잣대가 되는 문서로서
          고객의 싸인이 가장 필요한 부분입니다. 이부분에서 반려가 일어나면 위의과정을 반복해야
          합니다.
   3.6. 시스템 이행계획서
        : 통합테스트가 끝나면 Standby하고 있는 시스템에 소프트웨어,하드웨어 기타 등을 몇월,
          며칠, 몇시에 누구누구가 무엇을 가지고 옵져버는 누구이며 어떻게 이행을 할 것인지
          등을 표현합니다.
   3.7. 기타
 
4. 구현
   4.1. 시스템 이행결과서
        : 시스템 이행계획서를 통해 이행된 결과를 확인받는 문서입니다.
   4.2. 사용자매뉴얼
        : 사용자화면이 있을 경우 나오는 매뉴얼입니다.일반적인 조작법을 기록하며, 화면 등을
          예시합니다.
   4.3. 운영자매뉴얼
        : 시스템전반에 관한 모든 내용을 담고 있습니다. 분석,설계,개발 절차에서 나오는 문서를
          담고 있습니다.
   4.4. 교육(인수)명세서
        : 사용자매뉴얼 및 운영자매뉴얼을 중심으로 해당 담당자 및 사용자에게 시스템전반 및
          세부사항을 교육/인수한후 싸인받는 문서입니다.
   4.5. 개발산출물별 검사리스트
        : 예시된 산출물들이 이상없이 인수되었는지를 개별로 체크한후 고객의 싸인을 받는
          문서입니다.
   4.6. 프로젝트 완료보고서
        : 최종적으로 개발한 내용, 인도물, 하드웨어, 고객대표, 개발자대표싸인을 받음으로써
          명실상부한 프로젝트 완료보고서입니다.
   4.7. 기타
 
반응형

'개발도 하냐?' 카테고리의 다른 글

editplus setting  (0) 2010.06.06
hidden frame  (0) 2009.12.27
BitTorrent 의 정리  (0) 2009.12.12
SI개발자 발전단계  (0) 2009.12.06
무능력한 개발자  (0) 2009.12.06
반응형

출처 : http://www.torrentdown.com/bbs/board.php?bo_table=in_co_ta&wr_id=763&sca=&sfl=&stx=&spt=&page=9


비트토렌트란 무엇인가?

 

BitTorrent(비트토렌트)는 개인들간 피어투피어(peer-to-peer)로 연결하여 대용량 파일을 빠

른 속도로 공유하도록 만들어진 프로토콜이다. 트래커(tracker)라 불리는 중앙 서버가 사용자들간

의 파일 교환을 조정해 준다. 트래커는 사용자간의 연결만을 도와 줄 뿐이며 공유되는 파일의 내

용에 대한 정보는 취급하고 있지 않기 때문에 비교적 적은 대역폭으로도 많은 수의 사용자간의 파

일공유를 가능하게 해준다.
 
토렌트의 핵심 철학은 사용자들이 파일을 업로드 해 주어야만 다운로드 할 수 있다는 것이다.

즉 자신의 다운로드 속도는 자신의 업로드 속도에 비례한다. (이는 당나귀(eDonkey)를 이용해본

사람들은 잘 이해할 것이다.) 이렇게 함으로써 네트워크 대역폭을 가장 효율적으로 이용할 수 있

으며 특정 파일을 다운하고자하는 사람들의 숫자가 늘면 늘수록 토렌트를 통한 파일 공유의 효율

은 더 증가하게 되는 것이다.

 

 

 

비트토렌트는 어떻게 작동하는가?

 

비트토렌트를 이용해서 파일을 공유하려면 3가지가 필요하다.

(1) 비트토렌트 클라이언트, 즉 다운로드 프로그램,

(2) 공유 파일의 정보를 내장하고 있는 토렌트 파일 (확장자가 .torrent로 끝나는 파일)

(3) 클라이언트에게 파일의 소스의 위치를 추적(track)해 주고, 각 클라이언트간 파일의 업로드와
다운로드를 조정해 주는 트래커(tracker). 트래커는 당나귀 네트워크에서 중앙 서버의 역할을 해

준다.

 

비트토렌트 클라이언트는 당나귀 클라이언트와 달리 독자적으로 오픈되지 않는다.

즉, torrent 파일을 클릭하지 않는 이상 비트토렌트 클라이언트는 항상 비활성 상태로 있게 된다.


http://www.suprnova.org

 같은 토렌트 정보 사이트에 올라와 있는 토렌트 파일을 클릭하거

나 이미 자신의 컴퓨터에 다운로드 받아놓은 토렌트 파일을 클릭하면 비로소 비트토렌트 클라이

언트는 활성화되어 다운로드와 업로드 기능을 수행한다. 즉, 토렌트파일이 없는 경우는 작동하지

않는 것이다. 혹 시작메뉴에 있는 비트토렌트 클라이언트를 클릭하면 클라이언트는 토렌트 파일

을 열것을 요구한다. 토렌트 파일이 없으면 비트토렌트 클라이언트는 자동으로 다시 닫히게 된다.

 

트래커는 동일한 토렌트 파일(즉, 동일한 hash code를 가지고 있는 토렌트 파일)을 오픈한 사

람들끼리만 연결시켜 준다. 만일 내가 2개의 서로 다른 트래커에 등록된 2개의 토렌트 파일을 오

픈시켜 2가지 다른 파일을 동시에 다운로드 받고 있다고 한다면 (예를들

어,Lord.of.the.Rings.3.Screener.3CD.torrent와 Kill.Bill.Screener.2CD.torrent를 이용하여 두 영

화를 동시에 다운하는 경우),

내 컴퓨터에는 두개의 비트토렌트 클라이언트가 오픈 되어 서로 다른

트래커와 연결 되어 파일을 다운로드/업로드하고 있을 것이다. 이점이 비트토렌트가 당나귀 네트

워크와 가장 크게 다른점이다.

즉, 당나귀 네트워크는 서버 중심의 파일공유 시스템인데 반해, 비트토렌트 네트워크는 트래커가

중심이 아니라, 공유되는 파일을 중심으로 네트워크가 형성되는 것이다.

즉, 당나귀의 경우는 서버접속 --> 서버에게 다운받을 파일의 소스의 위치와 숫자 문의 --> 서버

가 소스파악/다운로드/업로드 조정의 순서로 일처리를 한다면, 비트토렌트의 경우는 토

렌트 파일 오픈 --> 지정된 트래커 접속 --> 트래커의 다운로드/업로드 조정의 순서로 일이 처리

되는 것이다.
 
따라서 비트토렌트의 경우는 토렌트 파일을 매개로 공유되는 특정 파일에 관심이 있

는 사람들끼리만 연결시켜 줌으로써 트래커가 소스를 찾기 위해 시간을 허비하지 않아도 되는 것

이다. 이런 이유로 당나귀 네트워크와 비교한다면, 당나귀는 중앙 네트워크 방식인 반면에, 비트

토렌트는 분산 네트워크 방식이라고 불리워지는 것이다.

 

비트토렌트의 분산 네트워크 방식은 당나귀에 비해서 빠른 연결과 다운로드/업로드 조정을 함

으로써 파일 공유 속도가 빠른 반면에, 네트워크의 안정성이 매우 약하다. 즉, 공유 네트워크가 특

정 파일에 관해 관심을 가진 사람들 위주로 분산적으로 형성되기때문에, 시간이 지남에 따라 파일
공유자의 숫자가 줄어 들면, 그만큼 특정 파일의 공유 네트워크의 폭이 줄어드는 것이다.

즉, 비트토렌트 네트워크는 생성되고 소멸되는 주기가 굉장히 짧은 일종의 게릴라식 네트워크라

는 것이다.

이 때문에 비트토렌트를 이용하여 오래전에 공유되었던 파일을 다운로드하기란 정말 어렵다.

최초로 공유된지 한달정도 지난 파일의 경우, 인기 있는 파일이어서 계속 공유자들이 릴레이 되지
않는 이상, 그 소스를 찾기란 당나귀처럼 쉽지 않다.

그대신 많은 사람들이 동시에 관심을 가지고 있는 최신의 파일인 경우는 동시에 많은 사람들이 공

유하기 때문에 쉽고 빠르게 다운로드 할 수 있다. (하지만 최근에는 비토렌트 서치엔진


http://www.n4p.com 같은 것이 등장하고, 또 트래커의 안정성이 예전보다 향상되고 있기 때

문에, 파일 공유주기가 예전에 비해 점점 늘어나고 있는 추세이다. 따라서 비트토렌트 네트워크를
통해서 구할 수 있는 파일의 숫자가 엄청 늘어나고 있음.)

 

 

 

비트토렌트가 당나귀와 다른 점은 무엇인가?

 

비트토렌트는 당나귀 네트워크와 같이 파일을 조각내어 공유한다는 면에서는 파일 공유 방식

이 동일하다. 하지만 동일한 조건이라면 (즉, 소스를 가지고 있는 사람의 수와 인터넷 회선의 속

도가 같은 경우) 당나귀 네트워크보다 다운로드 속도가 훨씬 더 빠르다.

왜냐하면, (1) 파일의 소스를 추적(track)하여 원하는 사람에게 연결시켜 주는 당나귀 네트워크의
중앙 서버 역할을 하는 트래커(tracker)는 파일의 내용에 관한 정보를 포함하고 있지 않기 때문에,
파일 공유 조정(coordination)에 필요한 정보량이 당나귀네트워크 방식보다 훨씬 적어서 다운로

드하려는 사람과 업로드 하는 사람간의 연결 속도가 더 빠르기 때문이다.

(2) 파일 찾기 기능이 없는 것이 단점이기는 하지만 이것 또한 다운로드 속도가 당나귀에 비해 빠

른 이유 중에 하나이다. 당나귀와는 달리, 비트토렌트는 이미 설명했듯이 분산 네트워크 방식을

취한다. 즉 트래커는 오직 하나의 공유 단위(단일 파일일 수도 있고 여러개의 파일을 포함한 디렉

토리일 수도 있음)에 관심이 있는 사람들끼리 연결을 시켜준다.

(3) 트래커가 파일조각 (file parts)을 연결된 클라이언트들에 배분할 때 따른 클라이언트가 받지

않은 조각들을 우선해서 배분해 준다. 즉, 각 클라이언트들에게 서로 다른 조각들을 우선해서 배

분해주므로, 각 클라이언트가 같은 조각을 받기 위해 대기하는 시간을 최소화 해주고, 또한 각 클

라이언트간에 서로 다른 파일 조각들을 교환하게 함으로써 최단 시간내에 파일 공유를 극대화시

켜준다.

(4) 또한 비트토렌트는 당나귀에 비해 리소스를 훨씬 적게 사용하기 때문에, 비트토렌트 사용 중

컴퓨터가 느려진다거나 하는 일이 없으므로 다른 프로그램을 사용하는데에 큰 지장이 없다.

 

그 대신 비트토렌트의 경우는 당나귀와 같은 검색 기능이 없다. 당나귀의 경우는 사용자가 다

운로드 받은 파일을 공유 폴더에 넣어 두기만 하면 자신은 다른 파일을 다운 받더라도 그것을 원

하는 사람이 서버를 통해서 계속해서 그 파일을 다운 받을 수 있지만 (즉, 업로드/다운로드 파일

이 다를 수 있지만), 비트 토렌트의 경우는 소스를 가진 사람이 토렌트 파일을 오픈시켜 놓지 않

는 이상 (이를 seeding이라 한다. 즉, 완전체를 가진 사람이 업로드만 해주는 경우, 이를 시딩이

라고 한다.) 파일의 소스를 구할 수는 없는 것이다. (제작자 Bram Cohen의 설명에 의하면seeder

(완전체를 가진 사람)가 없더라도 각 클라이언트들이 가진 서로 다른 파일 조각들의 합이 100 퍼

센트이면 seeder없이도 파일을 100퍼센트 받을수 있다고 함.)

 

파일 검색 기능이 없는 것이 비트토렌트의 불편한 점이기는 하지만, 무수히 많은 공유 사이트

를 통해서 많은 사람들이 관심을 갖고 있는 최신 파일(영화/게임/애니/유틸 등등)을 구하기란 어

렵지 않다.

 

당나귀를 어느 정도 사용한 사람이라면 몇시간, 아니 몇일동안 다운받은 파일이 가짜(페이크)

로 드러나, 허탈해서 화가난 적이 한번쯤은 다 있을 것이다. 하지만, 토렌트 네트워크에서는 가짜

파일이 거의 없다.

 

당나귀의 경우는 다운로드하는 파일과 업로드 하는 파일이 다를 수 있다. 하지만 비트토렌트

의 경우는 2개 이상의 토렌트를 오픈시키지 않는 이상, 다운로드와 업로드하는 파일이 다를 수 없

다. 즉, 특정 토렌트 파일을 오픈시키면 자신이 그 토렌트에 담겨있는 파일을 다운로드하고 동시

에 업로드하는 것이다.

 

당나귀의 경우 공유 단위가 단일 파일인 반면, 비트토렌트는 공유 단위가 파일뿐만 아니라 복

수의 파일을 포함한 디렉토리도 포함된다. 즉, 당나귀 네트워크에서는 복수의 파일을 공유할 경우
압축을 하거나 시디 이미지로 만들어서 1개의 파일로 만들어야만 공유가 가능하지만, 비트토렌트

에서는 자신의 하드에 있는 디렉토리 자체를 하나의 토렌트 파일에 담아서 공유가 가능하다. 물론
별도로 토렌트 파일을 만들어야 하는 번거로움이 있기는 하지만, 공유를 위해 여러개의 파일을 단

일 파일로 압축을 하거나 하나의 시디 이미지로 만들 필요가 없다는 것이다.

 

 

 

그럼 언제 어떤 용도로 비트토렌트를 사용하는것이 좋은가?

 

위에서 살펴보았듯이, 토렌트는 당나귀에 비해 빠른 다운속도라는 장점이 있는 반면, 네트워

크의 안정성, 파일 검색 기능, 오래된 파일을 구하기 힘든점 등의 단점이 있다. 그리고 아직 한국

에서는 쓰는 사람이 많지 않기 때문에 한국 관련 파일도 많이 공유되고 있지 않다. 따라서 현재로

서는 최근에 외국에서 새로 나온 영화/게임/음악/유틸/등등을 다운 받는 경우에 사용하면 당나귀

보다 훨씬 빠른속도로 다운 받을 수 있으리라고 생각된다. 당연한 말이겠지만, 한국 사용자가 늘

면 늘수록 한국 관련 파일들도 비트토렌트를 통해서 구할 수 있게 되리라고 본다.


용어정리

업/다운로드 받을때 나오는 메뉴에 대해 간략하게 설명 드리겠습니다
 
이름    번    크기    완료  상태    배포  피어  다운속도  예상시간  업로드    비율  가용
 
 
 
이중에 이름/번/크기/완료/상태 까지는 누구나 다 아실테고
배포 부터 설명 드리겠습니다
 
* 배포(seeds) -    X (Y)
 
여기서 X 는 자신에게 달라붙은 완전체 값입니다
즉, 100% 인  사람이 몇명이 나에게 화일을 보내주고 있냐 입니다
 
Y 는 현재 온라인 상의 총 완전체 갯수입니다
Y 가 0 이면 완전체가 현재 없다는 것이죠
 
  만약, 자신이 직공으로 화일을 최초 공유 하는 사람이거나 다운이 완료되어 배포자가 되었다면
X 값은 항상 0 입니다
왜냐하면 자신에게 화일을 받아 완료..즉, 100%가 되는순간 그사람은 배포자가 되어
(Y 값이 1증가) 나에게서 떨어져 나가게 되기 때문입니다... 100%를 가지고 있는 사람끼린
서로 화일을 주고 받을 일이 없기때문에... 붙을 필요가 없는것이죠
또... 만약... 어떤사람이 최초 공유자에게서 화일을 받아
다운로드 완료가 되었는데... 토렌트 상의 Y값이 1 증가하지 않는다면
그사람은 다운만 받고 공유를 꺼버린게 되는것이죠
 
직공을 해서 최초 공유를 하다보면 X값은 항상 0이고 Y값이 시간이 흐름에 따라 점점 증가하는것을 보게되고
다운받는 입장이라면... 접속하여 다운되는 순간 X값과 Y값은 일정한 수치를 이미 가지고 있는것을 볼수 있습니다
 
*피어(peers) - A (B)
 
A는 자신에게 붙은 모든 사람을 뜻합니다. 
내게서 다운을 받아가건... 내게 화일소스를 보내주건, 완전체이건.. 받고있는 도중이건....
나와 관계된 사람은 모두 A숫자에 포함됩니다
 
B는 완료된 사람(완전체)을 제외한 이 화일에 관계된 모든 사람을 뜻합니다
나와 관계없고... 서로 지들 끼리 주고받아도... 나와 같은 화일을 주고 받는것이라면
이 숫자에 포함 됩니다
 
*업로드
 
자신이 토랜트를 통해서 여러사람에게 보내준
화일에 대한 총 용량 입니다
다시말해 업로드 양이죠
 
*비율(ratio)
 
화일의 총 용량과... 자신이 업로드한 양에 대한 비율입니다
곱하기 100을 하면 % 값이 나온다고 생각 하심 됩니다
 
*가용(avail)
 자신과 위에 얘기한 A,B들이 현재 가지고있는 소스들을 주고받으면 몇개의
완전체를 만들수 있냐는 소리입니다
 
만약, 자신이 화일을 최초 공유하는 소스라면
공유를 시작하는순간 가용은 1부터 시작합니다
자신이 완전체 이기 때문에 백분율로 따지자면 곱하기 100을 해서
100프로 부터 시작하는것이죠
 
자신이 업로드를 하다보면 배포값 즉 X,Y가 모두 0 일경우라도(완전체가 나 외엔 존재하지 않을경우)
 가용이 2.000 (200%) 가 넘어가 버리면
내가 공유를 끊더라도... 자기들끼리 서로 주고 받아서 완전체를 만들수 있다는 뜻입니다
그러니... 공유를 하다가 2가 넘어가 버리면 공유를 끊고 나와버려도... 계속 완전체가 공유 된단 소립니다...
즉.. 최초 공유를 할때 Y가 1이상이 되거나 가용이 2 이상이 되면 공유를 끊어도 된다는 것이죠
물론 최초 다운로드 완료자가 공유를 끊고 나가지 않는다는 전제하에서말이죠
 
또, 다운자 입장에서...자기가 다운을 받으러 들어갔는데... 완전체가 한명도 없이...
가용이 1이 넘는다면
배포자가 없어도 화일을 끝까지 다 받을수 있다는 얘기입니다
반대로, 배포자(Y)도 0 이고....가용이...0.899  이렇게 되있다면
이화일은 89프로에 까지밖에 받을수 없는 화일입니다
물론 받는 도중..... 완전체가 나타나 마저 공유가 된다면
끝까지 받을수 있겠죠

반응형

'개발도 하냐?' 카테고리의 다른 글

hidden frame  (0) 2009.12.27
SI프로젝트 산출물  (0) 2009.12.14
SI개발자 발전단계  (0) 2009.12.06
무능력한 개발자  (0) 2009.12.06
자바개발시 점검사항  (0) 2009.12.06
반응형
1. 조회시 한글이 깨질때는 NSL_LANG을 설정해준다.

NLS_LANG = KOREAN_KOREA.KO16MSWIN949




2.엑셀로 데이터를 출력받는데 한글이 깨진다면 toad.ini 파일을 수정하거나 옵션에서 Write wide string 를 체크



8.X의 버전이라면 설치된 디렉토리안의 User Files 디렉토리에서 toad.ini 파일을 찾아 아래의 부분을 추가해준다.

[SAVEAS]
XLSWideStrings=1

반응형

'삽질로그' 카테고리의 다른 글

원격지원을 위한 SW  (1) 2009.12.16
원격지원 Tool TeamViewer  (0) 2009.12.15
웹폰트 적용시키기  (0) 2009.11.27
회사 svn, trac 설정  (0) 2009.11.25
DOM XML ticker  (0) 2009.11.24
반응형
  1. 뉴비 : 막 졸업했거나 학원수료. "취업좀.."

    • "이바닥은 학력보다는 실력이다" 라는 이상한 믿음. "어떤게 전망이 좋나요?"가 늘 궁금하다.
    • 자바는 Copy & Pastes 하니깐 쉽다. 자바스크립트는 어렵다.
  2. 개초보 : 1년 정도 경험. 템플릿 주면 대충 알아서 만드는 단계. 프레임웍을 이해하고 다루는데는 미숙.

    • 중수랑 하는게 비슷한데 연봉은 적다고 불만임. 프리랜서 하고싶음. 도메인 업무보다는 코딩테크닉을 하고싶어함.
    • 내 꿈은 아키텍쳐. 현재 진로방향은 막연히 DBA.
  3. 초수 : 프레임웍에 대한 의문과 회의가 들기 시작함. 간단한걸 왜 복잡하게 돌려 하는지 모르겠음. 디자인 패턴은 다 개소리임.

    • "이바닥 별거 없는데.. 거품이 너무 많다." , "웹은 SQL이 절반 이상이다." 현재 회사에 불만가득.
    • 고만고만한데서 실력있다는 소리를 자주 듣는다. (이때는 잘 모른다. 이게 작업용 멘트라는것을..)
    • SQL에는 자신있는 단계. 어떤 복잡한 SQL도 업무만 안다면 작성 및 튜닝 가능.
  4. 중수1단계 : 고수/또는 체계화된 플젝의 도움을 받아 프레임웍의 진가를 알게됨. 오픈소스를 효율적으로 사용. 

    • 자신감이 넘침. 신기술 사용에 적극적. 프레임웍에 서툴거나 자신과 생각/사상이 다르면 까기 시작함. 적극적인 블로깅/자기PR
    • 현재의 프로세스에 문제가 있다고 판단 => 고칠 수 있고 고치려는 의지가 있음.
    • 익명 클래스와 command패턴, 클로저 등이 자연스러워지고 새로운 프레임웍이 나와도 금방 적응 가능.
  5. 중수2단계 : 나는 팀의 리더.  아무리 잘나봐야 똑같은 대우라는걸 알게됨. 의욕상실. 기존 개발자들의 반발. 현실은 시궁창.

    • 드림팀을 꾸리고 싶음. PM을 해야할거같은 상부의 압박. 결국 사람이 가장 어렵다는걸 깨닳음.
    • 현재의 프로세스에 문제가 있다고 판단한지 오래지만 어쩔 수 없다고 생각. "기술 보다는 영어좀 해둘껄" 하는 생각이 간절함. 책 내고 싶음.
    • 코딩과 프로세스를 도와주는 각종 Tool에 관해 능숙함. 중/소규모 실제 프로젝트에 적용 가능한 아키텍쳐 구성 가능 및 가능한 지위
  6. 중수3단계 : 프로젝트 내의 기술적 우위로 팀/회사에서의 확고한 지위.

    • 솔로플레이에 능함. 기술의 도입으로 내가 가지는 득실을 중요히 생각하게 됨. 손해보는 짓은 안함.
    • ORM에 익숙하고 거기에 따른 설계 가능. 그루비나 루비 같은 동적 객체지향 언어로 매니악한 코드 만드는것을 즐김.
  7. 고수 : 프리랜서로 전환. 생산성에 치중함. 유지보스는 안드로메다.

    • 너무 잘하지도, 못하지도 않는 중용을 발휘함. 별로 하는거 없어보여도 절대로 뺄수 없는 그런 존재.
    • "만 라인의 코드를 작성하는 이와, 일의 공허함을 깨닫고 코딩 없이 성과를 얻는 이중에서 누가 보다 유닉스 같은가?" by 에릭 레이몬드.
    • 플젝을 떠돌며 모아놓은 jar와 모듈들이 가득함. 손수 짜는거 보다 import하는게 익숙함. 오픈소스를 수정/확장해서 사용하는데 능숙.
  8. 신 : 다 무의미 하다는걸 깨달음. 따르는 자가 있지만 정치를 하기 싫어서 물좋은 SM자리 하나 얻어서 남은 여생을 운둔하며 보냄.

    • "마음이 가는데로 코딩을 했는데도 리팩토링할 곳이 없더라"

http://erwins.springnote.com/pages/3759175

반응형

'개발도 하냐?' 카테고리의 다른 글

SI프로젝트 산출물  (0) 2009.12.14
BitTorrent 의 정리  (0) 2009.12.12
무능력한 개발자  (0) 2009.12.06
자바개발시 점검사항  (0) 2009.12.06
한국에서의 개발방법론이란..  (0) 2009.12.06
반응형
  1. 출처 - okJsp
  2. 첫째는 '열심히 하지만 결과를 쓸 수 었을 때'입니다. 2~3주 하루 12시간씩 작업한 결과물이 아무리 좋게 보아도 변수명 바꾼 것에 불과한 듯이 보이는 상황을 대하게 되면 화를 내야하는지 그냥 포기하고 혼자 끙끙거리며 모르게 다시 만들어야 하는지 간간 깊은 고민에 빠집니다. 불행하게도 저는 마음 크기가 종지만해 화를 내는 쪽이긴 합니다만, 그나마 화를 내어 놓고도 일정 때문에 제가 손을 보곤 합니다.
  3. 둘째는 '자부심은 강하지만 결과과 이상할 때'입니다. 스킬에 대한 중요성, 관련 경험, 학습 내용 들에 대한 자긍심이 굉장한데 비하여, 내어놓은 결과물은 예를들면 1줄짜리 쿼리를 10줄로 만들어둔데다 원하는 결과도 도출되지 않는 상황인 경우입니다. 함부로 의사를 전하면 크게 상심할까봐 참 대응하기 곤란하더군요.
  4. 셋째는 '하고 싶은 것만 한다'입니다. 박식한데다 경험도 풍부하지만, 하고 싶은 파트가 아니면 절대 하지 않으려는 경우로 몇명만이 단촐하게 일할 때는 여간 고로운게 아닙니다. 명확히 하자면 성격 또는 게으름의 문제이겠으나, 결과적으로는 능력을 보여주지를 못하니...
  5. 넷째는 '논리 결여'입니다. 재미있는 것은 이런 부류의 이들이 상대적으로 사회성도 뛰어나고 자기 자신에 대한 투자에 게으르지 않다는 것입니다. 충분한 학력과 현장 경험에도 불구하고 C & P에만 능숙해져 있는 것을 보면 차라리 다른 쪽으로 방향을 돌려보는 것도 좋지 않은지 권해주고 싶습니다.
  6. 다섯째는 '레퍼런스를 찾기 능력 결여'입니다. 농담반 진담반으로 '내 실력의 절반은 네이버와 구글이 키웠다'라고 말해도 허하게 들리지 않을 정도로 레퍼런스로 넘쳐나는 요즘임에도 불구하고 막히면 막히는 족족 포기해버리고 다른 이들의 도움을 찾는 경우로, 심하게 표현해 '귀찮다'라는 생각이 자꾸 떠오르게 됩니다.
  7. 여섯번째로 '할 수 없다고 말하기 싫어하는 자존심'입니다. 무능함과 '할수 없음'은 다르다고 생각하고, 대부분의 이들이 순수하게 현황을 이야기하면 함께 고민해보고 격려함에도 불구하고, 아무리 급박한 상황이라도 '못한다'라는 말을 꺼내지 않은체 폭발 직전까지 끌고가는 경우를 대하곤 합니다.
  8. 일곱번째로 '내일만 커보인다' 부류입니다. 남의 일은 쉬워보인다던가 하는 1차원적인 것이라면 차라리 귀여운데, 프로덕트 전체를 보지 않으려고 하며 오만해하는 경우에는 답이 없습니다. 특히나 아집이 강한 이들이 이러하다면... 전 '실력으로 눌러야한다'라는 생각으로(제가 실력이 있다는 말은 아닙니다. 허허~) 멀쩡한 척 하면서 밤세워 작업한 뒤 보여주며 '쉽던데~'라고 말하는 부류이지만, 결과적으로 이런 이들과 충돌하게 되면 나중에 다시 보지 않게 될 확률이 현재까지는 100% 더군요.
  9. 마지막으로... 위의 일부 또는 전부를 갖춘데다 '시간 투자'로 모든 것을 판단하려는 부류입니다. 결과를 도출하였다는 사실이 아닌 아주 간단히 수치화할 수 있는 시간을 얼마나 소요했는가로 판단하는 부류이지요. 이런이들이 아래 사람이라면 '나만 일한다'는 불만을 들어야하고, 윗사람이라면 '너는 왜 노냐?'라는 지적을 감수해야하며, 중간 관리자라면 '잘 가르쳐봐'라는 업무와는 전혀 무관한 교관 노릇을 감수 해야합니다.
반응형

'개발도 하냐?' 카테고리의 다른 글

BitTorrent 의 정리  (0) 2009.12.12
SI개발자 발전단계  (0) 2009.12.06
자바개발시 점검사항  (0) 2009.12.06
한국에서의 개발방법론이란..  (0) 2009.12.06
XP 개발방법론  (0) 2009.12.06
반응형
위험도 분류 설명 점수
심각 서버 소스 객체지향 인터페이스 설계 실패로 인한 각개전투 묻지마 코드.  
1. 도메인 모델을 map으로 사용.  
2. 계층, 모듈화 무시. 인터페이스 설계 없음.  
3. 비슷한 일을 하는 class가 중복으로 존재. class가 1000라인을 넘어감.  
4. 비즈니스로직의 일부 혹은 전체가 SQL or PL/SQL에 탑재  
멀티 스래드 멀티 스래드 객체의 자원 공유(static,singleton) 오류 위험  
일관된 예외 처리 1. 공통 예외처리를 위한 서버(java) & 클라이언트(javascript or actionscript) 로직이 없음.  
2. 예외 발생에도 불구하고 '성공적으로 실행되었습니다'라는 메세지가 발생.  
DB 무결성 1. FK가 잡혀있지 않음. 어플리케이션에서 무결성 관리가 되지 않음. 채번(PK)에 오류.  
2. 트랜잭션 관리가 되지 않음.  
형상관리 형상관리의 부재 : 형상관리 위한 CVS or SVN등을 사용하지 않는다.  
경고 프레임웍 도입 자체 프레임워크를 개발해서 도입 (자바One에서 나온 실패한 프로젝트의 대표적인 원인. 유지보수가 힘듬)  
MVC프레임워크를 사용하지 않음. (즉 MODEL-1 기반의 project.)  
Hibernate등의 ORM을 사용하지 않음.  
선언적 트랜잭션 또는 예외처리(레이어링 or AOP)가 없거나 도입했는데도 사용하지 않음.  
불필요한 코드 소스코드에 불필요한 try-catch문이나 트랜잭션 관련 API가 포함됨,  
단위테스트 자동화된 테스트 케이스(JUnit등)가 부족하거나 없음.  
성능 대용량 요청 등에 관해 성능을 무시한 && 병목구간을 발생시키는 코딩. SQL튜닝이 안되어있음.  
보안 기본적인 보안관리가 안되어 있음 (SQL공격, 인증우회 등등).  
클라이언트 소스 어설픈 Ajax 사용으로 인한 동기화 / 비동기화 처리 실패 인한 산발적 오류 발생  
비지니스로직의 일부가 클라이언트 스크립트로 코딩되어있음.  
DB설계미스 DB설계 미스 & 정규화 실패로 인한 잦은 join과 대량의 중복 & null컬럼 발생  
개발롼경 Ant나 Maven을 사용하지 않음.  
DB중심의 프로그래밍 업무 로직이 SQL 또는 SP에 들어가 있음. DB특유의 프로그램(pakage/function)이 자주 사용됨.  
권고 서버 코드 일반적인 표준/오픈소스 패키지를 사용하지 않고 자체 개발/코딩  
ex) Concurrent패키지의 Executor를 사용하지 않고 new Thread(runnable).start() 등의 명시적인 스래드 생성 코드를 사용.  
ex) Apache의 Util을 사용하지 않고 자체 개발한 StringUtil을 사용  
UI중심의 프로그래밍 클라이언트 스크립트의 비중이 과도하게 많음. 업무로직이 스크립트에 탑재되어 있음.  
개발 표준 네이밍 룰이 없거나 혹은 지켜지지 않음.  
Logging정책이 없거나 지켜지지 않음. (소스코드에 System.out.print... 등의 코드가 출현.)  
DB중심의 프로그래밍 PL/SQL등의 SP가 사용된적이 있음.  
성능 인덱싱 miss 및 SQL튜닝 miss로 인한 속도 저하. 어설픈/잘못된 페이징 처리.  
주석 난잡한 주석 or 필요한곳에 없는 주석 or 틀린주석(갱신이 안된 주석)  
보안 잘못된 공인인증서 사용. (클라이언트에만 인증서 로직이 들어감.)  
의존관계 정의 실패 lib에 많은 jar가 있지만 어디에 사용되는지 확인 불가.  
jar가 각기 다른 버전으로 중복해서 존재.  
서버 코드 일반적인 표준/오픈소스 패키지를 사용하지 않고 자체 개발/코딩  
ex) Concurrent패키지의 Executor를 사용하지 않고 new Thread(runnable).start() 등의 명시적인 스래드 생성 코드를 사용.  
클라이언트 소스 IE 위주의 코딩 (비표준, 마이플랫폼 등의 국산 X-internet, table레이아웃 등)  
JavaScript와 css가 html상에 섞여있음  
개발환경 지속적인 통함툴 또는 이슈 트래커를 사용하지 않음.  
FTP등을 사용하여 문서/자료를 공유함( 즉 온라인 위키 문서 공유를 하지 않음.)  
반응형

'개발도 하냐?' 카테고리의 다른 글

SI개발자 발전단계  (0) 2009.12.06
무능력한 개발자  (0) 2009.12.06
한국에서의 개발방법론이란..  (0) 2009.12.06
XP 개발방법론  (0) 2009.12.06
JAVA Application 한글깨짐 해결  (0) 2009.12.03

+ Recent posts