Visual SourceSafe over the Internet using HTTP

여러 명이 공동작업을 하는 데 프리랜서 그룹이라고 하자. 멋있는 말로 분산개발환경이라고 하면 되나? 이번에 나온 Visual SourceSafe(VSS, 소스세이프)는 인터넷을 통한 작업이 가능하게 지원을 한다. SSL을 이용하면 더 안전하겠지만 이 부분은 생략하기로 한다.
먼저 Visual SourceSafe를 설치하고 공유할 데이터 베이스를 지정한다. HTTP를 사용할 경우 로컬인 경우도 꼭 \\ComputerName\SharedFolderName 으로 지정을 해야한다.


새로 추가된 기능의 하나로 Multiple Checkouts를 지원한다.


보안에 대한 안내로 Everyone 그룹에 대한 권한이 있다면 제거하라는...



HTTP를 통한 소스세이프 사용을 위해 SSL을 사용할 것을 권한다. 현재는 테스트라 Yes를 눌러 무시했다.

IIS관리자에 해당 SourceSafe 가상 폴더가 생성되고 VssService.asmx 웹서비스가 구성된 것을 확인 할 수 있다.

ASP.NET 1.0을 동시에 쓰는 경우는 꼭 APP Pool을 ASP.NET 2.0으로 맞춰주길~


WebDAV가 허용되어 있는 것을 확인할 수 있다.

Visual Studio 2005의 Tools ? Option을 보면 아래와 같이 Internet을 통한 소스제어가 가능하게 선택을 할 수 있다.

설정을 변경하고 프로젝트를 오픈하면 그림과 같이 SourceSafe (Internet)항목이 보인다.

Address에는 http경로를 넣으면 된다. 예를 들면 http://aaa.bbb.com/ 그리고 Folder에는 \\ComputerName\SharedFolderName ....
ASP.NET의 Visual SourceSafe 사용에 관한 모든 것

Paul Sheriff, Michael Krasowski

PDSA, Inc.

2003년 12월

요약 : Microsoft Visual SourceSafe를 사용하여 ASP.NET 프로젝트를 관리하는 전체 프로세스를 안내합니다(17페이지/인쇄 페이지 기준).

적용 대상:

Microsoft ASP.NET

Microsoft Visual SourceSafe

목차

소스 코드 컨트롤을 사용해야 하는 이유 소스 코드 컨트롤을 사용해야 하는 이유
격리 모드와 비격리 모드 비교 격리 모드와 비격리 모드 비교
SourceSafe 데이터베이스 설정 SourceSafe 데이터베이스 설정
VSS에 ASP.NET 솔루션 추가 VSS에 ASP.NET 솔루션 추가
VSS로 파일 조작 VSS로 파일 조작
파일 기록 추적 파일 기록 추적
소프트웨어 버전에 레이블 사용 소프트웨어 버전에 레이블 사용
Visual Studio .NET에서 솔루션 가져오기 Visual Studio .NET에서 솔루션 가져오기
결론 결론

일부 개발자들은 소스 코드 컨트롤을 반드시 사용해야 하지만 매우 번거로운 것으로 생각합니다. 하지만 소스 코드 컨트롤은 소프트웨어 개발 프로세스를 지원하는 안전한 업무 관례입니다. 이 문서에서는 실제로 Microsoft Visual SourceSafe를 소스 코드 컨트롤 메커니즘으로 유용하게 사용하는 단계별 방법을 보여 줍니다. 새 SourceSafe 데이터베이스를 만드는 방법, 파일을 체크 인하고 체크 아웃하는 방법, 레이블을 사용하여 릴리스를 만드는 방법을 볼 수 있습니다.

소스 코드 컨트롤을 사용해야 하는 이유

단순하게 말하자면 VSS(Visual SourceSafe) 같은 SCM(Software Configuration Management) 제품은 프로젝트를 구성하는 문서의 중앙 라이브러리(데이터베이스)입니다. Visual SourceSafe에는 프로젝트 계획, 사양 설명서, 데이터베이스 개체, 소스 코드 등의 비트 스트림과 프로젝트의 기타 모든 항목을 저장할 수 있습니다. 최상의 방법은 소스 코드뿐만 아니라 모든 프로젝트 항목을 Visual SourceSafe 데이터베이스에 포함시키는 것입니다. 그러면 액세스 및 팀 구성원 간 공유가 용이해지며, 무엇보다도 버전 제어가 용이해집니다.

여느 라이브러리에서처럼 사용할 파일을 "체크 아웃"하는 기능이 필요합니다. 사용자는 파일을 체크 아웃한 후 편집할 수 있습니다. 일반적으로 한 번에 한 명의 사용자만 파일을 체크 아웃하여 편집할 수 있습니다. 언제나 한 명의 사용자만 파일을 체크 아웃할 수 있도록 하는 것이 가장 좋습니다. 간혹, 같은 파일을 여러 사용자가 체크 아웃할 수 있도록 할 것을 권장하는 Visual SourceSafe 사용 시나리오를 소개하는 백서도 있습니다. 이러한 백서에서는 나중에 모든 변경 사항을 함께 병합할 수 있도록 할 것을 권장합니다. 그러나 VSS에 기본 제공되는 도구를 사용하면 쉽게 병합할 수 있을 것 같지만 실제로는 여러 가지 단점이 있습니다. 항목을 다시 체크 인하는 데 시간이 더 오래 걸리고, 병합 프로세스에서 충돌을 수동으로 점검해야 할 경우가 발생할 수 있으며, 데이터베이스, Microsoft Word 문서 등의 이진 항목에는 대개 사용할 수 없습니다. 또한 업데이트된 항목과 업데이트한 사람 및 시간에 대한 정확한 기록을 반영하지 못하는 경우가 있습니다.

VSS에서는 라이브러리 관리자가 액세스 제어를 정의할 수 있습니다. 사용자에게는 액세스 ID 및 암호, 그리고 액세스 권한이 주어집니다. 액세스 권한은 읽기 또는 읽기/쓰기 기능처럼 단순할 수도 있고, 기능 권한과 같이 복잡할 수도 있습니다. 예를 들어 파일을 삭제하는 기능도 하나의 기능 권한입니다.

모든 개별 파일(소스 코드, 프로젝트 계획, 요구 사항 등)에 대해 각각의 파일 주기 동안 어떠한 변화가 있었는지 파악하는 것은 매우 중요합니다. VSS는 파일을 만든 시간과 만든 사람, 해당 파일에 대한 각 수정, 해당 파일에 대한 메모 또는 주석, 그리고 해당 문서의 주기를 추적하는 데 도움이 되는 기타 정보 등 모든 작업 기록을 보관합니다.

위에서 언급한 VSS의 기능과 그 외 여러 기능을 통해 잘 관리된 구조적인 방식으로 개발, 빌드 및 유지 관리 프로세스를 효율적으로 관리할 수 있습니다. 이 외에도, VSS를 사용하여 소프트웨어 개발의 생산성을 높일 수 있는 이유에는 여러 가지가 있습니다.

격리 모드와 비격리 모드 비교

팀 환경에서 웹 응용 프로그램을 개발할 경우 두 가지 모델 중에서 하나를 선택할 수 있습니다. 첫 번째 방식인 비격리 모델에서는 모든 개발자가 중앙 서버에서 모든 파일을 만들고 수정합니다. 비격리 개발 모델에서는 중앙 공유 컴퓨터에서 하나의 Microsoft IIS(Internet Information Services) 서버를 사용해야 하며, 응용 프로그램의 모든 파일이 해당 서버의 가상 디렉터리에 상주해야 합니다. 모든 개발자가 VSS에서 파일을 체크 아웃하며, 체크 아웃된 파일은 중앙 IIS 서버의 가상 디렉터리로 이동합니다.

두 번째 웹 개발 방식인 격리 모델에서는 각 개발자가 자신의 개발 컴퓨터에서 실행 중인 IIS 안에 가상 디렉터리를 만듭니다. 격리 방식에서는 각 개발자가 중앙 VSS 데이터베이스에서 로컬 컴퓨터로 파일을 가져오거나 체크 아웃합니다. 개발자는 로컬 컴퓨터에서 모든 내용을 편집, 디버그 및 테스트하고 모든 내용이 정상적으로 작동하면 파일을 중앙 위치로 다시 체크 인할 수 있습니다. 체크 인된 파일은 다른 개발자가 가져올 수 있습니다.

두 가지 개발 유형 모두 장단점이 있습니다. 각각의 장점과 단점을 살펴보겠습니다.

비격리 개발의 장점

  • 개발자의 로컬 컴퓨터에서 IIS를 실행하고 있지 않아도 됩니다.

  • 모든 소스 코드가 서로 다른 개발자의 컴퓨터에 흩어져 있는 것이 아니라 한 위치에 모여 있습니다. 소스 코드가 저장된 컴퓨터에 문제가 발생할 경우 변경 내용을 SourceSafe에 체크 인하지 않았으면 해당 변경 내용을 잃을 수도 있습니다.

비격리 개발의 단점

  • 다른 개발자의 작업에 의도하지 않은 영향을 미치기 쉽습니다.

  • 한 개발자가 디버깅을 위해 응용 프로그램을 실행하는 동안에는 프로세스가 잠기므로 다른 개발자들이 응용 프로그램을 디버그할 수 없습니다.

  • 여러 개발자가 같은 파일을 작업하는 경우에는 마지막에 체크 인한 파일이 최종 파일이 됩니다.

  • 소스 제어 기능이 제한되어 있습니다.

  • 한 개발자가 일부 코드를 수정하여 해당 코드가 작동하지 않을 경우 다른 모든 개발자가 더 이상 프로젝트의 해당 부분을 실행할 수 없게 됩니다.

격리 개발의 장점

  • 다른 개발자를 부주의하게 방해하지 않고 응용 프로그램을 개발 및 디버그할 수 있습니다.

  • 다른 개발자에게 영향을 미치지 않고 로컬에서 변경 내용을 테스트할 수 있습니다.

  • 소스 코드 컨트롤에 대한 지원이 뛰어납니다.

  • 개발자는 네트워크에 연결하지 않아도 프로젝트를 다른 컴퓨터로 이동하거나 가지고 다니면서 사용자를 표시할 수 있습니다.

격리 개발의 단점

  • 각 개발자가 자신의 로컬 컴퓨터에 IIS를 설정해야 웹 응용 프로그램을 개발할 수 있습니다.

  • VSS 라이브러리가 백업 프로세스에 포함되는 경우 각 개발자는 파일이 백업되도록 퇴근하기 전에 모든 파일을 다시 체크 인해야 합니다.

선택할 모델

격리 개발 모델을 사용할 것을 권장합니다. 물론 이를 위해서는 각 사용자의 컴퓨터에 IIS가 있어야 하므로 일부 조직에서는 제약이 따를 수 있습니다. 하지만 격리 모델은 가장 유연한 소스 코드 컨트롤을 위한 최상의 모델입니다.

격리 개발을 위한 Visual Studio .NET 설정

격리 모델을 사용할 수 있도록 Microsoft Visual Studio .NET에서 올바른 옵션을 설정했는지 확인하십시오. Visual Studio .NET에서 도구 | 옵션 탭으로 이동하고 Microsoft FrontPage Extensions 옵션이 아닌 파일공유를 클릭합니다. FrontPage Extensions 옵션은 모든 파일이 중앙 서버에 위치한 비격리 방식을 사용할 경우 선택하는 옵션입니다.

SourceSafe 데이터베이스 설정

지금까지는 Visual SourceSafe의 개요 및 사용 이점에 대해 알아보았습니다. 이제 Visual SourceSafe를 시작하는 방법을 살펴보겠습니다. 첫 번째 단계는 중앙 VSS 데이터베이스의 위치를 찾는 것입니다. 이 데이터베이스는 엄밀한 의미에서 데이터베이스라기 보다는 하드 드라이브의 폴더입니다. 이 폴더는 모든 개발자가 찾을 수 있는 네트워크 공유에 배치되어야 합니다. 개발자가 한 명뿐일 경우에는 개발자의 로컬 하드 드라이브에 배치할 수도 있습니다.

VSS 관리 도구를 아직 설치하지 않았으면 VSS CD에서 설치합니다. 사용자 지정 설치를 통해 이 옵션을 선택해야 합니다. CDD에서는 일반적으로 ACMBoot.exe를 실행하여 관리 도구를 설치합니다. 사용자 지정 설치 옵션에서 Administrative ProgramsCreate SourceSafe Database 옵션을 선택해야 합니다.

관리 프로그램을 설치한 후에는 시작 메뉴로 이동하여 프로그램 | Microsoft Visual SourceSafe | Visual SourceSafe 6.0 Admin을 클릭합니다. 새로 시작되는 인터페이스에서 Tools | Create Database...를 클릭합니다 . 그러면 그림 1과 같은 대화 상자가 표시됩니다. 이 새 SourceSafe 데이터베이스를 만들 위치를 "D:\MyVSSDB" 또는 \\SharedDrive\MyVSSDB와 같이 입력합니다.

vssstarttofinish_fig01.gif

그림 1. 모든 SourceSafe 파일에 사용할 공유 폴더의 위치를 지정합니다.

데이터베이스를 만들고 나면 그림 2와 같은 대화 상자가 표시됩니다. 이 대화 상자는 이 SourceSafe 데이터베이스를 만들 때 만들어지는 Admin 사용자에 관련 암호가 없다는 것을 나타내는 경고일 뿐입니다. Admin 사용자를 클릭하고 메뉴에서 Users | Change Password...를 클릭하여 Admin 사용자에 암호를 할당하십시오.

vssstarttofinish_fig02.gif

그림 2. Admin 사용자에 암호를 할당하여 관리 도구를 보안합니다.

데이터베이스를 만들고 나면 Visual SourceSafe Administrator 도구(그림 3)가 나타납니다. 이 도구에서는 한 번에 하나의 VSS 데이터베이스에만 연결할 수 있습니다. 이 데이터베이스에서 파일을 체크 아웃하고 체크 인할 수 있도록 할 모든 사용자를 이 데이터베이스 안에서 만들어야 합니다. 만드는 각 데이터베이스마다 해당 사용자를 추가해야 합니다. 이 기능은 설정된 사용자만 이 데이터베이스를 사용할 수 있도록 하므로 유용합니다. 그러나 모든 사용자에게 액세스를 허용할 VSS 데이터베이스가 여러 개 있는 경우 각 데이터베이스에서 각 사용자를 개별적으로 설정해야 합니다.

vssstarttofinish_fig03.gif

그림 3. Administrator 도구에서는 사용자를 만들고, 데이터베이스를 만들고, 데이터베이스를 잠그며, SourceSafe 대한 기타 시스템 관리 기능을 수행할 있습니다.

이제 이 데이터베이스에 자기 자신을 새 사용자로 추가해야 합니다. SourceSafe에서 도메인 로그온 ID(도메인 이름 제외)를 사용자 이름으로 사용하고 있는지 확인하십시오. SourceSafe는 아무런 메시지를 표시하지 않고 도메인 로그온 ID를 사용하여 로그온을 시도합니다. 이 VSS 데이터베이스에 암호를 할당한 경우에는 해당 암호가 도메인 암호와 일치하는지도 확인하십시오.

이 새 데이터베이스의 위치를 기억해야 합니다. 데이터베이스에 사용자를 도메인 이름과 함께 추가한 후에는 사용자가 VSS 클라이언트 유틸리티를 처음 설정할 때 데이터베이스를 찾을 수 있도록 모든 사용자에게 데이터베이스 위치를 알려야 합니다.

VSS에 ASP.NET 솔루션 추가

새로 만든 VSS 데이터베이스에 프로젝트 및 프로젝트 항목을 추가할 수 있습니다. 두 가지 방법을 통해 이 VSS 데이터베이스를 조작할 수 있습니다. 즉, "다른 프로젝트 항목"을 데이터베이스에 추가하는 데 유용한 VSS Explorer 도구를 사용하거나 Visual Studio .NET 내에서 VSS를 사용할 수 있습니다. 사실 VSS에 새 프로젝트를 추가하는 경우에는 Visual Studio .NET을 사용하여 추가하는 것이 좋습니다. Visual Studio .NET 인터페이스를 사용하면 .SLN 파일에 몇 가지 바인딩 정보가 추가되므로 개발자가 VSS에서 솔루션을 가져올 때 VSS에 자동으로 연결될 수 있습니다.

참고 이 문서의 예제에서는 ASP.NET (US) 사이트에서 다운로드할 수 있는 Microsoft ASP.NET Portal Starter Kit을 사용하여 파일을 체크 인하고 체크 아웃했습니다. 원하는 다른 프로젝트를 사용할 수도 있습니다.

ASP.NET Portal Starter Kit을 다운로드하여 설치했다고 가정하고 VSS에 이 솔루션을 추가하는 방법을 설명하겠습니다. Visual Studio .NET에서 솔루션을 열고 그림 4와 같이 메뉴에서 File | Source Control | Add Solution to Source Control...을 선택합니다.

vssstarttofinish_fig04.gif

그림 4. Visual Studio .NET 에서 기본 제공하는 메뉴를 사용하여 솔루션을 SourceSafe 추가합니다.

이 메뉴 항목을 선택한 후에는 그림 5와 같은 대화 상자가 표시될 것입니다. 격리 개발 모드를 사용하는 경우 이 대화 상자는 FrontPage Server Extensions 대신 일반 파일 URL을 사용하여 모든 파일을 참조한다는 의미일 뿐입니다. Don't' show this dialog box again (Always allow addition of Web projects using File Share access to source control) 확인란을 클릭하고 Continue를 클릭하십시오.

vssstarttofinish_fig05.gif

그림 5. FrontPage Server Extensions 에서 파일 공유 액세스 사용으로 전환

이제 VSS 데이터베이스를 설정할 때 만든 로그온 ID와 암호(그림 6 참고)를 입력할 차례입니다. 설정한 ID(예: JohnD)와 암호를 입력합니다. 그런 다음 Browse...를 클릭하여 VSS 데이터베이스를 만든 특정 폴더를 찾습니다. 작업을 마쳤으면 OK를 클릭합니다.

vssstarttofinish_fig06.gif

그림 6. VSS 로그온

데이터베이스에서 만들 프로젝트 이름을 입력하는 대화 상자가 나타납니다. 첫 번째 대화 상자인 "Add to SourceSafe Project"(그림 7)는 솔루션 파일이 있는 Visual Studio .NET 프로젝트를 나타냅니다. 그림의 "ASP.NET Portal Starter Kit (VBVS)"와 같이 이 프로젝트의 이름을 입력합니다.

vssstarttofinish_fig07.gif

그림 7. 본인이나 다른 개발자가 나중에 쉽게 찾을 있도록 프로젝트에 이름을 지정합니다.

솔루션에 있는 모든 개별 Visual Studio .NET 프로젝트를 입력하는 대화 상자가 나타납니다. 그림 8과 같이 VSS는 각 Visual Studio .NET 프로젝트 이름을 "Add to SourceSafe Project" 대화 상자의 입력란에 자동으로 추가합니다. 이 경우 두 번째로 입력되는 내용은 PortalVBVS입니다. "ASP.NET Portal Starter Kit (VBVS)" 폴더를 클릭하여 이 프로젝트를 이 솔루션 아래에 배치해야 합니다.

vssstarttofinish_fig08.gif

그림 8. 각각의 프로젝트를 VSS 개별적으로 추가합니다.

솔루션 파일이 프로젝트와 동일한 폴더에 있다는 경고 메시지가 표시됩니다. 의도적으로 같은 폴더에 배치한 것이므로 확인란을 클릭하여 계속 진행합니다. 그림 9와 같은 대화 상자가 나타날 수도 있고 나타나지 않을 수도 있습니다. 이 대화 상자가 나타나면 확인란을 선택하고 OK를 클릭합니다. 이 경우 다른 항목은 프로젝트 파일의 일부분이 아닌 폴더에 있기 때문에 나중에 VSS Explorer 도구를 통해 수동으로 추가해야 합니다. 폴더 안에 있지만 프로젝트 파일로 새로 지정된 문서 또는 .SQL 파일이 이러한 항목에 해당할 수도 있습니다.

vssstarttofinish_fig09.gif

그림 9. 프로젝트 파일에서 참조하지 않는 추가 파일이나 폴더가 있으면 VSS 에서 이를 사용자에게 알립니다 .

솔루션과 프로젝트를 SourceSafe 제어 아래에 배치하고 나면 Visual Studio .NET이 그림 10과 같이 특수 아이콘을 사용하여 파일이 잠겼는지 아니면 체크 인되었는지 표시합니다. 소스 코드 컨트롤 아래의 각 파일 옆에는 자물쇠 아이콘이 표시됩니다. 자신이 체크 아웃한 파일 옆에는 확인 표시가 나타나고, 다른 사용자가 체크 아웃한 파일에는 원형 아이콘이 나타납니다.

vssstarttofinish_fig10.gif

그림 10. Visual Studio .NET 소스 코드 컨트롤 아래에 파일의 상태를 표시합니다 .

VSS 데이터베이스 내의 전체 프로젝트를 보려면 운영 체제 메뉴에서 시작 | 모든프로그램| Microsoft Visual SourceSafe| Microsoft Visual SourceSafe 6.0을 선택하십시오. 다시 로그온해야 할 수도 있습니다. 로그온 이름과 암호를 입력하십시오. VSS Explorer(그림 11 참고)를 처음 실행하는 경우 데이터베이스를 만든 폴더를 탐색하여 VSS 데이터베이스도 찾아야 합니다.

vssstarttofinish_fig11.gif

그림 11. Visual SourceSafe Explorer 에서는 전체 프로젝트 소스 코드 컨트롤 아래에 배치된 모든 파일을 있습니다.

VSS로 파일 조작

프로젝트 파일을 VSS 데이터베이스에 배치하고 나면 프로젝트의 모든 파일이 디스크에서 읽기 전용으로 설정됩니다. 체크 아웃되지 않은 파일로 솔루션을 실행할 수도 있습니다. 그러나 Visual Studio .NET 내에서 파일을 작업하려면 체크 아웃해야 합니다. 현재의 작업과 비교하면 한 단계가 추가된 것이지만 대신 이전 버전으로 다시 돌아갈 수 있으며 다른 개발자가 수정 중인 파일을 사용자가 동시에 수정할 수 없도록 합니다.

파일 체크 아웃

파일 작업을 위해 체크 아웃해야 할 때는 Solution Explorer 창에서 해당 파일을 마우스 오른쪽 단추로 클릭하고 상황에 맞는 메뉴에서 Check Out...을 클릭하기만 하면 됩니다. 예를 들어 Portal Starter Kit에서 Default.aspx 파일을 클릭하고 마우스 오른쪽 단추를 클릭한 다음 Check Out...을 클릭합니다. 그림 12와 같은 대화 상자가 나타납니다. Check Out 단추를 클릭하면 .ASPX 파일뿐만 아니라 .ASPX.resx 및 .ASPX.VB 파일도 체크 아웃됩니다. 이제 해당 파일을 작업할 수 있으며 다른 사용자에게 파일이 체크 아웃된 것으로 표시됩니다.

vssstarttofinish_fig12.gif

그림 12. Check Out 대화 상자에서는 프로젝트 파일을 하나 또는 여러 가져와서 하드 드라이브에 있는 상태로 설정할 있습니다 .

파일 체크 인

체크 아웃한 파일에서 원하는 내용을 모두 수정한 후에는 SourceSafe에 다시 체크 인해야 합니다. 파일을 체크 인할 경우 두 가지 사항을 염두에 두어야 합니다. 첫째, 프로젝트의 페이지 또는 클래스에서 변경한 내용이 컴파일되는지 확인해야 합니다. 그렇지 않으면 SourceSafe 데이터베이스에서 최신 변경 사항을 가져오는 다른 개발자의 프로젝트에서 오류가 발생하는 곤란한 상황이 발생합니다. 둘째, 매일 일과가 끝나면 파일을 모두 체크 인해야 합니다. 그러면 파일이 단지 하드 드라이브에 저장되는 것이 아니라 다른 위치에 백업됩니다. 따라서 하드 드라이브에 문제가 발생할 경우에도 변경한 내용을 모두 보존할 수 있습니다. 일과 후에도 소스 코드가 아직 컴파일되지 않은 경우에는 문제가 되는 코드에 주석을 달고 체크 인하면 됩니다.

최신 버전 가져오기

팀 환경에서 작업하는 경우 프로젝트 내에서 다른 파일을 수정하는 다른 개발자도 있습니다. 특정 시점에서는 VSS 데이터베이스에 있는 모든 최신 변경 사항을 프로젝트와 동기화할 수 있습니다. 그러기 위해서는 Visual Studio .NET Solution Explorer 창에서 프로젝트를 클릭하고 마우스 오른쪽 단추를 클릭한 다음 Get Latest Version (Recursive)를 클릭합니다. 그러면 VSS 데이터베이스로 이동하여 변경된 모든 파일을 검색하고 해당 파일을 프로젝트로 가져옵니다. 이제 로컬 컴퓨터에서 프로젝트를 실행하고 나면 다른 개발자가 변경한 내용을 모두 볼 수 있습니다.

파일 기록 추적

특정 시점에서 개발 팀은 "빌드", "버전" 또는 "릴리스"를 만들 수도 있습니다. VSS는 버전 번호를 사용하여 파일 및 프로젝트에 대한 모든 변경 사항을 추적합니다. 따라서 파일 또는 프로젝트의 모든 버전을 검색할 수 있습니다. VSS는 내부 버전 번호, 날짜 및 사용자 정의 레이블의 세 가지 항목을 기준으로 이전 버전을 추적합니다. 버전을 자체적으로 지정하는 경우에는 VSS에서 할당한 내부 버전 번호가 아니라 사용자 정의 레이블을 사용합니다.

버전 번호

VSS는 체크 인된 각 파일에 대해 내부 버전 번호를 유지합니다. 파일을 체크 아웃하고 변경한 다음 VSS에 다시 체크 인할 때마다 해당 파일 버전에 대한 새 번호가 만들어집니다. VSS에서 History 대화 상자를 사용하여 파일의 전체 기록을 볼 수 있습니다. History 대화 상자는 Visual Studio .NET 또는 VSS Explorer 도구를 통해 볼 수 있습니다.

Visual Studio .NET에서 기록을 볼 파일(예: default.aspx)을 클릭한 다음 Visual Studio .NET 메뉴 시스템에서 File | Source Code Control | History를 클릭합니다. 그러면 그림 13과 같은 대화 상자가 나타납니다. default.aspx 파일을 아직 변경하지 않은 경우에는 첫 번째 버전 이외의 다른 버전이 없습니다.

VSS Explorer 도구를 사용하는 경우 Explorer에서 특정 파일을 찾아서 마우스 오른쪽 단추로 클릭한 다음 Show History... 메뉴 항목을 클릭하여 동일한 대화 상자를 표시합니다.

vssstarttofinish_fig13.gif

그림 13. VSS Explorer 파일의 전체 기록이 표시됩니다.

참고 내부 VSS 버전 번호는 단순히 참조용이며 빌드 또는 버전 번호와 직접적인 관련이 없습니다. 빌드 또는 버전 번호에는 레이블(아래 참고)을 사용합니다.

소프트웨어 버전에 레이블 사용

SourceSafe에서 파일에 할당하는 내부 버전 번호를 사용하는 대신 소프트웨어 릴리스를 정의하는 자신만의 코드 집합용 "레이블"을 만들 수도 있습니다. 릴리스는 첫 번째 베타 버전, 제품의 첫 번째 버전, 증분 릴리스, 제품의 두 번째 또는 세 번째 릴리스일 수 있습니다.
각 파일에는 자체 내부 버전 번호가 지정되며, 파일 수정 빈도에 따라 이 번호는 전체 프로젝트에서 전혀 일치하지 않게 됩니다. 따라서 내부 버전 번호 대신 자신만의 레이블을 전체 프로젝트에 적용하여 이 레이블을 만든 특정 시점에서 체크 인된 모든 파일을 식별할 수 있습니다.

레이블(최대 31자)을 만들 때 "1.0," "2.01b," "Final Beta" 또는 "Approved for QA" 같은 텍스트를 사용할 수 있습니다. 레이블을 적용한 후에는 기록 대화 상자에서 이 레이블과 연결된 모든 파일을 검색할 수 있습니다. 개별 파일에 레이블을 할당할 수도 있지만 대개 프로젝트 수준에서 레이블을 적용합니다. 프로젝트에 설명 문자열이 있는 레이블을 할당하면 해당 프로젝트의 모든 파일과 하위 프로젝트가 그 레이블을 사용합니다.

개발 주기의 어느 시점에서나 프로젝트에 레이블을 할당할 수 있습니다. 예를 들어 제품의 각 "릴리스"마다 알파, 베타 또는 최종 생산 코드에 관계없이 해당 시점에서 모든 프로젝트 항목에 레이블을 할당할 수 있습니다. 개발을 진행하다 베타 1.0의 소스 코드가 필요할 경우 그냥 가져오면 됩니다. 원하면 원본 파일에 아무런 영향을 미치지 않고 레이블의 이름을 바꿀 수 있습니다.

레이블을 만들려면 VSS Explorer 도구에서 레이블을 할당할 Project 폴더를 클릭하십시오. 메뉴에서 File | Label...을 클릭하면 그림 14와 같은 대화 상자가 나타납니다. 설명이 포함된 레이블 이름과 이 레이블의 사용 용도를 알려 주는 주석을 입력하고 OK를 클릭하여 레이블을 이 프로젝트와 이 프로젝트 아래의 모든 파일 및 하위 폴더에 적용합니다.

그림 14. VSS Explorer 도구를 사용하여 레이블 만들기

VSS Explorer에서 프로젝트를 다시 선택하고 마우스 오른쪽 단추로 클릭한 다음 Show History... 메뉴 항목을 클릭하여 History 대화 상자를 표시하면 그림 15와 같이 레이블이 표시됩니다.

vssstarttofinish_fig15.gif

그림 15. VSS Explorer History 대화 상자에서 적용한 여러 가지 레이블을 있습니다.

기존 레이블에 파일 추가

버전에 레이블을 할당했는데 나중에 레이블이 할당된 버전에 포함되었어야 할 파일을 빠뜨린 것을 발견하는 경우도 있을 수 있습니다. 파일을 레이블의 일부분으로 추가하려면 파일을 프로젝트에 추가하기만 하면 됩니다. VSS Explorer에서 해당 파일을 클릭한 다음 File | Label...을 클릭하고 프로젝트에 할당한 것과 동일한 레이블을 할당합니다. 레이블을 기준으로 파일을 가져올 경우 레이블 이름이 동일하기 때문에 이 파일도 함께 가져옵니다. 레이블 이름을 정확히 입력했는지 확인하십시오.

레이블에 할당된 모든 파일 가져오기

특정 레이블이 할당된 파일을 모두 가져오려면 해당 파일에 대해 "가져오기(get)" 작업을 수행하면 됩니다. 즉, 특정 레이블 아래의 파일을 체크 아웃할 수는 없지만 가져올 수는 있습니다. 그러기 위해서는 VSS Explorer에서 내용을 가져올 프로젝트를 마우스 오른쪽 단추로 클릭하고 Show History...를 클릭합니다. Project History Options 대화 상자(그림 16 참고)가 나타나면 Labels Only 확인란을 선택하고 OK를 클릭합니다.

vssstarttofinish_fig16.gif

그림 16. 프로젝트의 레이블 가져오기

선택한 프로젝트에 할당한 모든 레이블이 표시됩니다. 가져올 레이블을 클릭한 다음 화면(그림 15 참고) 오른쪽에서 Get을 클릭합니다. 그러면 이 레이블이 있는 모든 파일이 이 프로젝트에 할당된 작업 디렉터리로 복사됩니다. 이미 언급한 대로 레이블이 할당된 릴리스에서는 파일을 체크 아웃할 수 없습니다. 따라서 릴리스된 파일 집합은 아무도 무단으로 변경할 수 없습니다.

Visual Studio .NET에서 솔루션 가져오기

사용자가 빌드 중인 응용 프로그램에 대해 프로젝트 책임자가 초기 솔루션을 만들면 다른 개발자가 이 솔루션을 가져와서 각자의 컴퓨터에 설정할 수 있도록 해야 합니다. 이때 각 개발자가 자신의 컴퓨터에 가상 디렉터리를 다시 만들고 모든 파일을 올바른 위치로 가져왔는지 확인하게 할 필요는 없습니다. 다행히도 VSS 및 Visual Studio .NET에서는 이를 자동으로 처리합니다.

VSS와 통합된 Visual Studio .NET은 하드 드라이브에 적절한 폴더를 자동으로 만들고, 새 가상 디렉터리를 만들며, VSS에서 새 폴더로 파일을 자동 복사합니다. 항상 VSS가 아닌 Visual Studio .NET을 통해 이 프로세스를 수행해야 합니다. 그렇지 않으면 IIS를 수동으로 구성하고 VSS 데이터베이스에 대한 참조를 직접 설정해야 합니다.

다음 단계를 수행하려면 다른 컴퓨터를 사용하거나 앞에서 만든 가상 디렉터리를 지워야 합니다. Visual Studio .NET의 새 인스턴스를 엽니다. File | Source Control | Open from Source Control...을 클릭하면 그림 17과 같은 대화 상자가 나타납니다. 창에서 PortalVBVS 프로젝트를 클릭합니다. Create a new project in the Folder 입력란에 다른 폴더 이름을 입력하고 OK를 클릭합니다.

vssstarttofinish_fig17.gif

그림 17. 폴더로 SourceSafe 프로젝트 가져오기

드라이브에 없는 폴더를 선택하면 폴더를 만들라는 메시지가 표시됩니다. 이 예제의 경우에는 폴더가 드라이버에 없어야 정상입니다. Yes All을 클릭하여 이 프로젝트에 필요한 모든 폴더를 만듭니다.

그림 18과 같이 이 프로젝트를 배치할 가상 디렉터리를 입력하는 대화 상자가 나타납니다.

vssstarttofinish_fig18.gif

그림 18. 프로젝트에 가상 디렉터리 할당

SourceSafe 내의 프로젝트 및 솔루션 레이아웃 방법에 따라 열려는 솔루션 파일을 입력해야 할 수도 있습니다. 그럴 경우 대화 상자에서 .SLN 파일을 선택합니다. Portal 솔루션에서는 .SLN 파일이 분리된 자체 폴더 안에 있으므로 SourceSafe에서 아무런 대화 상자도 표시되지 않습니다.

다음으로는 이 가상 디렉터리를 만들 IIS의 위치를 입력하는 대화 상자가 나타납니다. 웹 서버 이름과 가상 디렉터리 이름을 입력하고 OK를 클릭합니다.

vssstarttofinish_fig19.gif

그림 19. 서버에 프로젝트 할당

이제 Visual Studio .NET에서 이 프로젝트의 모든 파일을 가져오기 시작합니다. 이 문서의 예제에서는 D:\PortalVBVS를 사용했습니다. 즉, 솔루션이 이 폴더에 저장된다는 의미입니다. 이 프로젝트의 다른 모든 파일은 기본 웹 사이트가 가리키는 폴더에 배치됩니다. 일반적으로 이 폴더는 c:\inetpub\wwwroot입니다. 이로써 프로젝트가 다른 개발자의 컴퓨터에 설정되었으며 사용 준비가 끝났습니다. 사이트의 시작 페이지를 선택하고 F5를 누르기만 하면 응용 프로그램이 실행됩니다. 이제 파일을 체크 아웃하여 작업하고 다시 체크 인할 수 있습니다. 이 모든 작업이 Visual Studio .NET 내에서 가능합니다.

결론

모든 개발자는 일상적인 작업에서 Visual SourceSafe를 사용해야 하며, 모든 개발 관리자는 팀에서 Visual SourceSafe를 사용하도록 해야 합니다. 개발자가 한 명뿐일 경우에도 이 도구를 효율적으로 사용하면 소스 코드를 다른 컴퓨터에 백업하고 소스 코드의 이전 버전으로 돌아갈 수 있습니다. VSS를 만들고 사용하는 것은 간단하고 쉽습니다. 사용 방법을 조금만 배우면 됩니다. 소스 코드 컨트롤이 뛰어나면 개발 프로세스가 향상되고 소프트웨어 구성 관리의 다양한 이점을 모두 활용할 수 있습니다.

BIO

Paul D. Sheriff는 SDLC 문서 및 아키텍처 프레임워크를 비롯한 .NET 컨설팅, 제품 및 서비스를 제공하는 PDSA, Inc.의 사장입니다(http://www.pdsa.com/ (US) 을 참고하십시오). 또한 남부 캘리포니아의 Microsoft 지역 책임자입니다. .NET 저서로는 ASP.NET Developer's Jumpstart(Addison-Wesley: 영문)와 PDSA 웹 사이트에서 구할 수 있는 여러 eBook이 있습니다. 전자 메일 주소는 PSheriff@pdsa.com입니다.

Michael Krasowski는 PDSA, Inc의 개발부 부사장입니다. 이전에는 The Boeing Company, Long Beach Division에서 선임 IT 관리자 직책을 역임했습니다. IT 분야에서 27년이 넘는 경험을 보유하고 있으며 캘리포니아 대학의 Irvine 사회 교육 과정에서 .NET에 대해 강의하고 있습니다. 전자 메일 주소는 Michaelk@pdsa.com입니다

최종 수정일: 2004년 2월 19일


출처 : MSDN
URL : http://msdn.microsoft.com/ko-kr/library/ms972977.aspx

객체지향이란 1편


1. 객체지향의 장점.
객체지향이라는 개념은 무엇보다 알기쉽고,만들기 쉽다는것입니다.
즉 어떠한 컴퓨터 프로그램을 만들때,현실세계에서 생각하는 것과 동일한 사고방식으로의 접근이 가능해졌다는 것이죠. 
그래서 객체지향이라는 개념을 설명할때,  현실세계의  인용이 자연스럽게 나오는 것입니다. 
또한 만들기 쉽다는건 그만큼 유지보수하는데에도 많은 비용을 요구하지  않는다는점 입니다.

2. 객체지향의 중요한 개념 3가지
   1. 상속성 (inheritance)
      객체지향을 말할때 상속성은 가장 중요한 요소들 중 한가지입니다.  상속성은 미리 만들어진

      소스를 가지고 공유하며 재사용하고,  또한 특별한 부분에 대해서는 다시 재정의해서 사용하는

      걸 말합니다.  즉, 개발하는데 있어서, 많은 부분을 생략할 수 있다는 거죠.또한, 어느부분에

      오류가 있을때,  한부분의 수정만으로,  그 소스를 이용해 만든 모든 소스의 오류를 방지할

      수 있다는 장점을  또한 가지고 있습니다.
   2. 다형성(Polymophism)
      뒤에서 다시 머리 터지게 설명 드리겠지만 맛뵈기로 간단하게나마 말씀드리자면 상속을 받은

      것을 그대로 사용하지않고 입맛에  맞게 바꾸어줄수 있도록 하는것이 다형성입니다.  

      OVERRIDEN의 개념입니다.  OVERRIDEN은  재사용성으로 통하기도 하는데 그말이 맞는 거

      같습니다. 뒤에가면  OVERRIDEN 않쓰고는 SOURECE가 만들어 지지 않습니다. 특히 상속을

      받은 경우는 더 하지요. 


   3. 캡슐화(Encapsulation)
      캡슐화라고 하는것은 어떠한 데이타를 보호할 수 있다는 점입니다. 즉 어떠한 소스를 만들었을

      때, 그 소스의 데이타를 보호할 수 있고,  보호 할 수 있다고 하는건 그 소스를 사용하는 입장에

      서보면,  더욱더 안정된(또는 검증된) 소스를 사용한다는 것입니다. 같은 개념으로 data hiding

      이라고 하는데 대부분의 번역서에선 데이타 은닉화라고합니다. 말이 좀 이상하죠? 이게 문제

      입니다. 차라리 영어를 그대로 보는게 속편하죠(음.. 옆길로 셌군...)  
                
객체지향의 중요한 개념3가지에 대해서 간략하게 나마 정리를 했습니다.  벌써 눈치들을 채셨겠지

만 저놈들은 따로따로  때어 놓고는 생각할 수가  없습니다. 상속이 이루어져야 다형성을 써먹을수

가  있고 상속성을 쓰기위해서는 데이타가 믿을 만해야 하는데 그걸 만들어 주는것은 캡슐화 입니

다.  그리고 완벽한 캡슐화를 이루기 위해서는 상속성과  다형성이 뒷받침이 되어야 함은 말할 필요

도 없지요. 예를 보면서 좀더 자세하게 이야기 해보겠습니다.(사실 캡술화가 젤루 만만해여^^;)


                class Date
                {
                        int day;
                int monty;
                    int year;
                }


 지금 제가 아주 간단하게  Date라는 class를 만들어 보았는데, 이 클래스를 가만히 생각하게 되면

 이런 점이 있을 수가 있겠죠. 지금 date라는 클래스는 날짜를 저장하기 위해서 만든건데 일단 day

 라는 변수를 살펴보면 31보다 더 커다란 숫자가 저장되면 날짜를 잘못저장하게되는 거겠죠? 

  그러니깐

   Date d = new Date();


  하고 객체를 생성한 후 d.day = 40; 이라고 하게 되면 우리가 생각하는 개념상 잘못된 날짜가 만들

  어 지겠죠? 이럴때 이런 변수들(외부에서 임의로 조작되었을때 원하지 않는결과가 나오는것들

  또는 잘못된 결과가 나오는것들) 에대해서 외부로 부터 접근 제한을 시키는 것이 바로

  encapsulation이라고  생각하시면 됩니다. 그래서 이런 캡슐화를 어떻게 구현하게 되냐면..


        class Date
        {
                private int day;
                private int month;
                private int year;
        }


라고 만드는 것이지요. 여기서 private는 접근제한자라 불리는 것인데. Date라는 클래스 외부에서의

접근을 막는 것입니다.즉


        Date d = new Date;


한 후에 d.day = 40; 이라고 하면 에러가 나게 되는 것이죠.. 즉 외부로부터 어떠한 데이터를  보호

한다는 의미죠. 그런데 이렇게 보호만 한다고 해서 되는건 아니겠죠? 보호하는것까지는 좋은데

일단 만들어 놓은걸 사용하지 못하게 되는 것이니깐요. 그래서 이렇게 보호해놓은 데이타를 메소드

를 통해서 접근을 허락하는 것입니다.


        class Date
        {
                private int day;
                public void setDay(int targetDay)
                {
                        day = targetDay;
                }
        }


 제가 설명하기 쉽게 일단 변수를 하나로 줄였습니다.  자 그럼 설명을 계속하면 보시는 대로 day라

 는 변수를 외부에서 접근하지 못하게 private로 선언한 다음 setDay라는 메소드를 제공해 주는것이

 죠.그런데 위에 것만 보면 그전것과 크게 달라진 점이 없죠? 지금 나온 에제도 day라는 변수에 잘

 못된 값이 들어갈 수 있을테니깐요. 그래서 메소드를 제공하긴 하는데 그냥 제공만 하는 것이

 아니라.
 

       class Date
        {
                private int day;
                public void setDay(int targetDay)
                {
                        if(day==targetDay)
                        else
                        {
             // 이곳에는 잘못입력했으니깐 다시 입력하라는 식의 코딩이 들어가면 되겠죠.
                        }
                }
        }


이런식으로 만드는 겁니다. 그래서 다시 정리를 하자면 캡슐화라는것이 어려운 개념은 아닙니다.

일단 외부에서 조작이 되면 안되는 그런 변수에 대해서 private라고 선언한후 대신 메소드를 통해서

접근할 수 있도록 해주는 것이죠. 그리고 그 메소드에는 어떠한 검사부분이 들어가면 됩니다. 지금

넣으려는 값이 제대로 된것인지 아닌지를.  그래서 제대로 된것이라면 그냥 넣으면 되는 거구요. 제

대로가 아니라면 어떠한 처리부분이 들어가면 되겠죠?
  
1. Creating an Object


보통 자바에서 primitive data type(자바의 기본 데이타 타입을 선언하게 되면 실제적인 메모리에

할당되게 됩니다. 그렇지만 primitive data type이 아니라면(바로 reference type일 경우) 실제적인

메모리 공간에 할당되는게 아닙니다.  그런 레퍼런스 타입은 어떠한 주소값이 저장될 공간이 만들

어 지는 것이고, 실제로 다른곳에 실제적인 Object 가 저장이 되는것 이지요. 이런걸 보면 어느

정도 C에서 말하는 Pointer와 비슷합니다. 하지만 자바는 Pointer를 제공해 주지 않지요. 그져

reference라고 말하는것 뿐. 그리고 Pointer 연산은 안됩니다.(해도 되긴한데 엉망이 되어 버리죠)

그건 프로그램의 견고성  때문이지요. 뒤에서 자바의 특징을 말씀드릴때  다시한번 정리하겠지만

자바는 performance보다는 완벽한 객체지향을 목표로 만들어 졌으며 또한 서버에서 돌아가는 프로

그램 개발이 목적이였으므로 상당한 수준의 보안성과 안전성을 가지도록 만들어 졌습니다. Point를

써보신분들은 아시겠지만 이놈이 시스템을 아예 날려버리기도 하니까요 각설하고 객체를 만들때는

밑에서 처럼 new keyword를 사용 하시면 됩니다.

        1) MyClass m = new MyClass();
                Or
        2) MyClass m;
                m = new MyClass();

첫번째 예제는 선언과 동시에 Object를 하는 것이고, 두번째 예제는 선언과 Object생성을 나누어서

하게 되는것이죠.  두 예제의 다른점은 별반 없다고 생각하셔도 상관없습니다. 그리고 이렇게 만들

어진 Object에 접근을 하려면 dot 를 사용합니다. "variable dot  member"의 형식입니다. 예를 들면

m.day 라는 식이죠. 바로 m이 어떤 객체를 가리키는 reference이구요, day가 그 객체가 가지고 있

는 member variable이 되는 거죠. 그럼 실제로 한번 예제를 해보도록 하죠. MyDate라는 class를

만들어 보도록 하겠습니다.

        class MyDate
        {
                int day;
                int month;
                int year;
        }

이렇게 만든 다음 javac로 compile하시면 되겠지요.
그다음 사용을 하시려면 객체를 만들어야 겠지요. 그래서 MyDate를 사용하는 class도 만들어

보겠습니다.

        class TestMyDate
        {
                public static void main(String args[])
                {
                        MyDate m = new MyDate();
                        m.day = 3;
                        m.month = 4;
                        m.year = 2000;
                        System.out.println("나의 생일은 " + m.year + "년 " +  m.month + "월 " + m.day +"일 입니다.");
                }
        }

위의 TestMyDate를 실행시켜 보면 "나의 생일은 2000년 4월 3일 입니다." 라는 문장이 출력될 것입

니다. 소스를 설명드리면 3번째 줄에서 MyDate라는 class를 사용하기 위해 Object를 만들었습니

다. 그리고 4번째 줄에서 6번째 줄까지m.variable의 형식을 사용해 member variable에 값을 할당

하는 것이지요. 그리고 나서 7번째 줄에서 그런 값을 가져와서 출력하게 되는 것입니다. 이런

식으로 만들어진 Object의 값을 가져오고 할당할때는 referenceName.variable의 형식을 사용하면

되는 것입니다.


객체지향이란 2편


오늘은 객체지향 언어에서 사용하는 "is a" 관계에 대해 알아보도록 하죠. 일단 간단하게 말씀드리

면 상속관계 라고 할 수 있습니다. 상속관계에서의 상위계념은 하위개녀들을 포괄할 수 있는 내용

들이 들어갑니다. 예를 들어 포유류를 볼때 포유류는 젖먹이는 동물을 말합니다. 따라서 가장 상위

계념은 젖먹인다가 포함되는건 당연하겠죠. 포유류라는게 이런 동물들의 공통점을 뽑아 만든 개념

이니깐요. 즉 우리가 프로그래밍을 하다 보면 이런  관계를 가진 클래스들을 만들게 되는데.. 이런

관계에서 포유류를 상위클래스, 그리고 사슴, 사람 그리고 토끼  를 하위클래스로 보면 되는 것이

죠. 이럴때 우리는 이런 말을 사용합니다. 사슴은 포유류다. 또는 사람은 포유류다라는 말을. 즉 우

리가 다음과 같은 클래스를 만들게 되면

                                  Employee
                                     |  
                                     |  
                                  Manager

즉 코딩은 다음과 같겠죠.
        
        class Employee
        {
                String name;
                int salary;
                int ssn;
        }


        class Manager extends Employee
        {
                String managerGroup;
                // any coding...
        }
        
이럴때 객체지향언어에서는 Manager is a Employee 라는 말을 사용합니다.위의 예와 같은 식이

죠.따라서 이런 "is a"관계가 바로 상속관계라고 생각하시면 됩니다.위에서 설명드리지 않은 것중에

extends라는 것이 있죠.이것이 바로 상속을 할때 사용하는 keyword입니다.  상위에 있는 클래스

(Employee를 말하죠.)의 모든것을 하위에  있는 클래스(Manager) 가 물려 받는 것이죠. 즉

Employee에 있는 Class에 있는 name, salary, ssn같은 것들을 Manager또한 사용하기 때문에

Manager를 새로 처음부터  만드는 것이 아니라 Employee를 상속받고 자신만의 변수(man
agerGroup)를 선언해서 사용하는 겁니다.  물론 재사용별骸?관련이 있겠구요. 자바에서는 단일

상속만을 지원합니다. 즉 모든클래스의 상위클래스는 반드시 하나만이 존재할 수 있다는 것입니다.

물론 그 상위클래스위의 상위클래스는 존재할 수 있겠죠. 바로 위가 하나라는 말입니다...물론 아시

죠? 또한 어제 했던 생성자와  연계시켜서생성자는 상속되질 않습니다. 당연하겠죠. 왜냐하면,  생

성자라고 하는 것이 하는일이 멤버 변수의 초기화를  하게 되는건데 상속을 받아서 새로운 멤버를

선언하게 될텐데.  그런건 자신의 클래스 안에서 해야되는거겠죠?  또한 생성자를 만드는 법이

return type이 없고,class의 이름과 같아야 하기 때문에 상속받아봐야 자신의 클래스에서는 생성자

의 역활을 할 수가 없겠죠?



객체지향이란 3편

객체의 다형성

객체지향의 진주이자 마지막 관문이며 가장많이 사용되며 가장많은 질문과 회의를 낳게하는 다형

성에 대해 적으며 간략한 객체지향에 대한 글을 접을까 합니다

1. 다형성(polymopism)
    A. 정의
         Super class type의 Reference변수로 sub class type의 객체를 참조한다. 쉽죠? ^^; 예를

         봅시다.
        예)
                abstracte class Employee
                {
                        String name;
                        float bs;
                        double salary;
                        abstracte public void setSalary();
                   //이렇게 하면 반드시 밑에서 overriden해야한다.
                  /* abstracte 선언은 밑에서 객체로 생성하지 못하게할 내용을  나타낼때 사용한다.
            또한 abstracte클레스라고 해서 반드시 포함된 모든것이 다 abstracte가 되는건 아니다.
                        */
                }

                class SalesEmployee extends Employee
                {
                        public void setSalary()
                        {
                                salary = bs*1.5;
                        }
                        public void aa()
                        {
                                System.out.println("aa");
                        }
                }

                class RegularEmployee extends Employee
                {
                        public void setSalary()
                        {
                                salary = bs*1.3;
                        }

                        public void bb()
                        {
                                System.out.println("bb");
                        }
                }
일단은 예제 설명은 접어두고 예제의 내용은 기억하기 바란다.
자아 이제 심오한 이야기를 하겠다.
                SalesEmployee s[] = new Employee[2];


이문장이 실행되면 결과는? 맞춘분께는 아무것도 못드림다. 결과는 에러. 그렇다면 아랫걸보자.


                Employee e[] = new SalesEmployee[2];


이문장은 정상적으로 실행이된다. 왜? 소스코드를 보면 SalesEmployee가 기억장소에 저장되면은

name, bs, salary, setSalary(), 그리고 aa가 기억되어진다. 근데 위의 문장은 Employee type으
로 객체를 선언했다. 그러면 레퍼런스하는곳이 자신이 레퍼런스하고자 하는 숫자보다 작으므로
에러가 발생한다. 밑에 문장은 그런 이유로 가능한것이다.
기억하자. sub class type의 레퍼런스로 super class를 참조할 수 없다.
이제 다형성을 정의헤보자. 객체지향이 제사용성의 측면을 무쟈게 강조하고 있다는건 다 아실것
이다. 그럼 그런 연유에서 상속성이 나오게 된것도 알것이다. 그렇다면 변화를 주지 않고  사용
할 수 있는 것의 한계는 불보듯 뻔한것이다. 하나의 선언되어진 객체를 여러가지형태로 재정의
해서 사용할 수 있는 것이 다형성이다.

 *overriden


 재정의라고도 한다. 위의 소스를 보자 실제 메인부분에서(아직은 없지만) setSalary를 호출한다
면 무엇이 호출될까? 정답은 밑에서 정의한 것이 호출된다. 어떤 메쏘드를 호출할 때 상속이 이
루어졌다면 그 상속의 틀에있는 생성자들에 대하여 override검사라는것을 jvm이 한다.   그레서
 맨 나중에 재정의 된것을 사용하게 되는것이다. 왜? 상상을 해보라. 기껏 재정의 해놓은게 늘쌍
 부모클레스의 것만 사용된다면 허무하지 않겠는가? 위 소스를 완성해보자.

                abstracte class Employee
                {
                        String name;
                        float bs;
                        double salary;
                        abstracte public void setSalary();
                }

                class SalesEmployee extends Employee
                {
                        public void setSalary()
                        {
                                salary = bs*1.5;
                        }
                        public void aa()
                        {
                                System.out.println("aa");
                        }
                }

                class RegularEmployee extends Employee
                {
                        public void setSalary()
                        {
                                salary = bs*1.3;
                        }

                        public void bb()
                        {
                                System.out.println("bb");
                        }
                }

                public class PolyTest
                {
                        public static void main(String args[])
                        {
                                Employee e[] = new Employee[2];
                                e[0] = new SalesEmployee;
                                e[0].bs=1000000;
                                e[0].setSalary();
                                e[1] = new RegularEmployee;
                                e[1].bs=1000000;
                                e[1].setSalary();
                                
                                System.out.println(e[0].salary+":"+e[1].salary);
                        }
                }

결과는? 직접해보시기를....
그리고 객체지향에 대해 궁금하신분은 아래 싸이트를 가보시기 바란다.
 www.omtgroup.com


프로그래밍 격언모음

1. "오늘까지"라는 말은 "내일 아침까지"라는 말이다.



2. 프로그램은 내가 원하는대로 움직이지 않는다. 타이핑대로 움직인다.



3. 요구 사양은 프로그램을 완성한 후에 추가된다.

기본 사양은 완성품을 고객이 보고 나서 결정된다.

상세 사양은 사용자가 프로그램을 사용해 본 이후에 결정된다.



4. 소프트웨어 설계에는 두 개의 방법이 있다.



하나는 결함이 있을 수 없을 정도로 단순하게 만드는 방법이다.

다른 하나는, 분명한 결함을 눈치채기 어려울 정도로 복잡하게 만드는 방법이다.



5. 코드는 개발 현장에서 사용하는 것이 아니라 납품처에서 사용하는 것이다.

디버그는 납기일까지 하는 것이 아니라, 납품된 이후에 하는 것이다.



6. 프로그래머를 죽이기 위해서는 칼이 필요없다. 프로그램의 요구조건을 3번만 바꾸면 된다.



7. 다른 사람을 믿으라. 그 사람이 해결해줄지도 모른다.

주의사항 - 먼저 자신을 의심해라.



8. 개발에 마지막은 없다. 출시만이 있을 뿐이다.



9. 클라이언트의 요구사항이 제 아무리 뒤늦게 추가되어도 납기일은 변하지 않는다.

이것을「납기 불변의 법칙」이라고 한다.



10. 우리의 고객들은 물과 기능추가를 공짜라고 생각하고 있다.



11. 주머니가 짠 고객일수록 잔소리가 많다.



12. 개발 스케줄은 산수를 무시하며 짜여진다. 영업과는 1+1=2를 이해하지 못하는 사람의 모임이다.



13. 한 명이 쓰러지면 모두가 쓰러진다.



14. 버그가 너무 심하다? 걱정마라. 어느 순간 그것은 기본 사양이 될 것이다.



15. 좋은 설계는 한 명의 천재보다 세 명의 범재를 요구한다.

나쁜 설계는 백명의 범재보다 한 명의 천재를 요구한다.



16. 고객에게 시스템 엔지니어는 부하이며, 프로그래머는 가축이다.

시스템 엔지니어에게 고객은 돈이다.

프로그래머에게 고객은 보이지 않는 악성 바이러스다.



17. 돈과 시간만 있으면, 그 어떤 시스템이라도 만들 수 있다고 생각하는가?

웃어라. 그 기회는 영원히 주어지지 않는다.



18. 품질은 사양 변경의 수와 규모에 의해, 얼마나 열화될지 결정된다.



19. 영업과는 공상이 실현된다고 생각하는 몽상가이다.

시스템 엔지니어는 넘을 수 없는 벽이 없다고 믿는 모험가이다.

프로그래머와는 몽상가와 모험가에 의해 칠흑의 바다에 내던져진 표류자이다.



20. 유능한 프로그래머가 프로그램 설계개념도를 받아들고 최초로 하는 일은, 프로그램의

목적을 이해하는 것이다. 그리고 그 다음으로 하는 일은, 지정된 방법과 시간 안에는

도저히 그 목적을 완수할 수 없다는 사실을 시스템 엔지니어에게 이해시키는 일이다.



21. 프로그램이란, 운과 감에 의해서 작성되는 기적이다.

운과 감이 없다면, 그 기간 내에 그러한 목표를 실현될 수 있을 리 없다.

따라서 사양 변경은 기적에 트집을 잡는 건방진 행위이며, 사양 추가는 기적이 두 번

일어날 것으로 믿는 무모한 행위이다.



22. 시스템 엔지니어는 지구력, 프로그래머는 순발력.



23. 정시에 퇴근하면, 일이 늘어난다.



24. 완벽한 프로그램은 완벽한 시간과 돈을 필요로 한다.

미국의 국가 예산을 무제한으로 사용하는 NASA마저도, 아직 시간과 돈이 부족하다고 한다.



25. 눈으로 훑어볼 틈이 있다면 움직여라. 뇌세포보다 CPU가 더 해석이 빠르다. 그리고, 그 사이,

쉴 수 있다.



26. 불편함을 버그라고 부를 것인가, 사양 상의 제한 사항이라고 부를 것인가는 남겨진 개발일자와

납기일에 의해 결정된다.



27. 정장 대신 캐쥬얼을 입고 출근하는 "캐쥬얼 데이"를 세간에서는 휴일이나 공휴일이라고 부르는

것 같다.



28. 프로그램은 머리로 기억하지 않는다. 몸으로 기억한다.



29. 내일 쉴 수 있다면 오늘 죽어도 괜찮다.



30. 고객은 거짓말을 한다.

영업은 꿈을 말한다.

시스템 엔지니어는 공상을 이야기한다.

프로그래머는 과묵해진다. (혼잣말은 많아진다)



31.「네, 할 수 있습니다」라고 말하기 전에 10초만 곰곰히 다시 생각해보라.



32. 프로그래머는 1분 생각하고 1일을 코딩에 소비한다.

1시간 생각하고 1시간 코딩하는 대신에 말이다.



33. 납품 이후의 디버그는 버그를 부른다.



34. 세 개의 디버그는 하나의 버그를 낳는다. 이것을 버그의 엔드리스 루프라고 한다.



35. 안 좋은 예감은 반드시 적중한다. 그러나 프로그래머는 그 안 좋은 예감에 반응하지

않는다. 그것은 시스템 엔지니어의 일이다.



36. 아수라장을 해결할 수 있는 방법은 오직, 고객이 돈을 지불하는 것 뿐이다.



37. 아마추어는 버그발견의 천재이다.



38. 아, 그건 마이크로소프트에서만 가능한 주문입니다.



39. 프로그래머가 불만이라고 생각하는 부분은 고객도 반드시 불만이라고 생각한다.



40. 건강하기 때문에, 건강을 해친다.



41. 그건, 당신이 말한 요구조건입니다만.



42. 아, 개발실의 창문은 안 열립니다. 그 이유는 옛날에 한 프로그래머가 그 창문에서···



43. 고객은 최악의 사태를 믿지 않으며, 그 사태에 대한 준비를 악질적인 비용청구라고 생각한다.

시스템 엔지니어는 최악의 사태를 대비하고 준비하려 한다.

프로그래머는 최악의 사태를 누구보다 잘 예상하지만, 무시한다.



44. 만약 다른 직업을 갖게 된다면, 정시퇴근을「도망」이라고 부르지 않는 직업이 좋을 것 같다.



45. 시스템 엔지니어가 프로그래머에게 말하는「상식」은 3시간마다 변한다.



46. 최소한 자기가 쓴 시방서는 읽어주세요.



47. 고객이 시스템 엔지니어에게 사랑받는 방법은, 시스템 개발에는 시간이 곧 돈이라는 사실을

깨닫고 빨리 최종요구조건을 확정하는 것이다.



SE가 고객에게 사랑받는 방법은, 프로그래머에게 미움받는 것이다.



48. 납기일이란, 작업현장이 우리 회사에서 고객의 회사로 바뀌는 날을 의미한다.



49. 가끔 일어나는 버그는 버그가 아니다. 스펙이다.



50. 개발비의 30%는 프로그램의 요구조건을 확정하는데 사용된다.

개발비의 30%는 프로그램의 요구조건을 변경하는데 사용된다.

개발비의 30%는 프로그램의 버그를 잡는데 사용된다.

개발비의 10%만이 프로그램의 개발에 사용된다.
Sub ... End Sub, Function ... End Function  둘의 차이점

공통점
- 특정 부분의 작업을 수행한다.
- 계산이나 작업의 처리를 위해서 필요한 값을 넘겨받을 수 있다.

차이점
- Sub 는 작업을 처리하지만, 결과값을 리턴시키지는 않는다
- Sub 는 작업의 처리를 위해서 일정한 자료를 받거나 받지 않을 수 있다.
- Function 은 작업을 수행하고, 결과값을 리턴한다.
- Function 은 작업의 처리중에 필요한 자료를 함수에 전달해야 한다.
- Function 은 작업의 결과를 리턴하기 위해서는 함수와 같은 명칭의 변수명에 값을
  넣어서 되돌려 보내야 한다.

호출예
- Sub : <% Call Sub_name(값)%>
- Function : <% 변수명 = Finction_name (값)%>

create table tablenameA(n int)

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

declare @tablename sysname,@sql nvarchar(4000),@ret int

set @tablename = 'tablenameA'
set @sql = N'select @r = count(*) from ' + @tablename
exec sp_executesql @sql,N'@r int output',@r = @ret output

select @ret

/*
------------
0
(1 적용됨)
*/

+ Recent posts