반응형

C# .NET : SQLLocalDB

배경

 인터넷 네트워크는 아니지만, 응용프로그램에서 내부적인 DB를 저장하고 사용해야 하는 경우가 종종 있다. 이 경우 DB의 비중은 비교적 낮기 때문에 DBMS의 크기가 작으며, 많은 기능이 필요로 하지않는다.

 최근 임베이디드 환경의 프로젝트를 진행을 하고 있다. 임베이디드 같이 근거리 통신에 디바이스간 통신에 대해서 다룰 경우에는 이 처럼 작은 DBMS가 더 적합하다.



SQLLocalDB 설치 방법

 간단하게 말하면 SQL Server를 설치하면 된다.


 MS SQL Server 2008 부터 express 버전에서부터 사용할 수 있게 해 놓았다(혹시 필자가 잘못 알고 있다면, 알려 주기 바람). 이 글을 기록하는 시기에서는 MS SQL Server 2017 Express 버전을 설치하면, 무료로 사용이 가능하다.


 다만, 설치가 옵션으로 설치되는 것이라서 설치과정중 구성요소에서 설치 체크를 해야한다.


 SQL Server 2017이 리눅스와 OS X 등에서 크로스 플랫폼으로 사용이 가능하다고 홍보를 하고 있지만, exe 파일로 제공되니 차후 재 빌드 파일이 나오지 않는다면, DOTNET Core로 실행해야 할 가능성이 있다.


 설치가 정상적으로 이루어지면, Visual Studio 2017 등 에서 바로 사용이 가능하다.



SQLLocalDB의 호환성

 당연한 이야기이지만, SQL Server와 달리 닷넷 환경에서 사용이 가능하고 현재로써는 Windows 에 국한이 되어 있다. 그리고 우리가 모르는 사이에 Windows에서 이미 SQLLocalDB를 사용하고 있다. 때문에 배포 환경이 Window 10 이라면, 웬만하면 따로 프로그램을 설치 하지 않아도 사용이 가능하다.


 여기 까지는 MS사의 설명이지만, 실제로는 배포하는 프로그램의 경우 가능 하면 사용을 자제하는 것이 좋다. 이유는 배포 환경에 대해서 완전한 독립성을 보장을 해주지 않는다. 이는 다시 말하자면, 어떤 PC에서는 정상적으로 DB인스턴스가 생성되어 사용이 가능하지만, 어떤 PC에서는 적절한 DB인스턴스가 생성되지 않는다.


 이를 해결하기 위해서는 MS Sql Server 를 설치해야 하는데, 배포하는 프로그램에서 갑자기 Sql Server를 설치하라고 하는 것은 다소 무리가 있다. 연습용으로만 사용하자.



필수도구

 쉽게 관리하기 위한 툴로 SSMS(SQL Server Management Studio)을 사용할 수 있다. 초기 시작할때 "(LocalDB)\MSSQLLocalDB" 로 접속을 하면, PC에 있는 mdf 확장자를 가진 데이터베이스를 확인할 수 있다. 수정에는 제약이 있지만(아마도 Express 버전이라서), 대부분의 내용을 확인이 가능하다.


 "sqllocaldb.exe"라고 하는 유틸리티가 대부분 기본적으로 Windows에 설치되어 있다. 못 믿겠다면, 당장 powershell 이나 cmd 에서 명령어를 사용하면, 도움말 정보를 띄우는 것을 확인 할 수 있다. 이 유틸리티를 통해서 응용프로그램에서 사용하는 mdf 파일에 접근하는데 필요한 디비 인스턴스를 관리 할 수 있다.



오류 사례

다른 PC에서 Access 거부

 개발 PC가 아닌 다른 PC에서 mdf 파일에 접근이 안되는 경우가 있다. 필자도 이 문제로 많은 시간을 버렸다. 일단 필자의 경우 sqllocaldb.exe 를 통해서 확인 해본 결과 실행이 안되는 PC에서 생성된 "MSSQLLocalDB" 인스턴스 버전은 v13.0 으로 생성된것에 반해 개발 PC에서는 v14.0 으로 생성이 되었었다. 그리고 개발 PC에서만 실행이 되었다.


 하지만, 자택에 있는 다른 PC에서 같은 소스코드로 mdf 만 새로 생성해서 다시 개발환경이 아닌 PC에서 실행을 해본 결과 실행이 잘되었다(역시 sqllocaldb.exe 로 "MSSQLLocalDB" 인스턴스 정보를 확인해보니 v13.01.. 으로 생성된 것을 확인 할 수 있었다).


(상단이 초기 개발 PC, 하단이 자택 PC)



 필자의 기억에 의하면, 먼저 잘 안된 PC 환경에서는 Visual Studio 2017 installer 에서 sql server 관련 패키지를 설치한 것 외에는 차이가 없었다. 앞으로는 개선이 되겠지만, 배포를 위해서라도 sql 관련 패키지를 visual studio 2017 installer 로 설치하는 것은 자제하자.



Git에서 mdf파일의 커밋제외

 그리고 git 을 사용할 경우 gitignore 파일 목록중에 mdf 확장자는 커밋에서 제외가 되니 이부분을 주의 해야한다. visual studio의 솔루션 창에는 보이지만 실제로는 존재하지 않는 파일이 되어 버린다.



참고자료




반응형

'C#' 카테고리의 다른 글

C# : using문의 기능과 활용  (0) 2018.05.15
C# .NET: Dispose (소멸자) 패턴  (0) 2018.05.14
C# : this와 base  (0) 2018.02.20
C# Winform : Detect Resize (크기 변화 감지)  (0) 2018.02.07
C# : Queue VS ConcurrentQueue  (0) 2018.02.02
반응형

C# : 닷넷에서 Broadcast UDP를 보내기(1)

알게된 배경

회사에서 임베이드 분야로 소켓 프로그램을 만들어야 할 일이 있었다. 물론 디바이스 단이 아니라 클라이언트 단의 프로그램이다. 임베이드 분야는 통신을 주로 실시간으로 해야 하며, 단거리 통신을 많이 하기 때문에 TCP 통신보다는 UDP 통신을 많이 사용한다. 특히 동시에 여러대의 디바이스에 신호를 주기 가장 적합한 방식은 Broadcast UDP 방식이다.


Broadcast UDP 란?

이름대로 특정망에 연결된 기기들에게 거의 동시에 동일한 UDP신호를 정해진 포트로 보내는 방식이다. 여기서 거의 동시라는 건 라즈베리 파이같은 기기로 테스트해 본 결과 0.01초 내외의 오차가 있다. 이는 디바이스의 상태와 성능에 따라 조금씩 차이가 있는 것으로 보인다.


Broadcast UDP 원리

사실 원리라고 말하기는 애매하고 규약이라 보는 것이 나을 것이다. 규약조건은 IPv4 기준으로 망을 제공하는 네트워크의 서브 마스크에서 허용되는 IPv4 주소의 비트가 1이 되게 보내면 해당신호는 Broadcast로 인식이 된다. 따라서 Broadcast UDP를 보내기 위해서는 해당 네트워크 망의 서브넷 마스크와 네트워크 제공 IP주소 체계를 알아야 한다.


[보조 설명] 서븐넷 마스크와 Broadcast UDP

서브넷 마스크 주소체계의 고정값과 비고정값을 구분하는 기준이라고 생각하면 된다. 마스크라는 단어의 의미 자체가 가면 혹은 가린다는 뜻이다. 네트워크의 신호는 주로 비트로 표현이 되는데, 마스크의 비트가 1일 경우 해당 값은 가려지는 것이고, 반대로 0 이 되는 부분은 가려지지 않은 값이다.

즉, 255.255.255.0 이라고 할경우 255는 비트상 모두 1이 되어서 255가 되는 부분은 가려져서 내부망 주소에서 구분을 하지 않는다. 반면 0인 부분은 8비트를 가리지 않아서 이론상 0~255의 주소를 구분할 수 있다.

다만, 서브마스크로 가려지지 않은 모든 비트값이 1이 될 경우에는 받는 UDP신호는 Broadcast UDP로 인식이 되어서 특정 IP가 아닌 모든 디바이스에 동일하게 전송하도록 약속이 되어 있다.



소스코드

Broadcast UDP의 규약과 구글 검색을 통한 MSDN 문서를 좀 더 찾아보면 간단히 찾아 볼 수 있다. 물론 스택오버플로어의 내용에다가 약간의 문자열을 파지 하는 방법도 있지만, 가능하면 MS에서 만들어 놓은 class를 활용을 해보도록 하자.


using System;
using System.Net.NetworkInformation;

class Program
{

// print ip address, submask
private void PrintIpAddressAndSubmask()
{
    NetworkInterface[] netInter = NetworkInterface.GetAllNetworkInterfaces();
    foreach(var itInter in netInter)
    {
        // 인터넷 혹은 망에 연결된 것만 남김
        if(itInter.OperationsalStatus != OperationalStatus.Up)
            continue;
        // 유선(Ethernet)과 무선(Wireless80211)만 남김
        if(itInter.NetworkInterfaceType != NetworkInterfaceType.Ethernet
            && itInter.NetworkInterfaceType != NetworkInterfaceType.Wireless80211)
            continue;
        var unicast = itInter.GetIpProperties().UnicastAddress;
        foreach(var itUnicast in unicast)
        {
            // Ip v6는 걸러냄
            if(itUnicast.IPv4Mask.Address == 0)
                continue;
            console.writeLine("\tIp Address : {0}", itUnicast.Address);
            console.writeLine("\tSubnet Mask : {0}", itUnicast.IPv4mask);
        }
    }
}

}





참조 자료

MSDN : UDP 서비스 사용 문서
MSDN : NetworkInterface 클래스



반응형

'C#' 카테고리의 다른 글

C# Winform : Detect Resize (크기 변화 감지)  (0) 2018.02.07
C# : Queue VS ConcurrentQueue  (0) 2018.02.02
C# : const vs readonly  (0) 2017.10.25
C# 싱글톤 패턴 상속용 클래스  (0) 2017.09.29
C# 싱글톤 패턴 : 동적 싱글톤  (0) 2017.09.04

+ Recent posts