[.NET] The true face of .NET (1)

2009년의 글을 블로그 이사를 하면서 옮긴 글입니다.
개인적인 생각을 적은 내용으로 돌아보니 조금은 낯간지러운 글이네요.
틀린 부분이 있더라도 많은 부분 수정 없이 그 당시의 지식을 유지하겠습니다.  귀엽게 봐주십시오.

.NET 의 실체 (1)

나 자신이 보지 못했던 컴퓨터 환경에서 부터 지금까지.. 아직도 널리 퍼져있는 문제들이 어떤 것들이 있는 지부터 살펴보는 것이 좋을 듯 합니다.

      1. 사용자들의 요구 사항은 폭발적이다.
      2. 웹은 이질적이다.
      3. 서버 메모리에 아무리 돈을 쏟아부어도 메모리는 부족하다.
      4. 버전을 관리할 수가 없다.
      5. 보안… 좀 몰래 들여다보지 좀 마라.
      6. 지금까지 개발된 COM 은 어떻게 할 것인가? 상호운용 되어야 한다.

지금 생각나는 것은 이 정도 입니다. 아래 설명은 위 사항들에 대한 부연 설명입니다.
읽기 귀찮으신 분은 걍 넘어가셔도 됩니다.(나 같은 단무지-단순무식 같은 사람들은 이런 장문은 읽기 귀찮다. 그런데 또 쓰자니… 읽는 사람 생각 안하고 길게 쓰게 되더라… ^^;)

1. 사용자들의 요구사항은 폭발적이다.

기술 교과서에서 본 집채 만한 컴퓨터가 나오기 전부터 항상 요구 사항과 문제점은 발생했을 것이고, 그 요구 사항들과 문제점을 개선되기 위해서 Hardware와 Software 의 기술은 계속해서 발전을 거듭했습니다.
거대한 계산기에서 personal 컴퓨터로 발전을 하고 그런 하나의 단세포생물 아메바와 같던 개인의 desktop 은 서로 얽히고 설키며 Network 으로 연결되어 이젠 인터넷은 사람들의 생활 깊숙이 자리 잡았습니다.
desktop 뿐입니까? 우리 주위의 모든 기기들(휴대폰, 냉장고, 아파트마저도-기계는 아니지만…)은 모두 network 에 연결되어 사람들을 거미줄로 꽁꽁 묶어버리려 하고 있습니다. (컬럼쓰냐? ㅡㅡ;;;)
되지도 않는 말주변으로 이런 이야기를 하는 이유는 우리 생활이 점점 더 발전을 하면서 발생되는 사람들의 요구 사항들이 기하급수적으로 늘어나는 것을 이야기 하기 위해서 입니다.
사람들은 주위에 널려져 있는 network 을 사용하고 싶어할 것이고 모든 일을 network 을 통해서 쉽고 빠르게 해결하려 할 것입니다. 사용자들이 사용하는 그 많은 데이터들을 처리하기 위해 Hardware 또한 발전할 것이고 처리속도와 처리량은 기하급수적으로 늘어날 것입니다. 또 network 을 사용하면서 언제 어디서나 내가 원하는 곳에 연결할 수 있지만, 반대로 악의의 사용자에 의해 그 정보가 노출되기를 원하지는 않습니다. 이런 요구 사항은 기술의 발전을 낳고 개발자에겐 새로운 꼼수를 만들게 합니다. (고로 꼼수도 기술이다. 라고 말할 수 있을까? ㅋㅋㅋ)
정보를 처리하기 위해서 개발자들은 자신이 개발하는 데있어서 효율적인 언어를 선택해야 했고 다른 개발자들이 사용하는 언어를 폄하하기도 했습니다. (아직도 그렇지… java가 쵝오야! vb는 thread 기능을 사용할 수 없어! VB는 쥐나 개나 다해! ㅡㅡ; 내가 쥐, 개란 말인가? )
세상의 개발자들이 꼼수로 처리할 수 있는 정보의 양은 한정되어있었고 그런 꼼수를 줄이기 위한 여러가지 기술들이 나타나게 됩니다.

2. 웹은 이질적이다.

그 중에 하나가 MS 에 의해 명명된 대표적인 기술 COM 입니다. (이미 알려진 기술을 멋진? 단어로 재 생산하지 않는가? 마치 자신이 탄생시킨 것처럼… 하긴 Windows 진영만을 이야기 한다면 그 말도 맞지 않을까?. ^^)
이제 COM을 사용하면 개발자들은 처음부터 개발할 필요가 없어졌습니다. 획기적이지 않습니까? third party 에서 만들어 놓은 컨트롤을 사다가 내가 작성한 logic 과 연결만 시키면 됩니다. 그 제품의 내부가 어떻게 구현되어있는지 알 필요도 없습니다.(우린 발생하는 버그에 제품을 욕하기도 한다… 어떤 때는 버그에 못견디고 인터넷을 뒤져 컨트롤을 만들어 버리곤 하지..ㅡㅡ;)
우리의 친구 visual Basic은 COM 의 상승세를 타고 무한히 발전하는 듯 보였습니다. (요놈만이라도 잘해보좌~~)
잔머리도 많이 줄어드는 듯 했습니다. (사실 많이 줄었다. ㅡㅡ)
하지만 이러한 환상적인 COM 도 문제점을 가지고 있었다.
두가지나 된다고 합니다. (완벽한 줄 알았던 넘인데…)
한가지는 COM은 각각이 떨어져 있는 클라이언트/서버에서 동작한다는 것(최소한 얼마라도…)과 COM 의 내부 구현을 공유하는 것이 아니라 인터페이스를 통해 서로 통신한다는 점입니다. 그렇기 때문에 COM 간의 통신을 위해서 특정 메카니즘을 구현하고 있어야 하고, COM 인터페이스는 구현하는 Language(VB, C++) 에 따라서도 다르다는 단점을 가지고 있습니다.
그래서 VB 로 제작된 COM을 C++에서 사용한다거나 C++로 만든 COM 혹은 JAVA 로 제작된 CORBA 를 사용하기 위해서는 별도의 Mapping? 을 통해서 그 차이점을 줄이기 위해 별도의 작업이 필요합니다.
이런 작업들로 더? 많은 작업들을 추가로 하고 있습니다 (배보다 배꼽이 크다면… ㅡㅡ; 포기하고 같은 언어로 하시죠 라고 말한다. ㅡㅡ)
우리 개발자들.. 특히 우리는 이 세상 많은 사용자들이 모두 windows 만 사용했으면 좋겠다고 생각할 것이다. (아니 windows 가 아니라 linux 라도 좋다. 제발 하나만 써다오.)
(위를 보니 너무 많이 썼다. 아래 내용은 아시는 내용이 많을테니… 양을 줄이련다. ㅡㅡ;)

3. 서버 메모리에 아무리 돈을 쏟아부어도 메모리는 부족하다.

우리 서버는 많은 사용자들이 요구하는 수많은 데이터를 처리하느라 늘 바쁩니다.
그런 서버에게 개발자는 친절히 메모리 할당과 해제를 친절히 능숙하게 해야 하는 기본적인 의무를 가지고 있음에도 불구하고… 잠시 음주 코딩으로, 졸음 코딩으로 의무를 다하지 못하는 상황이 간혹 발생합니다. 그로 인해 서버의 메모리 누수는 계속 발생하여 종래에는… “수고하셨습니다~~.” 서버를 다시 켜야 하며 이런 상황이 발생하지 않더라도 서버관리자는 추후에 발생할지도 모르는 서버의 살해 사건 방지를 위해 주기적으로 부팅시켜주는 일을 하고 있습니다.

4. 버전을 제대로 관리할 수가 없다.

우리가 프로그램을 제작을 하게 되면 배포 version 을 제작하는 그 순간부터 발생하는 버그를 수정하게 되고 곧 새로운 version 의 프로그램을 제작하여 Patch 하거나 새 제품을 출시하게 되는데 이 때 이전 버전의 제품과 호환을 될 수 있도록 또 하나의 작업을 합니다. 그리고 버전 관리를 위해 표준 메카니즘이 필요합니다.
(게다가 COM 의 문제점인 DLL Hell 도 한몫 거들고 있다.- version 이야기 하니까 갑자기 생각나네…)

5. 보안… 좀 몰래 들여다보지 좀 마라.

우리는 최근 인터넷을 통해서 많은 일을 하게 되었습니다. 업무를 보고, 인터넷 뱅킹을 통해 현금을 송금하고, 물건을 구입하고 게임도 하죠. 이때 보안은 필수적인 것이 될 것입다.
우리가 browser 를 통해 설치하는 ActiveX 컨트롤은 그 힘이 막강하여 한번 깔리게 되면 내 PC 를 내어주는 것이나 다름 없이 모든 권한들 가지고 내 PC를 제어?할 수 있습니다. 이 것은 사용자에게 편리하긴 하지만 그리 좋은 상황은 아닙니다. 그런 프로그램은 하는 역할에 합당한 권한이 주어져야 하기 때문이죠. 특정 파일에 접근하여 쓰지는 못하되 읽을 수만 있게 하도록 설정할 수 있는 방법이 필요합니다.

6. 지금까지 개발된 COM 은 어떻게 할 것인가? 상호 운용되어야 한다.

우리는 그 동안 환상적이었던(아직도 환상적이기는 한) COM을 많이도 만들었습니다. (내가 만든 것 또한 Test 프로그램을 포함해서 너무 많이 만들지 않았나? ^^;)
이런 COM 을 일시에, 한번에, 무자비하게 다 없애 버릴 수 있을까요?
함께 써야 합니다… 내가 만든 COM 을 사용할 수 있어야 합니다.
비싼 돈주고 산 third party control 들을 이젠 못쓰니 다른 버전으로, 또는 다른 제품으로 사달라고 하면 어떤 사장님이 좋아할까요? 계속 불평하는 당신 대신 기존에 산 third party control 을 쓸 수 있는 사람을 구할 수도 있지 않을까요? ^^;

지금까지 위에서 생각난대로 정리한 문제점 6가지 내용에 대해 긴 글을 정리해봤습니다.
다음은 위 문제점들을 해결하기 위해 나온 .NET 에 대한 이야기를 해보겠습니다.

 

행복한 고수되십시오.

WooGong ))*
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

출처: https://www.jumptovb.net/tag/.NET?page=9 [Jump To VB.NET:티스토리]

[MS SQL] Common Table Expression (CTE)

Oracle 의 Subquery Factoring 기능을 MS SQL 은  2005 버전부터  Common Table Expression (CTE) 이라는 이름으로 기능을 제공하기 시작했습니다.

Common Table Expression (CTE)

Oracle 의 Subquery Factoring 기능을 MS SQL 은  2005 버전부터  Common Table Expression (CTE) 이라는 이름으로 기능을 제공하기 시작했습니다.
 
아래 쿼리는 https://database.sarang.net 사이트에서 발췌했습니다.
WITH MYCAL AS 
( 
    SELECT 
        CAST('1900-01-01' AS DATETIME) DT
        , IDX = 1
    UNION ALL 
    SELECT 
        DT + 1 
        , IDX + 1
    FROM MYCAL 
    WHERE 
        DT + 1 <= '2050-12-31' 
) 
SELECT 
    IDX
    , [DT]
    , [DT_1]  = DATEADD(DD, -1, DT) 
    , [YMD]   = CONVERT(CHAR(8), DT, 112)
    , [YY]   = DATEPART(YEAR, DT) 
    , [MM]   = DATEPART(MONTH, DT)
    , [DD]   = DATEPART(DAY, DT)
    , [WKDAY_SEQ] = DATEPART(DW, DT)  
    , [QTR]   = DATEPART(QQ, DT) 
    , [ANIMAL]  = CASE DATEPART(YEAR, DT) % 12 - 3 
    WHEN 1 THEN '자' WHEN 2 THEN '축' WHEN 3 THEN '인' 
    WHEN 4 THEN '묘' WHEN 5 THEN '진' WHEN 6 THEN '사'
    WHEN 7 THEN '오' WHEN 8 THEN '미' WHEN 9 THEN '신' 
    WHEN 10 THEN '유' WHEN 11 THEN '술' WHEN 12 THEN '해' END
FROM MYCAL 
OPTION (MAXRECURSION 0) 
이 쿼리를 MS SQL  에서 돌려보시기 바랍니다.
위 기능을 아래와 같이 사용할  수 있겠지요.
 
WITH MYCAL AS 
( 
    SELECT 
        CAST('37001' AS int) DT
        , IDX = 1
    UNION ALL 
    SELECT 
        DT + 1 
        , IDX + 1
    FROM MYCAL 
    WHERE 
        DT + 1 <= '87100' 
) 
INSERT INTO INSERTTEST
SELECT 
    IDX, 
    DT, 
    cast(IDX as varchar) + '_' + cast(DT as varchar) IDVALUE
FROM MYCAL 
OPTION (MAXRECURSION 0) 
행복한 고수되십시오.
 
WooGong ))*
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
 
출처: https://www.jumptovb.net/?page=194 [Jump To VB.NET:티스토리]

[Python] Python Virtual Environment Setting with pyenv-win on Window

Python Virtual Environment Setting with pyenv-win on Window
Windows 환경에서 pyenv-win 을 사용하여 Python 가상환경 구성

Windows 환경에서 pyenv-win 을 사용한 파이썬 가상환경을 구성하는 방법에 대한 기록을 남깁니다.

Windows 환경에서 pyenv-win을 사용하여 Python 가상환경을 관리하는 방법에 대한 블로그를 작성하기 위해, 다음 단계를 따라 진행할 수 있습니다. 이 블로그는 설치부터 가상환경 관리까지 모든 과정을 포함합니다.


Windows 환경에서 pyenv-win 을 사용하여 Python 가상환경 구성하기

Python은 다양한 프로젝트에서 사용되며, 각 프로젝트마다 다른 버전의 Python을 요구할 수 있습니다. 이를 효과적으로 관리하기 위해 pyenv-win을 사용하면 여러 버전의 Python을 설치하고 간편하게 전환할 수 있습니다. 이 블로그에서는 Windows 환경에서 pyenv-win을 설치하고 사용하는 방법을 단계별로 안내하겠습니다.

1. pyenv-win 설치

1.1. pyenv-win 다운로드

먼저, pyenv-win을 GitHub에서 다운로드합니다. Git을 설치한 상태여야 합니다.

 

git clone https://github.com/pyenv-win/pyenv-win.git %USERPROFILE%\.pyenv
git clone https://github.com/pyenv/pyenv-virtualenv.git %USERPROFILE%\.pyenv\plugins\pyenv-virtualenv

특정위치에 가상환경을 몰아 놓으려면 %USERPROFILE%.pyenv 를 수정하면 되겠죠?

실행시키면 아래와 같은 폴더가 생성됩니다. (저의 Profile 은 JH.Woo 입니다.)

1.2. 환경 변수 설정

pyenv-win의 실행 파일이 시스템의 경로에 포함되도록 환경 변수를 설정합니다.

 

setx PATH "%USERPROFILE%\.pyenv\pyenv-win\bin;%USERPROFILE%\.pyenv\pyenv-win\shims;%USERPROFILE%\.pyenv\plugins\pyenv-virtualenv\bin;%USERPROFILE%\.pyenv\plugins\pyenv-virtualenv\shims;%PATH%"

## setx PATH "%USERPROFILE%\.pyenv\pyenv-win\bin;%USERPROFILE%\.pyenv\pyenv-win\shims;%PATH%"
## setx PATH "%USERPROFILE%\.pyenv\plugins\pyenv-virtualenv;%PATH%"

위 명령어를 실행하면 시스템>고급시스템 설정> 환경변수> 사용자변수 에 다음과 같이 등록됩니다.

 

환경 변수가 적용되도록 Command Prompt를 다시 시작합니다.

2. pyenv-win 기본 사용법

2.1. Python 버전 설치

pyenv-win을 사용하여 원하는 버전의 Python을 설치합니다. 예를 들어, Python 3.8.10 을 설치합니다.

 

pyenv install 3.8.10

설치된 폴더는 아래 그림과 같네요.

2.2. 설치된 Python 버전 확인

설치된 Python 버전 목록을 확인합니다.

pyenv versions

pyenv versions 를 통해서 pyenv 로 설치해서 등록된 python version 들을 확인할 수 있습니다.
다른 where python 이나 py -0 명령어로 조회해 보면 pyenv 를 사용해서 등록한 python 의 모습은 볼 수가 없습니다.

Get-Command python* | Select-Object Name, Version, Source

powershell 의 명령어로도 찾을 수가 없군요.

2.3. 글로벌 Python 버전 설정

시스템 전체에서 사용할 기본 Python 버전을 설정합니다.

pyenv global 3.8.10

궁금해서 pyenv 로 설치하지 않은 기존의 python 과의 설정을 보려고 py -0 을 실행해 봤습니다.
골때리는 상황이 전개될 듯하군요.. ㅎㅎ

3. 프로젝트별 로컬 Python 버전 설정

3.1. 프로젝트별 로컬 Python 버전설치

일단 설치가능한 버전을 확인해 봅니다. MAC OS 와 동일한 명령어라서 마음에 듭니다.

pyenv install --list

그리고 3.10.11 version 을 설치합니다.

pyenv install 3.10.11

3.2. 프로젝트 디렉토리로 이동

프로젝트가 있는 디렉토리로 이동합니다.

cd d:\Python_Labs\Projects\Prj_31011

3.3. 로컬 Python 버전 설정

해당 프로젝트에서 사용할 Python 버전을 설정합니다.

pyenv local 3.10.11

3.4. 설정 확인

pyenv local 3.10.11 명령어를 실행시키고 pyenv version 을 실행시켜서 현재 Prj_31011 폴더에서 사용중인 python 버전이 아래와 같이 3.10.11 이 설정된 모습을 볼 수 있습니다.

다른 폴더로 이동했을 때 pyenv version 을 실행시키면 Global version 이 표시되는 걸 볼 수 있죠.

pyenv version

3.5. 설정 해결

 

하지만 python –version 을 확인해보면 아직도 3.12 버전이 표시되는 걸 볼 수 있습니다.
느낌적인 느낌적으루다가.. 환경변수를 수정해 주면 될 듯합니다.

이 곳에 등록되어 있는 환경변수를 삭제해 줍니다. 그리고 열려있는 command 창을 닫아주고 다시 열어줍니다.

이제야 해결됐네요..

3.12.0 이 설치되어 있는 상황인데도요..

 

속이 시원합니다. ^^

4. 가상환경 생성 및 관리

4.1. 가상환경 생성

pyenv-win과 virtualenv를 함께 사용하여 가상환경을 생성할 수 있습니다. virtualenv가 설치되어 있는지 확인합니다.
하지만 MAC OS 에 비해 좀 귀찮네요.

pip install virtualenv

특정 Python 버전을 사용하여 가상환경을 생성합니다.

pyenv shell 3.10.11
virtualenv virtualEnv_31011
## pyenv virtualenv 3.10.11 virtualEnv_31011 # MAC OS 와 다른점이에요.

windows 에서는 Pyenv-Virtualenv plugin 을 사용할 수 없습니다.
그래서 위와 같은 방법을 사용할 수 밖에 없어요.

4.2. 가상환경 목록 확인

생성된 가상환경 목록을 확인합니다.

## pyenv virtualenvs #Pyenv-Virtualenv plugin 을 사용할 수 없어서 MAC OS 에서 사용가능합니다.

4.3. 가상환경 활성화

생성한 가상환경을 활성화합니다.

virtualEnv_31011\Scripts\activate # 폴더위치 확인하세요... ^^
## pyenv activate myenv #Pyenv-Virtualenv plugin 을 사용할 수 없어서 MAC OS 에서 사용가능합니다.

4.4. Package 설치

가상환경이 활성화된 상태에서 pip 명령어를 사용하여 필요한 패키지를 설치할 수 있습니다. 예를 들어, requests 패키지를 설치하려면 다음과 같이 입력합니다.

pip install requests  

설치하고 나면 \virtualEnv_31011\Lib\site-packages 폴더내에 request 관련 libray 들이 설치되어 있는 것을 확인할 수 있습니다.

4.5. 가상환경 비활성화

작업이 끝난 후 가상환경을 비활성화합니다.

deactivate

4.6. 가상환경 삭제

필요 없는 가상환경을 삭제합니다.

rmdir /s /q virtualEnv_31011
## pyenv uninstall myenv #Pyenv-Virtualenv plugin 을 사용할 수 없어서 MAC OS 에서 사용가능합니다.

결론

이제 pyenv-win을 사용하여 Windows 환경에서 Python 버전과 가상환경을 쉽게 구성하고 관리할 수 있게 되었습니다.
다양한 프로젝트마다 필요한 Python 버전을 독립적으로 설정하고, 가상환경을 활용하여 패키지 충돌 없이 개발을 진행할 수 있습니다. pyenv-win은 Python 개발자의 생산성을 높이는 데 큰 도움이 됩니다.
하지만 Windows 에서는 pyenv 의 기능이 조금은 복잡하고 귀찮은 과정이 있네요..

여튼 재미나게 python 을 사용할 수 있게 되었습니다.

다음번에는 anaconda 의 환경 설정을 살펴보겠습니다.

행복한 고수되십시오.

WooGong ))*
\\\\\\\\\\\\\\\\