[.NET]Azure API APP에서 Swagger Framework 바로 사용하기

기존 웹프로젝트에 Swagger Framework을 사용하려면 프레임웍 패키지를 다운받아 설치하고 Swagger 실행을 위한 몇몇의 Config 셋팅을 하는 수고를 했어야 했다. 그런데 Azure에서 제공하는 Azure API APP Service 프로젝트를 생성하면 기본 셋팅으로 Swagger Framework이 설치 및 기본 셋팅이 되어 있는 것을 NuGet 패키지 관리자에 들어가 보면 다음과 같이 확인 할 수 있다.

기본 설치가 되어 있기 때문에 별다른 걱정 없이 바로 쓰기만 하면 된다.
정말인지 확인하기 위해서 새프로젝트를 만든뒤 바로 실행 해보자.

!?!? 권한이 없단다. 
이런 403.14 페이지를 보는 이유는 API는 Application Programming Interface이기 때문에 UI(User Interface)가 없기 때문이다. 그렇다면 어떻게 API에 대한 정보를 볼 수 있을 것인가? 이럴때 Swagger가 제 역할을 한다.

당황하지 말고 주소의 주소에 Swagger라고 뒤에 추가 해보면 Swagger에서 제공하는 Swaager.UI를 경험할 수 있다.
(예: http://localhost:54499/ → http://localhost:54499/swagger)

아래 그림은 새 프로젝트 만들고 예제로 들어가 있는 샘플코드에 대한 화면이다. 

그림에서 보면 알 수 있듯이 Swagger.UI에서 제공하는 정보들은 개발된 API에 대한 스팩 문서들이다.
이 문서들은 API 스팩 문서로 별도의 문서를 작성하지 않아도 개발자가 개발하면서 주석으로 정의해 놓은(Swagger 문법?에 따라서) 것들을 Swagger.UI를 통해서 단번에 확인 할 수 있다.

[.NET]HttpResponseMessage 클래스 메서드 오류 CS1061 해결 방법

프로젝트에서 API를 호출하고 나서 결과를 읽어 Model(Object)에 담을때 다음과 같이 코드를 한다.

그런데 간혹 잘 코딩 했다고 생각을 했어도 다음과 같은 오류 메시지가 나올 때가 있다. 

오류 CS1061 ‘HttpContent’에는 ‘ReadAsAsync’에 대한 정의가 포함되어 있지 않고, ‘HttpContent’ 형식의 첫 번째 인수를 허용하는 확장 메서드 ‘ReadAsAsync’이(가) 없습니다. 
using 지시문 또는 어셈블리 참조가 있는지 확인하세요. 

이런경우 참조 패키지가 잘 준비되지 않은 경우이다. 
먼저 NuGet Package에 들어가서 System.Net.Http 버전을 최신버전으로 업데이트 하고,bMicrosoft.AspNet.WebApi.Client 패키지가 설치 되어 있는지 확인 해본다. 아마 안되어 있거나 구 번전일 것이다.

install-package Microsoft.AspNet.WebApi.Client

설치 및 업데이트가 완료 되었다면 문제 없이 작동 할 것이다.

Visual Studio Code에서 Team Service 연결하기

Visual Studio Code(이하 VSCode)는 MS에서 제공하는 간단한 코드 편집기로 기존의 Visual Studio(이하 VS)에서 하던 컴파일 기능이나 프로젝트 구성등의 기능은 없지만 Javascript나 Typescript 등 스크립트 언어를 편집하기에 최적화되어 있는 코드 편집기다.

개인적인 생각으로는 Azure에서 사용하는 JSON 기반의 Template 코드들을 쉽게 저작할 수 있는 기능을 서버 관리자에게 제공하고 싶어서 나온게 아닐까 생각한다. 아무래도 서버관리자가 기존의 VS를 사용하기에는 너무 무거운 시스템이라 시스템 자원 운용에 필요하는 스크립트 코드나 Template 코드를 관리하기에는 고비용이기에 다른 편기기 툴(Vim, Edit+, 메모장 등)들을 사용하고 있었기 때문이다.

VSCode에서 프로그래밍 코드를 편집할 수 있게 되면서, 자연스럽게 Visual Studio Team Service(이하 VSTS)로 형상 관리를 할 수 있게 되었는데, 그 방법은 간단하다.

다운로드 링크 – https://code.visualstudio.com/

처음 VSCode를 설치하고 열면 다음과 같이 화면이 나온다.

좌측 세로로 나와있는 메뉴바에서 위에서 3번째 Source Control 메뉴를 클릭하면 Source Control 패널이 나오는데 처음에는 아무것도 없으므로 상단에 (…) 모양의 버튼을 클릭하면 SCM Provider 추가하기 메뉴가 나와서 VSTS를 확장 설치할 수 있도록 도와준다.

간단히 Install 버튼을 누르고 나면 수초내에 확장 설치가 완료될 것이다. 그리고 Reload 버튼을 눌러서 VSCode를 재시작 해주면 VSTS를 사용할 확장설치는 완료 된다.

이제 VSTS에서 관리하는 Repository와 연결하기 위한 설정을 해야한다.
좌측 하단의 톱니바퀴 보양의 아이콘을 클릭하면 설정(Setting)메뉴를 볼 수 있다. 설정 메뉴에 들어가면 사용자 설정(User Settings)라는 환경설정 파일을 볼수 가 있는데 검색 창에 ‘location‘이라고 검색하여 tfvc.loation 변수를 찾아 TF.exe 파일의 경로를 설정해 준다.

여기서 유의해야 할 점은 VS버전마다 TF.exe위치가 다를 수 있다. 여기서는 Enterprise 버전을 사용하였으며, 경로는 값은 ‘C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Enterprise\\Common7\\IDE\\CommonExtensions\\Microsoft\\TeamFoundation\\Team Explorer\\TF.exe‘ 이다.

이러면 Team Foundation Source Control을 실행할 상태가 되며, 다음으로는 local PC위치를 지정하여VSTS의 소스를 로컬에 저장할 공간을 선택한다.

셋팅이 완료 되면 다시 좌측 하단의 톱니바퀴를 클릭한다. 그러면 명령 팔레트(Command Palette)메뉴를 볼 수 있다. 명령 팔레트를 클릭하면 상단의 명령콘솔이 나오는데 VSTS에 로그인 하기위해 Team: Signin을 선택(Typing)한다. 그러면 VSTS에 접근할 수 있는 접근 토큰(Access Token)을 입력하는 곳이 나오는데 토큰을 입력하고 Sync를 수행하면 VSTS의 저장소에 있는 파일들을 로컬로 다운로드 한다.

싱크가 완료되면, VSCode와 VSTS가 연결이 완료된 것이다.
이제, VSCode에서도 프로그래밍 코드에 대한 형상 관리를 하면서 사용하면 된다.

-유의사항-
TF.exe 경로를 설정할때, 아래와 같은 오류 메시지가 보이는 경우가 있다.
(team) It appears you have configured a non-English version of the TF executable. Please ensure an English version is properly configured.

이것은 VSTS가 아직까지 다국어를 완벽하게 제공하는 것이 아니라 발생하는 것으로, 윈도우 언어 설정을 영문으로 변경하면 바로 해결된다.
(앞으로 업데이트 될 것으로 생각된다.)

서버 백업 / 복원하기

백업하기

전체 백업을 하기위해서 우선 루트 디렉토리로 간다.

$ cd /

tar을 이용해서 전체 백업을 한다.

$ sudo tar -cvpzf backup.tar.gz --exclude=/backup.tar.gz --one-file-system /

혹시 빼주고 싶은 파일이나 폴더가 있다면 exclude에 넣어주면된다.

--exclude=/[제외 폴더]

백업이 완료되면 루트 디렉토리 (/)에 backup.tar.gz이라는 파일을 볼 수 있다.
USB같은 외부 저장장치에 잘 보관해 두면 된다.

복구하기

루트 디렉토리에서 백업을 했기때문에 복구 할때도 루트 디렉토리에서 한다.

$ cd /

백업을 해두었던 tar파일을 압축을 풀어 복구한다.

$ tar xvpfz backup.tar.gz -C /

**앞에서 루트(/)디렉토리로 옮겨가라고 했지만 -C / 옵션을 사용한다면 다른곳에 저장되어 있어도 상관없다.

백업에서 제외햇던 디렉토리는 직접 만들어 준후 재부팅을 하면 복구가 완료된다.

$ reboot

추가 옵션 설명

​-z 압축 백업자료를 gzip을 이용하여 압축한다.
-c 생성 새로운 저장 파일을 만든다.
-v 수다 백업이 되고 잇는 파일 목록을 보여준다.
-p 퍼미션 보존 파일 보호를 위한 정보는 복구할 수 있도록 기억해 둔다.

Ubuntu에서 nvidia 그래픽 카드 드라이버 설치하는 방법

로그인 부팅하고 최초 로그인 화면에서 화면이 멈추다 깨지거나 로그인을 하고 x-window로드중에 시스템이 멈춰서 사용이 불가능 하는 경우, 그래픽 드라이버가 제대로 설치가 안된 것이다.

로그인 화면이 뜨는 순간 바로 Crtl + Alt + f1~6을 빠르게 눌러서 터미널 창에 접속한다.

(* 우분투도 2013년 4월25일 이후의 업데이트부터는 저장소에서 기본으로 지원합니다.)
그 다음 nvidia-current 패키지를 설치 하면 된다.

$ sudo apt-get install nvidia-current

재부팅을 하고 로그인을 하면 정상적으로 GUI환경에서 사용하실 수 있다.

USB 드라이브로 Ubuntu 설치 시 부팅이 되지 않을 때

USB로 우분투를 설치하는 경우, 부트로더에서 USB로 부팅을 하면 커서만 깜빡이고 진행이 멈춰버리는 증상이 나타날 때가 있다.

  1. USB이미지를 http://www.ubuntu.com에서 제공하는 툴로 설치 usb를 만든다.
  2. 윈도우 콘솔(cmd)을 띄운 후 diskpart를 입력하면 실행이 된다.
  3. list disk 명령어를 입력하면 현재 사용되고 있는 디스크 목록이 나온다.
  4. 목록 중 select disk #no 입력해서 우분투 설치 USB드라이브를 선택 한다.
  5. list partition 명령어를 입력하면 선택한 드라이브의 파티션 목록이 나온다.
  6. 목록 중 select parition #no 입력해서 설치 로더가 있는 파티션을 선택한다.
  7. active를 입력하고 list partition #no 하면 파티션 이름 앞에 *가 붙는다.
    (디스크 파티션이 활성화 되었다.)

다시 재부팅해서 USB로 부팅하면 설치가 잘 된다.

Can’t ssh localhost

ssh localhost를 하였을때, Read from socket failed: Connection reset by peer 라는 메시지가 튀어 나오면서 접속이 안되는 경우가 있다.

이경우 ssh_config파일을 죽어라 재설정 해도 잘 되지 않는다.
일단, 이 메시지가 나오면 포트를 확인해본다.

$ lsof -i:22

현재 LISTEN 상태인지 다른 프로세스하고 ESTABILISHED 되어 있는지 확인한다. 상태가 LISTEN이 아니거나 아무것도 안나오면 서버가 실행되지 않은것이고 다른 프로세스하고 ESTABILISHED되어있으면 해당 프로세스를 과감히 kill 해준다.

하지만

sshd    2750 root    3r  IPv4  15134      0t0  TCP *:ssh (LISTEN)
sshd    2750 root    4u  IPv6  15136      0t0  TCP *:ssh (LISTEN)

이런식으로 나올경우 서버 자체는 정상 작동하고 다른 프로세스하고는 연관이 없다. 그냥 재설치 하자.

재설치를 그냥 reinstall 옵션을 사용해도 좋지만 서버의 경우 설정파일이 그냥 남아 있는 경우가 있으므로, 제일 먼저 설정파일을 관리자 권한으로 모조리 삭제 해준다.

$ sudo rm /etc/ssh/sshd_config

그 다음은 purge 옵션으로 서버를 삭제 해주고 재설치를 하면 된다.

$ sudo apt-get purge openssh-server
$ sudo apt-get install openssh-server

이제 마지막으로 재부팅을 한후에 다시 실행하면 잘 접속 될 것이다.

Swap메모리 추가하기

메모리가 부족할 경우 시스템이 멈추거나 장애가 생긴다.
Ubuntu의 경우 Bus error이라는 메시지가 나오는 경우 보통 메모리 문제인데
이경우 Swap 메모리를 늘려주면 해결된다.

1. Swap 메모리를 늘리기 위해서는 root유저로 로그인 해야한다.

$ su - OR $ sudo -s

2. Swap메모리로 사용될 가상 파일을 생성해준다.

$ dd if=/dev/zero of=/swapfile bs=1024 count=3145728
#(**여기서 3145728는 1024*1024*3으로 나온것이며 3GB를 나타낸다**)

그러면 약 2~3분후 다음과 같이 결과가 나온다.

3145728+0 records in
3145728+0 records out
3221225472 bytes (3.2 GB) copied, 504.698 s, 6.4 MB/s

3. 만들어진 Swap 파일을 리눅스에서 사용할수 있는 메모리 형태로 만들어 주어야 한다.

$ mkswap /swapfile

그러면 Swap 메모리가 만들어진다.

Setting up swapspace version 1, size = 3145724 KiB
no label, UUID=cb9b919d-dfa9-406f-99e3-9717b7c96b51

4. 이제 만들어진 Swap 파일을 Swap 메모리 영역에 올려주면 된다.

$ swapon /swapfile

5. free명령어로 확인하면 가상메모리 (Swap)영역이 증가한 것을 확인 할 수있다.

         total      used    free    shared      buffers  cached
Mem:    738540    731124    7416         0         5828  371416
-/+ buffers/cache:353880  384660
Swap:  3145724         0 3145724

No-SQL Database 란?

No-SQL (Not only SQL) 시작

1998년 카를로 스트로찌(Carlo Strozzi)라는 엔지니어가 공개한 표준 SQL 인터페이스를 채용하지 않은 자신의 경량 Open Source 관계형 데이터베이스를 No-SQL이라고 명명한데서 유래되었다고 한며, 이후 2009년에는 요한 오스칼손(Johan Oskarsson)이라는 엔지니어가 Open Source기반의 분산 데이터베이스 관련 행사를 준비하면서 No-SQL이라는 용어를 널리 사용하기 시작하였다고 한다.​

초기 No-SQL은 기존의 관계형 데이터베이스 시스템의 주요 특성을 보장하는 ACID(Atomicity, Consistency, Isolation, Durability) 특성을 제공하지 않았다. 때문에 No-SQL이 등장한 이후에도 시장에서는 관계형 데이터베이스가 데이터를 처리하는데 가장 최적의 시스템으로 받아들여졌다.

기업 데이터의 정확한 처리가 필수적이기 때문에 기업 시스템에서는 현재도 관계형 데이터베이스를 훨씬 많이 사용한다. 무엇보다도 표준 SQL 이라고 하는 데이터를 처리하는 언어의 편이성 때문에 No-SQL 등 다른 데이터베이스 시스템들은 많이 활용 되지 않았다.​

2000년 후반으로 넘어오면서 인터넷이 활성화되고, 소셜네트워크 서비스(SNS)등이 등장하면서 관계형 데이터 또는 정형데이터가 아닌 데이터, 즉 비정형데이터라는 것을 보다 쉽게 담아서 저장하고 처리할 수 있는 구조를 가진 데이터 베이스들이 관심을 받게 되었고, 해당 기술이 점점 더 발전하게 되면서, No-SQL 데이터베이스가 각광을 받기 시작했다.

기존의 관계형 데이터베이스 보다 더 융통성 있는 데이터 모델이 요구되며, 데이터의 저장 및 검색을 위한 특화된 매커니즘이 필요 해지기 시작했고, No-SQL은 단순 검색 및 추가 작업에 있어서 매우 최적화된 키 값 저장 기법을 사용하여, 응답속도나, 처리 효율 등에 있어서 매우 뛰어난 성능을 내주면서, 비정형 데이터를 다루는 SNS, 머신러닝 등 AI 산업에 많이 사용되기 시작했다.

SQL VS No-SQL

SQLVSNo-SQL
정해진 규격에 의한 정적 정의Schema정해진 규격 없음. 동적 정의
가능Data Join불가능
표준SQL비표준
보장Transcation미보장
어려움Distribute쉬움

No-SQL 종류

1. Key-Value DB

  • Key와 Value의 쌍으로 데이터가 저장되는 가장 단순한 형태이다.
    (ex) Dictionary, Hash 자료 구조
  • 데이터를 하나의 불투명한 컬렉션으로 처리하며 각 레코드마다 각기 다른 필드를 가질 수 있는 Column Family 데이터 모델이다.
  • 선택적인 값들이 대부분의 DB에서처럼 placeholder로 표현되지 않기 때문에 Key-Value DB는 동일한 데이터베이스 저장을 위해 메모리를 훨씬 덜 사용하기도 하므로 특정한 부하에서 큰 성능 상의 이점이 있을 수 있다.

2. Wide Column DB

  • Key-Value DB에서 발전된 형태의 Column Family 데이터 모델을 사용한다.
  • 하나의 Row Key 안에 다양한 컬럼과 값을 저장 할 수 있도록 한다.
  • 대량의 데이터의 압축, 분산처리, 집계 쿼리 (SUM, COUNT, AVG 등)및 쿼리 동작 속도 그리고 확장성이 뛰어나다.

3. Document(-oriented) DB

  • 문서 데이터베이스는 JSON/XML 유사 형식의 문서로 데이터를 저장 및 쿼리하도록 설계된 비관계형 데이터베이스 유형으로 트리형 구조로 레코드를 저장하거나 검색하는 것에 효과적이다.

4. Graph DB

  • 18세기 오일러의 그래프 이론에서 시작되었다.
  • 데이터를 노드로 표현하며 노드 사이의 관계를 엣지로 표현한다.
  • 기존의 RDB로는 표현하기 어려웠던 각 데이터간의 연결점들을 이어주고 표현(Visualizing)해주는데 용이하다.

Inverted Search Index

검색엔진에서 많이 사용하는 방법인데, 검색엔진은 사이트의 모든 페이지를 검색 로봇이 검색해서 문서내의 단어들을 색인하여 URL에 맵핑해서 저장해놓는다.

Key Value
bcho.tistory.com/nosqlnosql, cassandra, riak
bcho.tistory.com/cloudamazon, azure, google
facebook.com/group/serversideamazon, google, riak
highscalability.com/bigdatanosql, riak
http://www.basho.com/riakriak

검색은 단어를 키로 검색이 되기 때문에, 위의 테이블 구조에서는 value에 검색 키워드들이 들어가 있기 때문에, 효과적인 검색을 할 수 없다.이 검색 키워드를 키로 해서 URL을 value로 하는 테이블을 다시 만들어 보면, 아래와 같은 식으로 표현되고, 검색 키워드로 검색을 하면 빠르게, 검색 키워드를 가지고 있는 URL을 찾아낼 수 있다.

KeyValue
riak bcho.tistory.com/nosql
facebook.com/group/serverside
highscalability.com/bigdata
http://www.basho.com/riak
nosql bcho.tistory.com/nosql
highscalability.com/bigdata

이렇게 value의 내용을 key로 하고, key의 내용을 반대로 value로 하는 패턴을 inverted search index라고 한다.