내리쬐는 태양, 물 한 방울 찾을 수 없는 사막 한 복판..

사막 한 가운데 멍하니 서있는 사내가 있다.

사내가 응시하는 곳에는 빨간 문이 서있다.

이미 남자는 무슨 일이 벌어질지 알고 있다는 듯 시간을 끌고 기다리고 있다.

 

1. 키보드 매핑 구성표 변경 방법

 

 

2. 단축키 모음.

  • 찾기, 바꾸기 등
    • CTRL + F : 현재 문서에서 찾기
    • F3 : 찾은 다음 문자열로 이동 <현재 문서>
    • CTRL + SHIFT + F : 전체 프로젝트에서 찾기
    • F4 : 전체 프로젝트 찾은 다음 문자열로 이동 <문서간 이동>
    • CTRL + H : 현재 문서에서 찾아 바꾸기
    • CTRL + SHIFT + H : 전체 프로젝트에서 찾아 바꾸기 => Ctrl + R + R 추천
    • Ctrl + R + R<이하 CTRL 유지> : 현재 함수명, 변수명 등 전체 프로젝트에서 이름 한번에 변경
    • Ctrl + G : 줄 번호로 이동
    • CTRL + ] : "{" 또는 "}" 위치에서 "{" 또는 "}" 반대 위치로 이동
    • CTRL + SHIFT + ] : "{" 또는 "}" 위치에서 해당 스코프 선택영역 지정
    • CTRL + SPACE : 자동 완성
    • F12 : 정의로 이동 
    • ALT + F12 : 정의 피킹
    • Ctrl + K + W : 책갈피 관리자
    • Ctrl + K + K : 책갈피 추가/해제 <Ctrl + F2 동일>
    • Ctrl + K + P : 이전 북마크로 이동 <F2 동일>
    • Ctrl + K + N : 다음 북마크로 이동 <Shift + F2 동일>
    • CTRL + - (대시) : 이전 커서 위치로 이동

 

  • 디버깅
    • F9 : 현재 줄 Break Point 설정/해제
    • F5 : 디버깅 시작
    • F10 : 프로시저 단위 실행 (한줄씩 디버깅 실행. 함수 내 진입하지 않음)
    • F11 : 한 단계씩 코드 실행 (한줄씩 디버깅 실행하며 함수 내 진입)
    • CTRL + F10 : 커서까지 실행
    • 조건부 중단점 (단축키는 아니지만)

 

  • 문서편집
    • Ctrl + TAB : 열린 문서간 전환
    • ALT + SHIFT + 커서이동 (또는 마우스클릭) : 가로세로 블록 영역 설정
    • CTRL + ALT + 아래화살표 : 열려 있는 파일에 빠르게 접근
    • Ctrl + X / C / V : 다들 알지만.. 선택 영역을 지정하지 않으면 현재 줄에 대해 가능하다는 건 숨겨진 기능 ㅎㅎ 
    • CTRL + D : 선택영역 없으면 현재 줄 복사/붙여넣기, 선택영역 있으면 선택영역 복사/붙여넣기
    • ALT + 화살표 위아래 : 현재 줄 위치 변경
    • CTRL + 화살표 위아래 : 화면 스크롤
    • CTRL + K + C : 주석 설정
    • CTRL + K + U : 주석 해제
    • SHIFT + ALT + ENTER : 풀 스크린 모드
    • CTRL + K + D : 현재 문서 전체 소스 코드 자동 정렬
    • CTRL + K + F : 선택 영역 소스 코드 자동 정렬
    • CTRL + U : 한 글자 또는 선택영역을 소문자로 변경
    • CTRL + SHIFT + U : 한 글자 또는 선택영역을 대문자로 변경
    • CTRL + M + M : 현재 스코프 영역 감추기 / 펼치기
    • CTRL + F4 : 현재 문서 닫기
    • CTRL + K + S : 코드 조각 (#if, #region, class 등으로) 코드 감싸기

 

 

3. 코드 조각 (코드 자동 완성) : 일부 타이핑 후 TAB + TAB 많은 것들이 있음.

  • CTRL + K + X => Visual C# : 조각(Snippet) 삽입
  • CTRL + K + B : 조각(Snippet) 관리자 <나만의 스니팻 모음을 만들어 사용하자!!!>
  • #if, #region + TAB + TAB : 자동 완성
  • class + TAB + TAB : 클래스 자동 생성 
  • cw + TAB + TAB : Console.WriteLine() 자동 생성
  • propfull + TAB + TAB : property 전체 자동 생성

 

 

4. 나만의 재활용 코드 만들기

  • CTRL + K + B : 조각(Snippet) 관리자에서 만들어 사용
  • 프로젝트 - 템플릿 내보내기 : 현재 프로젝트 또는 클래스 등을 템플릿으로 내보내고 신규 프로젝트 또는 항목 생성시 재활용. 

프로젝트 템플릿

 

항목 템플릿

 


 

  • 그외 찾고 싶은 것이 있다면 검색(CTRL + Q)을 활용해 볼 것!!!

솔루션에 dll 프로젝트가 같이 있음에도 컴파일 후 도구상자에 나타나지 않을 때

 

도구 - 옵션 - Windows Forms 디자이너 - 일반

  • 도구 상자 자동 채우기 : True

 

 

별거 없는데 막상 찾으려면 이상하게 해매게 되는 이미지 추출..

 

1) FormMain.cs 등 폼 파일을 확장 열기.

 

2) FormMain.resx 등 resx 파일 더블클릭

 

3) 원하는 이미지 마우스 우클릭 - "파일로 내보내기(X)"

속성이 ".resx에 포함됨"인 경우 상기와 같으며,

"컴파일시 링크됨"인 경우에는 프로젝트 리소스 폴더에 이미지 파일로 존재할 것임.

 

 

1) 도구 - 옵션 - 환경 - 일반

  • [  ] 클라이언트 성능에 따른 시각적 효과 자동 조정(A) 해제
    • [  ] 리치 클라이언트 시각적 효과 사용(E) 해제

 

2) C/C++/MFC IntelliSense 사용 안함

 

3) C# IntelliSense 설정

자주 사용하는 코드를 등록해서 반복 사용하기.

 

1) 등록할 코드를 마우스 드래그로 선택하고,

2) 도구 상자에 놓으면 추가 완료.

 

 

3) 항목이름 바꾸기로 이름 수정은 가능하나 내용 수정은 불가.

 

4) 등록된 항목을 드래그하여 코드에 넣거나

5) 항목을 더블클릭하면 커서 위치에 코드가 삽입됨.

 

 

원인은 여러 가지가 있는데, 여기에서는 CButtonST와 같이 static이 많이 사용되는 경우 Stack 개수 초과 오류 해결 방법.

 

1) 발생

2) 해결방법

  • 프로젝트 속성 : 링커 - 시스템
  • 스택 예약 크기 조정.
  • 기본은 1048576 (1M = 1024x1024) -> 10485760 (10M)

툴바에서 "솔루션 플랫폼"이 사라졌을 경우 다시 보이게 하기.

 

  1. 단추 추가/제거(A) - 사용자 지정(C)
  2. [명령 추가(A)...]
  3. 솔루션 플랫폼 선택하고 [확인]
  4. 솔루션 구성 밑으로 적당히 배치

용량을 많이 차지하는 sdf 파일과 /ipch 폴더 위치를 변경하는 방법.

소스 압축시마다 지워줘야 하는 번거로움 사라짐.

 

1) 메뉴 - 도구 - 옵션(O)

 

2) 텍스트 편집기 - C/C++ - 고급

  • 항상 대체(fallback) 위치 사용 : False -> True
  • 대체(fallback) 위치 사용 시 경고 표시 안 함 : False -> True
  • 대체(fallback) 위치 : C:\_TEMP\

nextculture.github.io

 

 

서버를 어디서 어떻게 구동할 것인가... 이게 관건이었습니다.

토이프로젝트나 간단한 서비스를 위한 서버 구동을 위해 AWS나 Google Could를 사용하자니 돈벌이도 없는데 좀 그렇더군요. ㅠ.,ㅜ;

 

아래 블로그를 보다가 Freehosting 서비스로 무료 플랜도 괜찮아 보여 진행하려 하다가,...

 

토이프로젝트에 시용하기 좋은 무료 웹호스팅 및 서비스

들어가며 간단하게 도메인 1개, API 서버, Database, Github action CI/CD 구성, SSL, DNS, 통계만 하면 되는 작은 토이 프로젝트를 만들일이 생겼다. 일단 웹페이지는 추후에 SEO도 붙일까 해서 nextjs로 만들었

uznam8x.tistory.com

 

결국 여기저기를 보던와중  Synology NAS 로 설정하는 걸 보았고.. 나도 있는데!?

 DS918+  Docker가 지원되는 모델!!!! 와우.. 그래서 밤샘하여 설정 테스트를 완료!! ㅎㅎ 기쁘네요.

 

시놀로지 Docker로 Nodejs 웹서버 설치하고 띄우기는 아래 블로그를 보고 차근히 따라 하면 됩니다.

 

 

시놀로지 Docker로 Nodejs 웹서버 설치하고 띄우기

도커에서 Nodejs웹서버를 설치하고 띄우는 일은 간단하면서도 매우 유용한 작업입니다. 시놀로지 도커(Docker)은 주로 GUI로 설치를 진행하게되어 있어서 편리하기는 하나 아직 참고할 만한 자료들

ux.stories.pe.kr

시놀로지 Docker로 Nodejs 웹서버 설치하고 띄우기.mhtml
4.09MB

 

위의 글대로 하면 nodejs로 서버 구동은 잘 되는데..

cmd나 bash 명령 처리 과정의 복잡성, 그리고 nodemon을 사용할 수 없다는 문제점이 있어서 밤샘 ㅠ.,ㅜ;

 

혹시 nodemon 되는 것을 누가 만들었을까 싶어 레지스트리를 봤더니 역시나 nodemon이 있어서 깔아보기도 했지만 오래되고 불안정하고 업데이트 안되고 있어서 삭제..

 

 

여튼 최종적으로 실제 서비스를 위한 Nodejs Docker와 개발을 위한 Nodejs Test Docker를 만들어서 Test 서버에서는 nodemon으로 구동할 수 있도록 환경구축 완료!!!!!

 

 

최종 모습 (node8000, nodemon9000)

 

 

 

Synology.Docker 가장 골치아팠던 컨테이너  실행 명령 

아니.. 왜?? Why?? 컨테이너로 만들어진 이후에는 실행 명령을 수정할 수 없습니다!!!! 그래서 초반에 경로나 파일 내용이 잘못되거나 하면 Docker의 Nodejs가 실행자체가 안되기 때문에 어떠한 조작도 할수가 없습니다.

 

수십번을 컨테이너 지우고 만들기를 반복.. ㅋㅎ..

일단 좀더 쉽게 설정하도록 준비하여 처리하겠습니다.

 

이미 생성되어 있는 Nodejs 컨테이너 하나를 선택하고 "설정 - 내보내기"

 

"컨테이너 콘텐츠 및 설정 내보내기"는 Nodejs Docker를 전체 내보내기하여 txz 파일로 만들어줍니다. 나중에 실서버 백업을 한다거나 할 때 사용할 수 있겠네요.

한번 전체 내보내기 해보았는데 시간도 오래걸리고 용량도 꽤 큽니다. 200MB가 넘네요. 실제로 사용할 일은 적을 것 같고, 실서버에서라도 NAS의 폴더를 /home/node/app 으로 마운팅하여 사용하기 때문에 /home/node/app 폴더 내에서만 자료를 유지한다면 NAS에 알아서 보관이 되니 전체를 백업할 일이 없는 것이지요.

 

위의 설정으로 [내보내기]를 완료하면, /docker 폴더 안에 nodejsApp.syno.json과 같은 파일이 만들어져 있을겁니다.

 

 

 

폴더 구성 (node8000, nodemon9000)

일단 저는 실서버 구동을 위해 node8000 Nodejs 서버와 테스트 개발을 위한 nodemon9000 Nodejs 서버를 돌릴 예정입니다. 따라서 nodejsApp.syno.json 파일을  node8000.syno.json 으로 이름 변경하고,  nodemon9000.syno.json 으로 복사하여 한 개 더 만들어줍니다.

 

Visual Studio Code로 /docker를 열어서 node8000.syno.json을 열고 다음과 같이 수정합니다.

 

 node8000.syno.json 
- 수정이 필요한 부분은 "cmd"와 "port_bindings", "volume_bindings'입니다.
{
   "cap_add" : [],
   "cap_drop" : [],
   "cmd" : "node /home/node/app/index.js",
   "cpu_priority" : 50,
   "devices" : null,
   "enable_publish_all_ports" : false,
   "enable_restart_policy" : false,
   "enabled" : true,
   "entrypoint_default" : "docker-entrypoint.sh",
   "env_variables" : [
      {
         "key" : "PATH",
         "value" : "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
      },
      {
         "key" : "NODE_VERSION",
         "value" : "18.0.0"
      },
      {
         "key" : "YARN_VERSION",
         "value" : "1.22.18"
      }
   ],
   "exporting" : false,
   "id" : "a29fb23a7b9f43b7645b72301a24ecb6f1265c99a78167d31ad2aa9efab198bd",
   "image" : "node:latest",
   "is_ddsm" : false,
   "is_package" : false,
   "links" : [],
   "memory_limit" : 0,
   "name" : "node",
   "network" : [
      {
         "driver" : "bridge",
         "name" : "bridge"
      }
   ],
   "network_mode" : "bridge",
   "port_bindings" : [
      {
         "container_port" : 8000,
         "host_port" : 8000,
         "type" : "tcp"
      }
   ],
   "privileged" : false,
   "shortcut" : {
      "enable_shortcut" : false
   },
   "use_host_network" : false,
   "volume_bindings" : [
      {
         "host_volume_file" : "/docker/node8000",
         "mount_point" : "/home/node/app",
         "type" : "rw"
      }
   ]
}

 "cmd" : "node /home/node/app/index.js" 

즉 Nodejs Docker가 실행되자마자 NAS의 /docker/node8000 폴더를 /home/node/app으로 마운팅시키고,

/home/node/app/index.js 파일을 node로 실행하도록 됩니다. 따라서 경로가 틀리거나 index.js 파일 내 에러가 존재한다면 해당 nodejs docker는 실행되지 않습니다.

 

상관없습니다. 왜냐면 해당 index.js는 일단 테스트 서버에서 돌려보고 업로드해주면 되니까요.

 

그럼 더 중요한 node9000.syno.jon을 다음과 같이 작성합니다.

 

 node9000.syno.json 
{
   "cap_add" : [],
   "cap_drop" : [],
   "cmd" : "node",
   "cpu_priority" : 50,
   "devices" : null,
   "enable_publish_all_ports" : false,
   "enable_restart_policy" : false,
   "enabled" : true,
   "entrypoint_default" : "docker-entrypoint.sh",
   "env_variables" : [
      {
         "key" : "PATH",
         "value" : "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
      },
      {
         "key" : "NODE_VERSION",
         "value" : "18.0.0"
      },
      {
         "key" : "YARN_VERSION",
         "value" : "1.22.18"
      }
   ],
   "exporting" : false,
   "id" : "4335cbd6c4d99a72d5112dd374ffa21ae29c3f208d7c0259593d19d983a03be7",
   "image" : "node:latest",
   "is_ddsm" : false,
   "is_package" : false,
   "links" : [],
   "memory_limit" : 0,
   "name" : "nodemon8080",
   "network" : [
      {
         "driver" : "bridge",
         "name" : "bridge"
      }
   ],
   "network_mode" : "bridge",
   "port_bindings" : [
      {
         "container_port" : 9000,
         "host_port" : 9000,
         "type" : "tcp"
      }
   ],
   "privileged" : false,
   "shortcut" : {
      "enable_shortcut" : false
   },
   "use_host_network" : false,
   "volume_bindings" : [
      {
         "host_volume_file" : "/docker/nodemon9000",
         "mount_point" : "/home/node/app",
         "type" : "rw"
      }
   ]
}

NAS이 마운팅 폴더가 /docker/nodemon9000이며,

"cmd" : "node"로 원래 처음 Nodejs를 생성했을 때의 코드를 사용합니다. 그렇기에 실행이 안될일은 없는 것이지요.

 

/docker 폴더안에

 /docker/node8000, /docker/nodemon9000  폴더도 생성합니다.

 

이제 불필요한 컨테이너를 삭제합니다. 왜냐면 컨테이너는 실행하지 않더라도 포트가 동일하면 컨테이너로서 만들어지지도 않습니다. (사실 이건좀 애매 -_-; 시놀로지에서 그렇게 관리되도록 한듯한데.. 실행되지 않으면 상관없잖우?? 실행할 때 체크하도록 허지..)

 

그리고 "설정 - 가져오기"를 클릭하여,

/docker에서 node8000.syno.json과 node9000.syno.json을 각각 가져오기 합니다. (한번에 안되요)

 

node8000은 실행해도 바로 정지됩니다. /home/node/app/index.js 가 없기 때문입니다.

 

node8000을 더블클릭하여 세부사항을 보면 내용을 확인할 수 있습니다.

 

네 index.js 모듈을 찾을 수 없다고 하네요.. (근데 시간이 왜 안맞을까요 -_-; NAS 시스템 시간은 맞음.)

 

일단 무시해주고요.. nodemon9000을 실행합니다.

 

 

 nodemon9000 실행

그러면 잘 실행됩니다. 단지 nodemon이 아니라 node라는 것.

nodemon9000 더블클릭하여 여기서  터미널  탭을 클릭합니다.

nodemon9000이 있고 터미널창이 떠 있지만 이건 무시하고, [생성] 버튼을 클릭합니다.

그르면 "bash"가 생성되는데 이걸 클릭합니다.

 

아래와 같이,

 cd /home/node/app  으로 이동하여,

 npm install -g nodemon  실행합니다. (-g는 전역으로 설정하는 옵션입니다.)

 

추가적으로 express 프레임워크를 돌릴 것이라 미리 설치해줍니다.

(추가적인 module을 PC에서 설정하여 설치하는 것은 맨아래에 추가)

 

이제 Visual Studio Code에서 /docker/nodemon9000/index.js 파일을 생성하고 다음을 작성합니다.

 

 /docker/nodemon9000/index.js 
const express = require('express')
const app = express()
const HOST = '0.0.0.0'
const PORT = 9000

app.use(express.static('static'))

// URL 라우팅
app.get('/', (req, res) => {
	res.json({
		message: "This is TEST Nodemon Server.",
		port: PORT,
        success: true,
    });
	console.log('Hello World Sent.')
})

app.listen(PORT, () => {
	console.log(`TEST Server running at http://${HOST}:${PORT}`);
})

 

이제 터미널 화면에서  nodemon index.js 로 서버를 실행합니다.

 

잘 실행되었습니다!!!!!

 

로컬주소 http://192.168.0.4:9000 이나

DDNS 설정되어 있다면 해당 주소로 접근하면 다음과 같이 웹브라우저로 볼 수 있습니다.

콘솔창에도 잘 출력됩니다.

 

이렇게 실행된 상태로 두면, nodemon으로 구동되는 테스트 서버를 실행시켜둘 수 있습니다.

 

이제 index.js 파일을 수정하면 nodemon이 알아서 node를 재실행해주기 때문에 테스트 서버는 놔두고 개발에만 전념할 수 있게 됩니다.

 

이제 터미널을 닫아도 프로세스로 nodemon이 실행되고 있게 됩니다.

=> 터미널을 닫았을 때 nodemon이 실행은 되고 있지만 index.js 코드를 수정했을 때 프로세스가 죽어버리고 마네요 ㅠ.,ㅜ;;; 결국 터미널을 개발하는 동안 지속 켜놓아야 하니 역시 불편하네요. 다른 해결방법을 찾기 전까지는 켜놓아야 할 상황이네요.

 

그래서 또 이걸보고 처음부터 "node /usr/loca/bin/nodemon index.js"로 시작하면 되잖아!?!? 싶지만..

다시 syno.json 설정파일을 변경하고 새로 컨테이너를 만들면, 해당 컨테이너에는 nodemon이 설치되어 있지 않기 때문에 Error!!! 결국 방법이 없네요. 아시는 분 답변 좀 주세요 ㅠ.,ㅜ;

 

 

 

Node8000 실서버 돌리기

 

이제 해당 index.js 파일을 /docker/node8000 폴더에 복사하고 다음과 같이 수정해줍니다.

 

 /docker/node8000/index.js 
const express = require('express')
const app = express()
const HOST = '0.0.0.0'
const PORT = 8000

app.use(express.static('static'))

// URL 라우팅
app.get('/', (req, res) => {
	res.json({
		message: "This is REAL Node Server.",
		port: PORT,
        success: true,
    });
	console.log('Hello World Sent.')
})

app.listen(PORT, () => {
	console.log(`REAL Server running at http://${HOST}:${PORT}`);
})

 

그리고 node8000 도커 컨테이너를 실행하면 또 정지되어 버립니다. 왜냐면 express를 설치하지 않아 없는 모듈이기 때문입니다.

그렇다면 실행도 되지 않는 컨테이너에 어떻게 express를 설치할 수 있을까요?? 터미널 bash도 컨테이너가 켜져서 돌아야 npm 명령이라도 입력할텐데 말입니다.

 

이제 필요한 것이 PC에서 해당 폴더에 npm 설치하기입니다.

 

 

 

PC cmd 창에서 npm 패키지 설치하는 방법

cmd를 실행하고 해당 폴더로 이동하여 작업을 하면 될 것 같지만,

 

UNC 경로를 지원하지 않아 네트워크 드라이브 접속이 안됩니다. UNC로 접근하는 방법을 써도 되겠지만..

좀더 간편하고 작업하기도 편한 네트워크 드라이브 할당으로 연결하여 작업하였습니다.

 

Z:로 Nas의 docker 폴더를 연결해줍니다.

cmd에서 Z:로 이동하여 보면 /docker 폴더로 연결된 것을 볼 수 있습니다.

 

node8000에 express를 설치할 것이므로,

이렇게 하면 해당 프로젝트 폴더에 node_modules 폴더를 가지게 되고, 해당 프로젝트에서는 해당 module을 사용할 수 있게 됩니다. 즉 현재 node8000 폴더에 한해서 index.js에서 express를 사용할 수 있게 된다는 것이지요.

 

이제 다시 node8000을 실행시켜 봅니다. 오~오~ 죽지않고 살아있습니다.

잘 설정되었다는 것이지요.

 

더블클릭해서 보면

로그도 잘 남았고..

 

프로세스도 잘 실행되고 있습니다.

 

브라우저 접속해 봅니다.

 

실서버는 index.js 파일이 수정되었다면, 컨테이너를 반드시 재시작해주어야 정상 동작합니다.

 

 

 

+ Recent posts