전산이야기

홈택스 전자세금계산서 연동 기능을 제공해주는 업체의 API를 테스트 하기 위하여 제공된 DLL을 참조 시키고

테스트 코드를 작성한 후 컴파일을 시도 했으나 다음과 같은 오류가 발생 하였다.

 

참조된 어셈블리 "Popbill.dll"이(가) 현재 대상 프레임워크 ".NETFramework,Version=v4.0,Profile=Client"에 없는 "System.ServiceModel.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"에 종속되어 있기 때문에 참조된 어셈블리를 확인할 수 없습니다. 이 문제를 해결하려면 (1) 이 프로젝트의 대상 프레임워크를 변경하거나 (2) 프로젝트에서 참조된 어셈블리를 제거하십시오.

해결을 위하여 시행착오를 겪다가 인터넷을 통해서 원인을 찾았다.

프로젝트 속성 중 대상 프로임워크가 .NET Framework Client Profile 로 되어 있었기 때문 이었다. Client Profile은 사용자를 위한 런타임 이기 때문에 Visual Studio 에서 컴파일 시에 사용할 수가 없다고 한다.

대상 프레임워크를 .NET Framework 4 로 변경 하고 저장 후, 프로젝트를 다시 오픈 한 다음 컴파일 하니 정상적으로 되었다.

동일한 증상 있으신 분은 참조 하시기 바랍니다.

Comment +0

SSMS 이전버전에서는 로그인 암호 파일이 별도로 있어서 해당 파일만 삭제 하면 해결 되었으나,

(SQL 서버 2008 SSMS 로그인시 암호저장이 잘 안될때 참조)

SSMS v.18에서는 해당파일 자체가 존재 하지 않아서 기존방법으로는 자동로그인 된 정보를

삭제할 수가 없습니다.

 

해결방법은 의외로 간단한데, 

로그인 화면에서 '로그인(L):' 드롭박스를 클릭해서 나오는 리스트에서 원하는 로그인명을 Del  키로 삭제하면 됩니다.

삭제 후 다시 로그인과 암호를 입력하고 '암호 저장'에 체크를 해서 성공적으로 로그인이 되면 암호저장이 정상적으로 됩니다.

저는 처음에 이걸 몰라서 좀 애를 먹었다는...^^

Comment +0

아시는 바와 같이 임시 테이블은 #(로컬) 및 ##(전역)이 prefix로 붙은 테이블 입니다.
그리고 테이블변수는 TABLE 타입으로 DECLARE된 로컬변수 입니다.
 
둘 간에 여러가지 차이점이 있지만 여기서는 성능적인 이슈만 언급 하겠습니다.
테이블변수의 문제는 SQL서버가 통계정보를 생성하지 않기 때문에 적절한 실행계획 수립이 안될 수 있다는 점 입니다.
 
아래는 테이블변수를 사용한 특정 SP의 실행계획 입니다 (처리속도는 14초).

NL JOIN 으로 처리되어 과도한 Execute, Rows가 나왔습니다. SQL 서버가 NL을 선택한 것은 예상 행수가 모두 1 이기 때문 입니다.
예상 행수가 1:1 이기 때문에 NL로 처리해도 아무 문제가 없다고 판단이 되었습니다.
실제 테이블변수의 행은 1067 입니다.
 
이제 다른것은 그대로 두고 테이블변수를 임시테이블로만 변경한 후, 다시 실행계획을 확인 해봅니다 (처리속도는 6초).

이번에는 HASH JOIN 으로 처리 되었습니다. 이유는 예상행수가 1067, 617 이기 때문 입니다.
1067건과 617건을 NL JOIN 으로 처리하면 부하가 크다고 판단하고 HASH로 JOIN 전략을 변경한 겁니다.
 
결론적으로 일반적으로 행수가 적은 경우는 테이블변수를 사용해도 무관하지만, 크기가 큰 경우는 임시테이블을 사용해야 성능이슈가 발행하지 않게 됩니다.
 
 

 

Comment +0