-->

 

[Mac M1] Redis 설치 및 실행

 

Redis는 Key-Value형태의 값을 저장할 수 있는 NoSQL이면서 memcached와 마찬가지인 인메모리 데이터베이스이다. 

매우 빠른 속도로 I/O 작업을 할 수 있고 다양한 자료구조를 지원한다.

 

저번에 homebrew를 설치했기 때문에 너무나 쉽고 간단하게 작업할 수가 있다.

 

1.  brew install redis

➜  ~ brew install redis

==> Homebrew is run entirely by unpaid volunteers. Please consider donating:
  https://github.com/Homebrew/brew#donations

Running `brew update --auto-update`...
==> Auto-updated Homebrew!
Updated 1 tap (homebrew/core).

==> Downloading https://ghcr.io/v2/homebrew/core/ca-certificates/manifests/2022-07-19_1
######################################################################## 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/ca-certificates/blobs/sha256:9e0df163364a5ae07f3ee2cf39083cd74bcb38
==> Downloading from https://pkg-containers.githubusercontent.com/ghcr1/blobs/sha256:9e0df163364a5ae07f3ee2cf39083cd
######################################################################## 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/openssl/1.1/manifests/1.1.1q
######################################################################## 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/openssl/1.1/blobs/sha256:4e7b6cb2252c554a8e25ecae960f2fcd9a7fa742aa
==> Downloading from https://pkg-containers.githubusercontent.com/ghcr1/blobs/sha256:4e7b6cb2252c554a8e25ecae960f2fc
######################################################################## 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/redis/manifests/7.0.4
######################################################################## 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/redis/blobs/sha256:5fd4a4cdd769fdebc82dc5ea1b06edb2464039b38c09355f
==> Downloading from https://pkg-containers.githubusercontent.com/ghcr1/blobs/sha256:5fd4a4cdd769fdebc82dc5ea1b06edb
######################################################################## 100.0%
==> Installing dependencies for redis: ca-certificates and openssl@1.1
==> Installing redis dependency: ca-certificates
==> Pouring ca-certificates--2022-07-19_1.all.bottle.tar.gz
==> Regenerating CA certificate bundle from keychain, this may take a while...
🍺  /opt/homebrew/Cellar/ca-certificates/2022-07-19_1: 3 files, 222.6KB
==> Installing redis dependency: openssl@1.1
==> Pouring openssl@1.1--1.1.1q.arm64_monterey.bottle.tar.gz
🍺  /opt/homebrew/Cellar/openssl@1.1/1.1.1q: 8,097 files, 18MB
==> Installing redis
==> Pouring redis--7.0.4.arm64_monterey.bottle.tar.gz
==> Caveats
To restart redis after an upgrade:
  brew services restart redis
Or, if you don't want/need a background service you can just run:
  /opt/homebrew/opt/redis/bin/redis-server /opt/homebrew/etc/redis.conf
==> Summary
🍺  /opt/homebrew/Cellar/redis/7.0.4: 14 files, 2.6MB
==> Running `brew cleanup redis`...
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).
==> Caveats
==> redis
To restart redis after an upgrade:
  brew services restart redis
Or, if you don't want/need a background service you can just run:
  /opt/homebrew/opt/redis/bin/redis-server /opt/homebrew/etc/redis.conf

 

2.  redis-server

➜  ~ redis-server
76063:C 04 Aug 2022 13:40:28.155 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
76063:C 04 Aug 2022 13:40:28.155 # Redis version=7.0.4, bits=64, commit=00000000, modified=0, pid=76063, just started
76063:C 04 Aug 2022 13:40:28.155 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
76063:M 04 Aug 2022 13:40:28.155 * Increased maximum number of open files to 10032 (it was originally set to 256).
76063:M 04 Aug 2022 13:40:28.155 * monotonic clock: POSIX clock_gettime
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 7.0.4 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                  
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 76063
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           https://redis.io       
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

76063:M 04 Aug 2022 13:40:28.155 # WARNING: The TCP backlog setting of 511 cannot be enforced because kern.ipc.somaxconn is set to the lower value of 128.
76063:M 04 Aug 2022 13:40:28.155 # Server initialized
76063:M 04 Aug 2022 13:40:28.156 * Ready to accept connections

 

3.  brew services start redis

➜  ~ brew services start redis
==> Tapping homebrew/services
Cloning into '/opt/homebrew/Library/Taps/homebrew/homebrew-services'...
remote: Enumerating objects: 2057, done.
remote: Counting objects: 100% (449/449), done.
remote: Compressing objects: 100% (102/102), done.
remote: Total 2057 (delta 380), reused 350 (delta 347), pack-reused 1608
Receiving objects: 100% (2057/2057), 557.41 KiB | 1.32 MiB/s, done.
Resolving deltas: 100% (951/951), done.
Tapped 1 command (45 files, 711.0KB).
==> Successfully started `redis` (label: homebrew.mxcl.redis)

 

4.  redis-cli

➜  ~ redis-cli
127.0.0.1:6379>

 

5.  set, get

redis는 set key value 문법으로 작성한다.

get key 명령어를 통해 저장된 value값을 가져온다.

127.0.0.1:6379> set key1 "hello Minggu"
OK
127.0.0.1:6379> get key1
"hello Minggu"
127.0.0.1:6379>

 

6.  append 

append key value는 기존에 저장된 value값 뒤에 문자열을 추가할 수 있다.

127.0.0.1:6379> set key2 "minggu"
OK
127.0.0.1:6379> get key2
"minggu"
127.0.0.1:6379> append key2 " is Developer"
(integer) 18
127.0.0.1:6379> get key2
"minggu is Developer"
127.0.0.1:6379>

 

7. Set

127.0.0.1:6379> smembers set:mingguSet
(empty array)
127.0.0.1:6379> sadd set:mingguSet minggu
(integer) 1
127.0.0.1:6379> sadd set:mingguSet like
(integer) 1
127.0.0.1:6379> sadd set:mingguSet pokemon
(integer) 1
127.0.0.1:6379> sadd set:mingguSet pokemon game
(integer) 1
127.0.0.1:6379> smembers set:mingguSet
1) "like"
2) "game"
3) "pokemon"
4) "minggu"
127.0.0.1:6379>

sadd 명령어를 통해 Set 자료구조를 이용할 수 있다.

중복을 허용하지 않는 Set 구조이기에 중간에 'pokemon'은 삭제되었다. 그리고 순서가 섞여 나온다는 것을 알 수 있다.

 

8. sortedSet

127.0.0.1:6379> zadd rank 1 A
(integer) 1
127.0.0.1:6379> zadd rank 1 B
(integer) 1
127.0.0.1:6379> zadd rank 1 C
(integer) 1
127.0.0.1:6379> zadd rank 1 D
(integer) 1
127.0.0.1:6379> zrange rank 0 -1
1) "A"
2) "B"
3) "C"
4) "D"
127.0.0.1:6379>

zadd 명령어를 통해 가중치 값을 지정할 수 있다.

zrange 명령어는 출력 범위를 지정한다. (-1이면 뒤에서부터 시작)

 

9. HashMap

127.0.0.1:6379> hset user name minggu
(integer) 1
127.0.0.1:6379> hset user age 15
(integer) 1
127.0.0.1:6379> hset user address "Seoul"
(integer) 1
127.0.0.1:6379> hgetall user
1) "name"
2) "minggu"
3) "age"
4) "15"
5) "address"
6) "Seoul"
127.0.0.1:6379>

hset 명령어를 통해 key - value값을 설정하고

hgetall {name}을 통해 값을 가져온다.

 

[Mac M1] homebrew, oh-my-zsh 설치

 

 

나는..맥이 싫다..나는 ios가 싫다..나는 애플이 싫다..그치만..

수많은 개발자들이 MacBook으로 개발을 한다.

나도 회사에서 지급받은 MacBook Pro 16 M1 모델을 지급받았다.

Apple 생태계에 익숙하지 않은 나는 대부분의 개발을 Window Desktop에 원격으로 붙어 진행을 한다.

그러나 그렇다고 맥북 사용법을 몰라서는 안된다고 생각했다.

그래서 개발 환경을 아주 조금이라도.. 세팅해보자!

그 첫 번째로 brew, zsh 명령어를 사용하기 위한 패키지를 설치해주자.

 

* Homebrew?

macOS 용 패키지 관리자로 터미널(Terminal)에서 명령어를 작성하여 자신이 필요한 프로그램을 설치, 삭제, 업데이트를 손쉽게 관리할 수 있다. yum, apt 명령어와 비슷한 역할을 한다.

 

1. 터미널 열기

command + Space를 누르면 Spotlight라고 하는 검색창이 뜬다. 윈도 검색과 비슷한 기능이다. 

거기서 터미널을 검색해 열도록 하자.

 

2. Homebrew install

/bin/bash -c "$(curl -fsSL https://gist.githubusercontent.com/nrubin29/bea5aa83e8dfa91370fe83b62dad6dfa/raw/48f48f7fef21abb308e129a80b3214c2538fc611/homebrew_m1.sh)"

 

기존 방식처럼 아래 사이트에서 명령어를 복사해 설치하게 된다면

https://brew.sh/index_ko

 

Homebrew

The Missing Package Manager for macOS (or Linux).

brew.sh

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

다음과 같은 에러가 뜬다.

command not found: brew

그러면

eval $(/opt/homebrew/bin/brew shellenv)

다음과 같이 입력해야 brew명령어를 사용할 수 있게 된다.

애초에 편하게 하기 위해서 맨 위의 명령어를 입력하자.

 

3. oh-my-zsh Install

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

 

설치가 완료되면 터미널이 다음과 같이 시작한다.

 

이제 다른 패키지 설치할 때 

brew install nvm

같이 입력하면 손쉽게 설치할 수 있다.

[Node.js] NVM으로 여러 버전의 node.js 사용하기

 

 

NVM(Node Version Manager)는 여러 버전의 Node.js를 사용할 수 있게 관리하는 패키지이다.

node.js자체가 NPM(Node Package Manager)에 의해 수많은 모듈들이 관리되고 기여하는 생태계라는 것을 염두에 둔다면 각 버전 별로 종속성을 갖게 된다는 것을 이해할 수 있을 것이다.

 

1. NVM의 설치

https://github.com/coreybutler/nvm-windows/

 

GitHub - coreybutler/nvm-windows: A node.js version management utility for Windows. Ironically written in Go.

A node.js version management utility for Windows. Ironically written in Go. - GitHub - coreybutler/nvm-windows: A node.js version management utility for Windows. Ironically written in Go.

github.com

난 기존에 설치된 node.js를 전부 삭제하고 새 폴더를 만들어 nvm을 설치했다.

폴더 내부에는 내가 설치할 노드 버전들이 위치하기 때문에 관리하기도 매우 수월하다.

 

2. nvm --help

$ nvm --help

Running version 1.1.9.

Usage:

  nvm arch                     : Show if node is running in 32 or 64 bit mode.
  nvm current                  : Display active version.
  nvm install <version> [arch] : The version can be a specific version, "latest" for the latest current version, or "lts" for the
                                 most recent LTS version. Optionally specify whether to install the 32 or 64 bit version (defaults
                                 to system arch). Set [arch] to "all" to install 32 AND 64 bit versions.
                                 Add --insecure to the end of this command to bypass SSL validation of the remote download server.
  nvm list [available]         : List the node.js installations. Type "available" at the end to see what can be installed. Aliased as ls.
  nvm on                       : Enable node.js version management.
  nvm off                      : Disable node.js version management.
  nvm proxy [url]              : Set a proxy to use for downloads. Leave [url] blank to see the current proxy.
                                 Set [url] to "none" to remove the proxy.
  nvm node_mirror [url]        : Set the node mirror. Defaults to https://nodejs.org/dist/. Leave [url] blank to use default url.
  nvm npm_mirror [url]         : Set the npm mirror. Defaults to https://github.com/npm/cli/archive/. Leave [url] blank to default url.
  nvm uninstall <version>      : The version must be a specific version.
  nvm use [version] [arch]     : Switch to use the specified version. Optionally use "latest", "lts", or "newest".
                                 "newest" is the latest installed version. Optionally specify 32/64bit architecture.
                                 nvm use <arch> will continue using the selected version, but switch to 32/64 bit mode.
  nvm root [path]              : Set the directory where nvm should store different versions of node.js.
                                 If <path> is not set, the current root will be displayed.
  nvm version                  : Displays the current running version of nvm for Windows. Aliased as v.

nvm의 명령어 확인

 

3. nvm list available

$ nvm list available

|   CURRENT    |     LTS      |  OLD STABLE  | OLD UNSTABLE |
|--------------|--------------|--------------|--------------|
|    18.6.0    |   16.16.0    |   0.12.18    |   0.11.16    |
|    18.5.0    |   16.15.1    |   0.12.17    |   0.11.15    |
|    18.4.0    |   16.15.0    |   0.12.16    |   0.11.14    |
|    18.3.0    |   16.14.2    |   0.12.15    |   0.11.13    |
|    18.2.0    |   16.14.1    |   0.12.14    |   0.11.12    |
|    18.1.0    |   16.14.0    |   0.12.13    |   0.11.11    |
|    18.0.0    |   16.13.2    |   0.12.12    |   0.11.10    |
|    17.9.1    |   16.13.1    |   0.12.11    |    0.11.9    |
|    17.9.0    |   16.13.0    |   0.12.10    |    0.11.8    |
|    17.8.0    |   14.20.0    |    0.12.9    |    0.11.7    |
|    17.7.2    |   14.19.3    |    0.12.8    |    0.11.6    |
|    17.7.1    |   14.19.2    |    0.12.7    |    0.11.5    |
|    17.7.0    |   14.19.1    |    0.12.6    |    0.11.4    |
|    17.6.0    |   14.19.0    |    0.12.5    |    0.11.3    |
|    17.5.0    |   14.18.3    |    0.12.4    |    0.11.2    |
|    17.4.0    |   14.18.2    |    0.12.3    |    0.11.1    |
|    17.3.1    |   14.18.1    |    0.12.2    |    0.11.0    |
|    17.3.0    |   14.18.0    |    0.12.1    |    0.9.12    |
|    17.2.0    |   14.17.6    |    0.12.0    |    0.9.11    |
|    17.1.0    |   14.17.5    |   0.10.48    |    0.9.10    |

This is a partial list. For a complete list, visit https://nodejs.org/en/download/releases

설치 가능한 버전들의 리스트가 나온다.

 

4. nvm install 

$ nvm install 18.6.0
Downloading node.js version 18.6.0 (64-bit)... 
Extracting...
Complete


Installation complete. If you want to use this version, type

nvm use 18.6.0

최신 버전의 node.js를 설치한다. 

 

5. nvm use [version]

$ nvm use 18.6.0
Now using node v18.6.0 (64-bit)

 

 

6. nvm alias

# 사용할 Node alias로 설정 
$ nvm alias grafana 16.13.0    # nvm alias <alias> <version>
$ nvm use grafana

단 Windows는 안된다고 함 ㅎㅎ(https://github.com/coreybutler/nvm-windows/issues/503)

 

 

 

[PostgreSQL]  GitBash로 Window에서 sql file 실행시키기

 

 

1. .PostgreSQL install

https://www.postgresql.org/download/

 

PostgreSQL: Downloads

Downloads PostgreSQL Downloads PostgreSQL is available for download as ready-to-use packages or installers for various platforms, as well as a source code archive if you want to build it yourself. Packages and Installers Select your operating system family

www.postgresql.org

 

 

2. git bash install

https://git-scm.com/

 

Git

 

git-scm.com

 

 

3. execute PSQL

3-1. 내 PC - 속성 or Window 검색 - 시스템 환경 변수 편집

 

3-2. 환경변수 - 시스템 변수의 Path 선택하고 편집

 

3-3. PostgreSQL 설치 경로 입력

 

3-4. Git Bash에서 확인

$ psql -U postgres
postgres 사용자의 암호:
psql (13.7)
도움말을 보려면 "help"를 입력하십시오.

만약 아래처럼 에러가 뜬다면 시스템 환경변수가 제대로 설정되지 않은 것.

 bash: psql: command not found

 

4. create DB and SCHEMA

는 알아서 하시고 (PSQL로 create하든, 쿼리 편집기로 새 DB 생성하든)

 

5. Default SCHEMA setting

기본적으로 schema 입력 안 하고 쿼리를 실행하고 싶다면

postgres=# show search_path;
search_path
-----------------
"$user", public
(1 row)

postgres=# ALTER USER postgres SET search_path = kor, eng public;
   search_path
------------------
 kor, eng, public
(1개 행)

 

 

6. change Client Encoding

에러 발생 : [0x80 0xeb 바이트로 조합된 문자(인코딩: "UHC")와 대응되는 문자 코드가 "UTF8" 인코딩에는 없습니다]

6-1. encoding 확인

postgres=# show client_encoding
postgres-# ;
 client_encoding
-----------------
 UHC
(1개 행)

 

6-2. 시스템 변수 추가

 

6-3. PostgreSQL 재시작

User@DESKTOP MINGW64 /d/db/PostgreSQL/13/bin
$ pg_ctl.exe restart -D "d:/db/PostgreSQL/13/data"
pg_ctl: old server process (PID: 5648) seems to be gone
starting server anyway
waiting for server to start....2022-07-11 14:01:35.594 KST [6052] ▒α▒:  ▒▒▒▒ ▒α׸▒ ▒α▒ ▒▒▒▒ ▒▒▒μ▒▒▒▒▒ ▒▒▒▒▒ϴ▒.
2022-07-11 14:01:35.594 KST [6052] ▒▒Ʈ:  ▒▒▒▒▒▒▒▒ ▒▒▒▒ ▒α״▒ "log" ▒▒▒͸▒▒▒ ▒▒▒▒▒˴ϴ▒.
 stopped waiting
pg_ctl: could not start server
Examine the log output.

흠.. 안되네... 어차피 윈도우니까 서비스에서 재시작해도 됨.

 

 

6-4. 확인

$ psql -U postgres
postgres 사용자의 암호:
psql (13.7)
도움말을 보려면 "help"를 입력하십시오.

postgres=# show client_encoding
postgres-# ;
 client_encoding
-----------------
 UTF8
(1개 행)

 

 

7. import sql file

.sql 파일이 존재하는 경로에서 psql 명령어를 실행하거나 파일의 full path 다 입력하면 된다.

postgres=# \i init.sql
CREATE TABLE
COMMENT
COMMENT
COMMENT
...

...
INSERT 0 1
INSERT 0 1
INSERT 0 1
INSERT 0 1
INSERT 0 1
INSERT 0 1
INSERT 0 1
INSERT 0 1
INSERT 0 1
postgres=#

 

 

 

 

 

<참고>

https://medium.com/@itayperry91/get-started-with-postgresql-on-windows-a-juniors-life-4adfa6dd10e

 

Get Started with PostgreSQL on Windows — A Junior’s Life

Part 1.

medium.com

https://stackframe.tistory.com/41

 

PostgreSQL의 Schema

PostgreSQL에는 schema(스키마)라는 개념이 있습니다. schema는 하나의 데이터베이스에 다수 존재할 수 있으며 table, sequence 등의 객체가 특정 schema에 속해지게 됩니다. 이를 통해 테이블들을 분류하고

stackframe.tistory.com

https://velog.io/@jonah_official/PostgreSQL-clientencoding-%EC%84%A4%EC%A0%95

 

[PostgreSQL] client_encoding 설정

PostgreSQL의 client-encoding 설정 방법

velog.io

http://daplus.net/postgresql-windows%EC%97%90%EC%84%9C-postgresql%EC%9D%84-%EC%8B%9C%EC%9E%91%ED%95%98%EB%A0%A4%EB%A9%B4-%EC%96%B4%EB%96%BB%EA%B2%8C%ED%95%B4%EC%95%BC%ED%95%A9%EB%8B%88%EA%B9%8C/

 

[postgresql] Windows에서 PostgreSQL을 시작하려면 어떻게해야합니까? - 리뷰나라

Windows 10 PC에 Postgresql을 설치했습니다. pgAdmin II 도구를 사용하여 company라는 데이터베이스를 만들었으며 이제 데이터베이스 서버를 실행하려고합니다. 이 작업을 수행하는 방법을 알 수 없습니다

daplus.net

 

 

[Webpack] Loader

 

 

Webpack은 기본적으로 Javascript ES6문법의 module 구성을 통해 각 소스들을 Bundling 해주는 도구라는 것을 저번에 배웠다.

Webpack Bundling의 대상은 비단 Javascript 파일뿐만이 아니다.

Webpack enables use of loaders to preprocess files. This allows you to bundle any static resource way beyond JavaScript. You can easily write your own loaders using Node.js.
Loaders are activated by using loadername! prefixes in require() statements, or are automatically applied via regex from your webpack configuration 

공식 문서에서는 loader를 통해 javascript 너머 정적 리소스들을 번들링 해준다고 한다. 또한 정규식을 이용해 손쉽게 나만의 Loader를 작성할 수 있다.

예를 들어, css 파일을 만들어두고 css-loader를 이용하면 bundling 되어 나온 결과에 css파일도 포함되어 하나의 js파일로 출력된다. 

css뿐만 아니라 file이나 image도 가능하다.

 

package.json

{
  "name": "webpack-sample",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "webpack"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "css-loader": "^6.7.1",
    "file-loader": "^6.2.0",
    "react": "^18.2.0",
    "style-loader": "^3.3.1",
    "url-loader": "^4.1.1"
  },
  "devDependencies": {
    "webpack": "^5.73.0",
    "webpack-cli": "^4.10.0"
  }
}

 

 

1. css-loader & style-loader

$ npm install css-loader style-loader

 

webpack.config.js

const path = require('path');

module.exports = {
	mode: 'development',
    entry: {
    	main: './src/app.js',
    },
    output: {
    	path: path.resolve('./dist'),
        filename: '[name].js'
    },
    module: {
    	rules: [
        	{
            	test: /\.css$/, //css라는 확장자를 가진 모든 파일은 아래의 Loader를 적용시키겠다.
                use: [
                    'style-loader',
                    'css-loader'
                ]
            }
        ]
    }
}

style-loader를 먼저 적어야 한다. 순서가 뒤에서 앞으로 적용되기 때문에.

 

app.css

body {
	background-color: green;
}

 

app.js

import './app.css';

 

단순히 css-loader만을 적용시키면 Webpack의 번들링 결과에 app.css의 소스 내용이 js안에 들어가지만 실제로 적용이 되지 않는데, style-loader가 해당 부분을 inline style로 넣어 만들어준다. 그래서 두 개의 loader가 세트라고 할 수 있다.

 

확인

$ npm run build

> webpack-sample@1.0.0 build
> webpack

asset main.js 23.5 KiB [emitted] (name: main)
runtime modules 972 bytes 5 modules
cacheable modules 9.96 KiB
  modules by path ./node_modules/ 8.07 KiB
    modules by path ./node_modules/style-loader/dist/runtime/*.js 5.75 KiB
      ./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js 2.44 KiB [built] [code generated]
      ./node_modules/style-loader/dist/runtime/styleDomAPI.js 1.38 KiB [built] [code generated]
      ./node_modules/style-loader/dist/runtime/insertBySelector.js 1010 bytes [built] [code generated]
      + 3 modules
    modules by path ./node_modules/css-loader/dist/runtime/*.js 2.33 KiB
      ./node_modules/css-loader/dist/runtime/noSourceMaps.js 64 bytes [built] [code generated]
      ./node_modules/css-loader/dist/runtime/api.js 2.26 KiB [built] [code generated]
  modules by path ./src/ 1.89 KiB
    ./src/app.js 282 bytes [built] [code generated]
    ./src/app.css 1.11 KiB [built] [code generated]
    ./node_modules/css-loader/dist/cjs.js!./src/app.css 515 bytes [built] [code generated]
webpack 5.73.0 compiled successfully in 334 ms

$ npx lite-server

 

 

2. file-loader

$ npm install file-loader

 

webpack.config.js

...
    module: {
    	rules: [
            {
                test: /\.(png|jpg|gif|svg)$/, //처리할 패턴을 명시
                loader: 'file-loader',
                options: {
                    publicPath: './dist/',
                    name: '[name].[ext]?[hash]'
                }
                // use: [ 'file-loader' ]
            },
...

 

app.css

body {
    /*background-color: green;*/
    background-image: url(minggu.jpg);
}

 

아무 그림 파일을 src폴더에 넣어두자.

현재는 options값을 주지 않고 use만 해도 자동으로 해시처리 되는 것 같긴 한데...

내가 minggu.jpg라는 파일을 번들링 한다고 하면 나오는 파일명은 해시 처리되어 나온다.

이는 같은 파일명을 사용할 때 브라우져가 캐시 된 이미지를 가져올 수 있어서 매번 브라우저에게 새로 이미지를 다운로드하으라고 알려주는 용도이다. 

그러나 매번 페이지를 로드 할 때마다 이미지를 다운로드하는 것은 비효율 적인 것 같아..

 

3. url-loader

npm install url-loader

 

webpack.config.js

const path = require('path');

module.exports = {
    mode: 'development',
    entry:{
        main: './src/app.js',
    },
    output: {
        path: path.resolve('./dist'),
    filename: '[name].js'
    },
    module: {
        rules: [
            {
                test:/\.css$/,
                    // /\.js$/, //js확장자를 가진 모든파일은 Loader로 돌리겠다. 처리할 패턴을 명시
                use: [
                    // path.resolve('./my-webpack-loader.js') //걸리는 녀석들은 이 파일 동작
                    'style-loader',
                    'css-loader' //순서는 뒤에서부터 앞으로
                ]
            },
            // {
            //     test: /\.(png|jpg|gif|svg)$/,
            //     loader: 'file-loader',
            //     options: {
            //         publicPath: './dist/',
            //         name: '[name].[ext]?[hash]'
            //     }
            //     // use: [ 'file-loader' ]
            // },
            {
                test: /\.(png|jpg|gif|svg)$/,
                loader: 'url-loader',
                options: {
                    publicPath: './dist/',
                    name: '[name].[ext]?[hash]',
                    limit: 20000, // 20kb 미만이면 url-loader가 base64로 인코딩, 그 이상은 file-loader가 처리
                }
            }
        ]
    }

}

 

app.js

import './app.css';
import minggu from './minggu.jpg';

document.addEventListener('DOMContentLoaded', () => { 
    document.body.innerHTML = `
        <img src="${minggu}" />
    `
})

 

그래서 url-loader를 이용하여 특정 용량을 limit 걸어두면, 그 이하의 파일은 base64로 인코딩 되어 나온다.

자주 쓰는 이런 loader를 통해 데이터를 효율적으로 관리 할 수 있다!

 

https://github.com/minha9012/webpack-sample

 

GitHub - minha9012/webpack-sample

Contribute to minha9012/webpack-sample development by creating an account on GitHub.

github.com

 

 

<참조>

https://webpack.js.org/loaders/

 

Loaders | webpack

webpack is a module bundler. Its main purpose is to bundle JavaScript files for usage in a browser, yet it is also capable of transforming, bundling, or packaging just about any resource or asset.

webpack.js.org

 

[Webpack] Webpack 기초

 

 

ECMA2015부터 javascript 문법 수준에서 Module을 지원하기 시작했다.

module을 구현하는 대표적인 스펙이 AMD(Asynchronous Module Definition)와 CommonJS인데 Node.js가 바로 이 CommonJS를 사용한다. 

UMD(Universal Module Definition)는 AMD 기반으로 CommonJS 방식까지 지원하는 통합 형태이다.

이렇게 각 커뮤니티에서 각자의 스펙을 제시하다가 ES2015에서 표준 모듈 시스템을 내놓았다.

현재는 Webpack과 Babel을 이용해 모듈 시스템을 사용하는 것이 일반적이다.

import/export를 사용하지 않고 코딩해왔으나 앞으로는 최신 javascript문법을 사용하는 Frontend framework이나 Node.js를 제대로 사용하려면 module 활용이 필수적이다.

 

Webpack은 여러개 파일을 하나의 파일로 합쳐주는 번들러(Bundler)이다. 번들러의 종류도 여러 가지가 있지만 Webpack이 사실상 최강자 타이틀을 갖고 있다.

여기서 Entry/Output이라는 개념이 나오는데 이는 하나의 시작점을 의미하고, 이 Entry부터 의존적인 모듈을 전부 찾아내서 하나의 Output을 만들어낸다.

 

간단히 Webpack으로 번들링 작업을 해보자.

 

1. Node.js & NPM 버전 체크

$ node -v
v16.14.2

$ npm -v
8.5.0

당연히 node.js가 설치 되어있어야 한다.

 

2. 프로젝트 생성

2-1. npm init

$ mkdir webpack-sample && cd $_
$ npm init                                                                      
This utility will walk you through creating a package.json file.           
It only covers the most common items, and tries to guess sensible defaults.
                                                                           
See `npm help init` for definitive documentation on these fields           
and exactly what they do.                                                  
                                                                           
Use `npm install <pkg>` afterwards to install a package and                
save it as a dependency in the package.json file.                          
                                                                           
Press ^C at any time to quit.                                              
package name: (webpack-sample)
version: (1.0.0)
description:
entry point: (index.js)
test command:
git repository:
keywords:
author:
license: (ISC)
About to write to D:\IntelliJ IDEA 2022.1\workspace\FE\webpack-sample\package.json:

{
  "name": "webpack-sample",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}


Is this OK? (yes)

 

2-2.npm install react

$ npm install react

added 3 packages, and audited 4 packages in 712ms

found 0 vulnerabilities

 

2-3.npm install -D webpack webpack-cli

$ npm install -D webpack webpack-cli

added 117 packages, and audited 121 packages in 6s

15 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities

 

 

 

3. 소스 생성

source tree

D:\IntelliJ IDEA 2022.1\workspace\FE\webpack-sample
├── index.html
├── node_modules
├── package-lock.json
├── package.json
└── src
   ├── app.js
   └── math.js

 

package.json

{
  "name": "webpack-sample",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "webpack"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "react": "^18.2.0"
  },
  "devDependencies": {
    "webpack": "^5.73.0",
    "webpack-cli": "^4.10.0"
  }
}

 

math.js

export function sum(a,b){
    return a+b;
}

 

app.js

import * as math from './math.js';

console.log(math.sum(2,4));

 

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!--    <script type="module" src="src/app.js"></script>-->
    <script src="dist/main.js"></script>
</body>
</html>

 

4. webpack 실행

$ node_modules/.bin/webpack --mode development --entry ./src/app.js
asset main.js 4.09 KiB [emitted] (name: main)
runtime modules 670 bytes 3 modules
cacheable modules 111 bytes
  ./src/app.js 65 bytes [built] [code generated]
  ./src/math.js 46 bytes [built] [code generated]
webpack 5.73.0 compiled successfully in 94 ms

dist폴더가 생성되고 소스가 번들링되어 나온다.

 

5. 확인

$ npx lite-server
Did not detect a `bs-config.json` or `bs-config.js` override file. Using lite-server defaults...
** browser-sync config **
{
  injectChanges: false,
  files: [ './**/*.{html,htm,css,js}' ],
  watchOptions: { ignored: 'node_modules' },
  server: {
    baseDir: './',
    middleware: [ [Function (anonymous)], [Function (anonymous)] ]
  }
}
[Browsersync] Access URLs:
 -------------------------------------
       Local: http://localhost:3000
    External: http://192.168.56.1:3000
 -------------------------------------
          UI: http://localhost:3001
 UI External: http://localhost:3001
 -------------------------------------
[Browsersync] Serving files from: ./
[Browsersync] Watching files...
22.07.03 15:59:40 200 GET /index.html
22.07.03 15:59:40 200 GET /dist/main.js

npx lite-server를 이용해 로컬에서 바로 띄워본다. 

 

6. webpack.config.js

const path = require('path');

module.exports = {
    mode: 'development',
    entry:{
        main: './src/app.js',
    },
    output: {
        path: path.resolve('./dist'),
    filename: '[name].js'
    }
}

폴더 최상단에 webpack환경설정 파일을 만들고 npm build 명령어를 이용해 간단히 실행할 수 있다.

$ npm run build

> webpack-sample@1.0.0 build
> webpack

asset main.js 4.09 KiB [compared for emit] (name: main)
runtime modules 670 bytes 3 modules
cacheable modules 111 bytes
  ./src/app.js 65 bytes [built] [code generated]
  ./src/math.js 46 bytes [built] [code generated]
webpack 5.73.0 compiled successfully in 113 ms

 

 

https://github.com/minha9012/webpack-sample

 

GitHub - minha9012/webpack-sample

Contribute to minha9012/webpack-sample development by creating an account on GitHub.

github.com

 

 

https://leetcode.com/problems/find-peak-element/

 

Find Peak Element - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

 

Peak Element는 인접한 이웃 elements 보다 값이 큰 상태를 나타낸다.

이진 탐색과 분할 정복 알고리즘으로 해결 할 수 있다.

 

1. Binary Search

    // 1. 이진 탐색(Binary Search)
    public static int binarySearch(int[] nums) {
        int left = 0;
        int right = nums.length - 1;

        while (left < right) {
            int mid = left + (right - left) / 2;

            if (nums[mid] < nums[mid + 1]) {
                left = mid + 1;
            } else {
                right = mid;
            }
        }
        return left;
    }

 

 

2. Divide and Conquer

    // 2. 분할 정복 알고리즘(Divide and Conquer Algorithm)
    static int DAC(int[] nums, int left, int right, int length) {
        int mid = left + (right - left) / 2; //중앙값

        //중앙값과 이웃한 값들 비교
        if ((mid == 0 || nums[mid - 1] <= nums[mid])
                && (mid == length - 1 || nums[mid + 1] <= nums[mid]))
            return mid;

            // 중앙값이 극대값이 아니고, 왼쪽 이웃이 더 크다면 왼쪽 배열에 극대값이 존재
        else if (mid > 0 && nums[mid - 1] > nums[mid])
            return DAC(nums, left, (mid - 1), length);

            //아니라면 오른쪽 배열에 극대값 존재
        else return DAC(nums, (mid + 1), right, length);
    }

    //재귀 함수
    static int findPeak(int[] arr, int n) {
        return DAC(arr, 0, n - 1, n);
    }

 

3. Test

    @Test
    void givenIntArray_whenFindPeakElement_thenCorrect() {
        assertAll(
                () -> test_binarySearch(new int[]{1, 2, 3, 1}, 2),
                () -> test_binarySearch(new int[]{1, 2, 1, 3, 5, 6, 4}, 5)

        );
        assertAll(
                () -> test_findPeak(new int[]{1, 2, 3, 1}, 2),
                () -> test_findPeak(new int[]{1, 2, 1, 3, 5, 6, 4}, 5)
        );
    }

    private void test_binarySearch(int[] given, int expected) {
        // when
        int actual = FindPeakElement.binarySearch(given); //이진탐색

        // then
        assertEquals(expected, actual);
    }

    private void test_findPeak(int[] given, int expected) {
        // when
        int actual = FindPeakElement.findPeak(given, given.length); //분할정복

        // then
        assertEquals(expected, actual);
    }

 

분할 정복 알고리즘은 작은 문제로 분할하여 문제를 해결하는 방법이다.

보통 규모가 큰 문제여서 그대로 해결하기 어려울 경우에 해결할 수 있게 작은 규모로 분할시킨다.

빠른 정렬(Quick Sort), 합병 정렬(Merget Sort)로 대표되는 정렬 알고리즘(Sorting Algorithm) 문제와 고속 푸리에 변환(FFT) 문제가 대표적이다.

 

분할 정복 알고리즘은 보통 재귀함수(Recursive Function)을 활용하여 구현하는데 예를 들면 아래와 같다.

function F(x):
    if F(x)의 문제가 간단 then:
        return F(x)을 직접 계산한 값
    else:
        x를 y1, y2로 분할
        F(y1)과 F(y2)를 호출
        return F(y1), F(y2)로부터 F(x)를 구한 값

 

또한 여기서 작은 부문제로 분할할 경우에 부문제를 푸는 알고리즘은 임의로 선택할 수 있다. 이러한 재귀 호출을 사용한 함수는 함수 호출 오버헤드 때문에 실행 속도가 늦어진다.

빠른 실행이나 부문제 해결 순서 선택을 위해, 재귀호출을 사용하지 않고 스택(Stack), 큐(Queue) 등의 자료구조를 이용하여 분할 정복법을 구현하는 것도 가능하다.

 

 

[Rider] generate applicationhost.config 

 

 

D:\IDE\apps\Rider\ch-0\221.5787.36\plugins\dpa\DotFiles\JetBrains.DPA.Runner.exe --handle=8304 --backend-pid=9820 --detach-event-name=dpa.detach.8304 "C:/Program Files (x86)/IIS Express/iisexpress.exe" /config:[프로젝트경로]/.idea/config/applicationhost.config /site:[솔루션이름] /apppool:Clr4IntegratedAppPool

An error occurred while reading configuration information. Make sure that the configuration file [프로젝트경로]\.idea\config\applicationhost.config e
xists, it is accessible, and contains valid configuration information.

Process finished with exit code 0.

Visual studio로 작업할 때와는 다르게 Rider로 솔루션을 빌드할 때 해당 오류가 발생한다.

해당 오류가 발생함에도 dll파일은 정상적으로 출력이 되는데 찜찜하니까 이유를 찾아봤다.

 

Rider에서는 애플리케이션 설정 파일이 필요하고 이는 서버 타입이 IIS로 맞춰져 있는 Visual Studio에서는 별다른 설정을 안 해줘도 되지만 Rider는 명시적으로 설정을 해줘야 한다.

해당 프로젝트 실행 옵션에 generate applicationhost.config 할 수 있도록 변경하여야 한다.

 

1. 해당 솔루션의 프로젝트 마우스 우측 버튼 - Properties

 

2. Web 탭 - Server type - IIS Express로 변경

 

3. Generate applicationhost.config를 체크

 

4. 확인

 

 

<참조>

https://youtrack.jetbrains.com/issue/RIDER-44636

 

Rider does not generate applicationhost.config : RIDER-44636

When an existing project (created with Visual Studio) is started I get this error : C:/Program Files (x86)/IIS Express/iisexpress.exe" /config:C:/Projects/Demo/.idea/config/applicationhost.config /site:DemoProject /apppool:Clr4IntegratedAppPool An error oc

youtrack.jetbrains.com

 

[C#] ??(null 병합 연산자 ), ??=(null 병합 할당 연산자), ?.(null 조건 연산자)

 

 

소스: https://github.com/minha9012/c-sharp-study/blob/master/null-operator/NullCoalescingOperation.cs

 

GitHub - minha9012/c-sharp-study

Contribute to minha9012/c-sharp-study development by creating an account on GitHub.

github.com

 

null 체크는 java와 C#같은 객체지향 언어에서 아주 번거롭다.

Kotlin에서는 null 체크가 비교적 간단하여 ?:같은 Elvis expression이 존재하는데 이와 비슷하게 C#도?.,??,??= 연산자가 존재한다.

 

1. ?? (Null Coalescing Operator)

1-1. 정석적인 if문 사용

//1. if문 사용
public static void useIf(string name)
{
    if (name != null)
    {
        Console.WriteLine(name);
    }
    else
    {
        Console.WriteLine("(null)");
    }
}

null 임을 판단하기 위해 if문을 사용했을 때 코드가 6라인이나 된다.

C#은 기본적으로 {} 중괄호가 분리되어 있어서 더더욱 코드가 길어 보인다.

if문 안의 코드가 1줄 일 때는 중괄호를 생략할 수 있으므로 4줄까지는 줄여지나 그 이상은 줄이면 가독성이 떨어진다.

//1. if문 사용
public static void useIf(string name)
{
    if (name != null)
        Console.WriteLine(name);
    else
        Console.WriteLine("(null)");
}

public static void useIf(string name)
{
    if (name != null) Console.WriteLine(name);
    else Console.WriteLine("(null)");
}

 

1-2. 삼항 연산자 사용

//2. 삼항연산자 사용
public static void useTernaryOperator(string name)
{
    Console.WriteLine(name == null ? "(null)" : name);
}

삼항 연산자를 사용함으로써 코드 라인은 한 줄로 줄어들 수가 있다.

그러나 이마저도 타이핑할 코드를 줄이기 위해서 다음과 같은 방법을 이용할 수 있겠다.

 

1-3. ?? (null 병합 연산자) 사용

//3. ??(null 병합 연산자) 사용
public static void useNullCoalescingOperator(string name)
{
    Console.WriteLine(name ?? "(null)");
}

위의 코드처럼 null이라면 그대로 (null)이라는 string값을, 아니라면 name을 그대로 출력한다.

microsoft의 공식문서에는 다음과 같이 표현한다.

null 병합 연산자 ??는 null이 아닌 경우 왼쪽 피연산자의 값을 반환합니다. 그렇지 않으면 오른쪽 피연자를 평가하고 그 결과를 반환합니다. 왼쪽 피연산자가 null이 아닌 것으로 평가되면 ?? 연산자는 오른쪽 피연산자를 평가하지 않습니다.

 

2. ??= (Null Coalescing Assignment Operator)

C# 8.0 이상에서 사용할 수 있는 null 병합 할당 연산자 ??=는 왼쪽 피연산자가 null로 계산되는 경우에만 오른쪽 피연산자의 값을 왼쪽 피연산자에 대입합니다. 왼쪽 피연산자가 null이 아닌 것으로 평가되면 ??= 연산자는 오른쪽 피연산자를 평가하지 않습니다.
//2. ??=(null 병합 할당 연산자)
public static void useNullCoalescingAssignmentOperator()
{
    List<int> numbers = null;
    int? a = null;

    (numbers ??= new List<int>()).Add(5);
    Console.WriteLine(string.Join(" ", numbers));  // output: 5

    numbers.Add(a ??= 0);
    Console.WriteLine(string.Join(" ", numbers));  // output: 5 0
    Console.WriteLine(a);  // output: 0
}

null 병합 연산자와 비슷하지만 ?? 연산자는 null일 경우 우항 값을 출력하는 것이고,

??= 연산자는 해당 변수가 null일 경우 초기값을 넣어주는 것과 같은 개념이다.

 

 

3. ?. (Null Conditional Operator) 

List<int> list = GetList(); //null을 반환했다면?
Console.WriteLine(list.Count); //예외 발생!
Console.WriteLine(list?.Count); //null 반환

//C# 6.0 컴파일러는 다음과 같은 코드로 변환 처리
Console.WriteLine(list != null ? new int?(list.count) : null);

변수가 null 이 아닐 때 값을 리턴하는 null 조건 연산자이다.

 

public static void useNullConditionalOprator()
{
    /*
    List<int> list = GetList(); //null을 반환했다면?
    Console.WriteLine(list.Count); //예외 발생!
    Console.WriteLine(list?.Count); //null 반환

    //C# 6.0 컴파일러는 다음과 같은 코드로 변환 처리
    Console.WriteLine(list != null ? new int?(list.count) : null);
    */

    List<int> list1 = new List<int>();
    List<int> list2 = null;
    Console.WriteLine(list1?.Count); //0

    int? ret = list2?.Count;
    Console.WriteLine(ret == null ? "(null)" : ret.Value.ToString()); //(null)
}

 

 

 

 

 

 

 

 

<참조>

https://docs.microsoft.com/ko-kr/dotnet/csharp/language-reference/operators/null-coalescing-operator

 

?? 및 ??= 연산자 - C# 참조

C# null 병합 연산자인 ?? 및 ??=에 대해 알아봅니다.

docs.microsoft.com

 

[MSSQL & SQL Server] Dirty Read, WITH (NOLOCK)

 

 

기존에 써온 Postgresql과는 다르게 MSSQL은 기본적으로 SELECT문을 실행하더라도 공유 잠금(Shared Lock)이 걸린다.

이는 Dirty Read를 방지하기 위한 MSSQL의 기본 격리수준(Isolation Level)이 Read Committed이기 때문이다.

무슨 소리일까 자세히 알아보자.

 

1. Dirty Read란?

The simplest explanation of the dirty read is the state of reading uncommitted data. In this circumstance, we are not sure about the consistency of the data that is read because we don’t know the result of the open transaction(s). 

dirty read는 커밋되지 않은 데이터를 읽는 상태를 말한다. 따라서 이 상황에서는 열린 트랜잭션의 결과를 모르기 때문에 읽는 데이터의 일관성에 대해 확신할 수 없다. 이는 ACID 원칙에 위배된다.

 

2. SQL Server의 기본 격리 수준(Isolation Level)

By default, SQL Server sets an exclusive lock for data that is being modified to ensure data consistency until the transaction is complete. So, it isolates the modified data from the other transaction.

바로 이 때문에 SQL Server에서는 트랜잭션이 완료될 때까지 데이터의 일관성을 보장하기 위해 수정 중인 데이터에 대해 배타적 잠금(Exclusive Lock)을 설정한다. 이렇게 함으로써 수정된 데이터를 다른 트랜잭션과 분리한다.

Read uncommitted is the weakest isolation level because it can read the data which are acquired exclusive lock to the resources by the other transactions. So, it might help to avoid locks and deadlock problems for the data reading operations. On the other hand, Read Committed can not read the resource that acquires an exclusive lock, and this is the default level of the SQL Server.

커밋되지 않은 읽기는 다른 트랜잭션에 의해 리소스에 대한 배타적 잠금을 획득한 데이터를 읽을 수 있기 때문에 가장 약한 격리 수준이다. 따라서 데이터 읽기 작업에 대한 잠금 및 교착 상태 문제를 방지하는데 도움이 될 수 있다. 반면 Read Committed는 배타적 잠금을 획득한 리소스를 읽을 수 없으며, 이것이 SQL Server의 기본 격리 수준이다.

 

3. Exclusive Lock(배타적 잠금)

Exclusive Lock은 특정 Row를 변경(write)하고자 할 때 사용된다. 특정 Row에 Exclusive Lock이 해제될 때까지, 다른 트랜잭션은 읽기 작업을 위해 Shared Lock을 걸거나, 쓰기 작업을 위해 Exclusive Lock을 걸 수 없다.

Exclusive Lock은 SELECT ... FOR UPDATE나 UPDATE, DELETE 등의 수정 쿼리를 날릴 때 각 Row에 걸리는 Lock이다.

 

4. WITH(NOLOCK)

실 사용시에는 수만 명이 동시에 동일한 서버에 접속하게 되므로 Insert, Update, Delete가 이루어지는 상태에서 그저 기다릴 수 없기에 Dirty Read를 실행해야 한다면?

with(nolock) 구문을 사용하면 된다. 

해당 구문을 사용하면 선행작업과 상관없이 트랜잭션이 완료되지 않아도 Select문 수행이 가능해진다.

SELECT *
  FROM [schema].[table]
  WITH(NOLOCK);

Select 문장에서 여러 테이블을 조인해서 가져오는 경우 WITH(NOLOCK)을 사용하기 위해서는 모든 테이블에 적어주어야 하지만 Procedure 내에서 Select문에 WITH(NOLOCK)을 사용하기 위해서는 각 문장마다 삽입할 필요 없이 프로시저 시작 부분에 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED를 추가해주면 된다.

CREATE PROCEDURE [procedure_name]
	AS 
   SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
 BEGIN
       SELECT * FROM [schema].[table] 
       ...       
   END

 

5. 결론

이를 통해 조회 성능이 올라가고 데드락(Deadlock)을 방지할 수 있다. 그러나 앞서 말했다시피 Comitted 되지 않은 데이터를 읽기 때문에 트랜잭션이 Rollback 될 경우, 데이터 정합성을 잃을 수 있다.

고로, WITH(NOLOCK)은 정확성이 필요한 경우에는 사용하지 말아야 한다.

 

 

참고로 Oracle과 Postgresql은 MVCC로 Lock을 제어하기 때문에 다른 DBMS처럼 Dirty Read 개념이 필요 없다.

 

 

<참조>

https://www.sqlshack.com/dirty-reads-and-the-read-uncommitted-isolation-level/

 

Dirty Reads and the Read Uncommitted Isolation Level

This article discusses Dirty Read issue and Read Uncommitted Isolation Level in SQL Server.

www.sqlshack.com

 

[.NET] .NET Eco System 용어 정리

 

 

내가 헷갈려서 정리하는 닷넷 생태계.

비슷한 용어가 계속 나오고 또 중복기능들이 존재하기 때문에 닷넷의 역사를 알지 못하면 이해하기가 쉽지 않다.

따라서 해당 포스팅으로 꾸준히 정리해나갈 생각이다.

 

 

1) .NET ?

.NET은 다음과 같은 다양한 종류의 앱을 빌드하기 위한 무료 오픈 소스 개발 플랫폼입니다.

클래스 라이브러리를 사용하여 다양한 앱과 앱 유형 간에 기능을 공유합니다.

.NET을 사용하면 빌드하는 앱 유형과 관계없이 코드 및 프로젝트 파일의 모양과 느낌이 같습니다. 각 앱에서 동일한 런타임, API, 언어 기능에 액세스 할 수 있습니다.

https://docs.microsoft.com/ko-kr/dotnet/core/introduction

 

.NET(및 .NET Core) - 소개 및 개요

.NET(및 .NET Core)에 대해 알아봅니다. .NET은 다양한 종류의 앱을 빌드하기 위한 무료 오픈 소스 개발 플랫폼입니다.

docs.microsoft.com

 

 

2) .NET vs ASP.NET ?

.NET은 응용 프로그램을 개발, 실행 및 실행할 수 있는 소프트웨어 프레임워크인 반면 ASP.NET은 동적 웹 응용 프로그램을 빌드할 수 있는 .NET의 일부인 웹 프레임워크이다.

(The main difference between .NET and ASP.NET is that .NET is a software framework that allows developing, running and executing applications while ASP.NET is a web framework which is a part of .NET that allows building dynamic web applications.)

 

즉, .NET 생태계 안에서 웹 프레임워크 담당이 ASP.NET 이다.

https://pediaa.com/what-is-the-difference-between-net-and-asp-net/

 

What is the Difference Between .NET and ASP.NET - Pediaa.Com

The main difference between .NET and ASP.NET is that .NET is a software framework that allows developing, running and executing applications while ASP.NET is a web framework which is a part of .NET that allows building dynamic web applications.

pediaa.com

 

 

 

3) ASP.NET MVC ?

ASP.NET은 웹 애플리케이션을 만들기 위한 세 가지 프레임워크 Web Forms, ASP.NET MVC 및 ASP.NET Web Pages를 제공한다.그중ASP.NET MVC는 MVC 디자인 패턴을 웹 프로그래밍에서 활용할 수 있게 한 웹 프레임워크이다. 

요약짤

3-1) Web Forms

ASP.NET Web Forms를 사용하면 익숙한 끌어서 놓기, 이벤트 중심 모델을 사용하여 동적 웹 사이트를 빌드할 수 있습니다. 디자인 화면과 수백 개의 컨트롤 및 구성 요소를 통해 데이터 액세스를 지원하는 정교하고 강력한 UI 중심 사이트를 신속하게 빌드할 수 있습니다.

Web Forms에 대한 자세한 정보

 

3-2) MVC

즐겁고, 민첩한 개발을 위해 전체 제어 태그를 제공하여 명확한 영역 분리를 사용할 수 있는 동적 웹 사이트를 만들도록 강력한 패턴 기반의 방법인 ASP.NET MVC를 사용합니다. ASP.NET MVC에는 최신 웹 표준을 사용하는 정교한 애플리케이션을 만들기 위한 TDD 친화적 개발을 지원하는 여러 기능이 포함되어 있습니다.

MVC에 대한 자세한 정보

 

3-3) ASP.NET 웹 페이지

ASP.NET Web Pages 및 Razor 구문은 서버 코드를 HTML과 결합하여 동적 웹 콘텐츠를 만들 수 있는 빠르고 간단하며 사용하기 쉬운 방식을 제공합니다. 데이터베이스에 연결하고, 비디오를 추가하고, 소셜 네트워킹 사이트에 연결하고, 최신 웹 표준을 따르는 아름다운 사이트를 만들 수 있는 여러 기능을 포함하세요.

Web Pages에 대한 자세한 정보

 

https://docs.microsoft.com/ko-kr/aspnet/overview

 

ASP.NET 개요

웹 사이트, 웹 애플리케이션 및 Web API를 만들 수 있는 무료 프레임워크 ASP.NET을 소개합니다.

docs.microsoft.com

 

 

4) ASP.NET Core

ASP.NET은 웹에 적합한 .NET 프레임워크의 첫 번째 버전이었습니다. ASK.NET Core는 더 풍부한 기능, 더 편안한 인터페이스, 새로운 라이브러리 및 기타 차이점을 제공하는 개선된 버전입니다. 우리는 잠시 후에 나란히 비교에 대해 이야기할 것이지만 지금은 다음과 같은 핵심 사항이 있습니다. 

  • ASP.NET Core는 개선된 ASP.NET의 연속입니다.
  • ASP.NET Core는 오픈 소스 도구로 사용할 수 있습니다.
  • ASP.NET Core는 크로스 플랫폼이며 Windows에서만 작동하는 ASP.NET과 달리 macOS, Linux 및 Windows에서 실행됩니다.
  • ASP.NET과 마찬가지로 ASP.NET Core는 대부분의 웹 개발 프레임워크와 마찬가지로 Model-View-Controller 프레임워크를 기반으로 합니다.
  • ASP.NET Core는 강력한 클라우드 지원을 제공하며 ASP.NET보다 모듈식 아키텍처를 더 잘 지원합니다. 

따라서 ASP.NET Core는 ASP.NET의 보다 새롭고 편안한 버전입니다. Microsoft 팀은 사용자 경험과 관련하여 개선할 수 있는 사항을 이해하고 기능을 개선했습니다. 

(ASP.NET was the first version of the web-adapted .NET framework. ASK.NET Core is an improved version with richer functionality, a more comfortable interface, new libraries, and other distinctions. We’ll talk about their side-by-side comparison just in a minute, but here are the key points for now: 

  • ASP.NET Core is the continuation of ASP.NET, an improved one;
  • ASP.NET Core is available as an open-source tool;
  • ASP.NET Core is cross-platform and runs on macOS, Linux, and Windows, unlike ASP.NET that works only on Windows;
  • Just like ASP.NET, ASP.NET Core is based on the Model-View-Controller framework, like most web development frameworks;
  • ASP.NET Core has robust Cloud support, and it supports modular architecture better than ASP.NET does. 

So, ASP.NET Core is a newer, more comfortable version of ASP.NET. Microsoft’s team understood what things could be improved in regards to user experience and improved the functionality. 

)

https://jelvix.com/blog/asp-net-vs-asp-net-core

 

What is the Difference between ASP.Net vs ASP.Net Core? - Jelvix

How does ASP.NET Core compare to the ASP.NET? This article talks about the key differences that might help you make your decision.

jelvix.com

 

 

5) ADO.NET ? 

ADO.NET은 OLE DB 및 ODBC를 통해 노출되는 데이터 소스, SQL Server 및 XML과  같은 데이터 소스에 대한 일관성 있는 액세스를 제공합니다. 데이터 공유 소비자 애플리케이션은 ADO.NET을 통해 이러한 데이터 소스에 연결하여 포함된 데이터를 검색, 처리 및 업데이트할 수 있습니다. (Like JDBC)

https://docs.microsoft.com/ko-kr/dotnet/framework/data/adonet/ado-net-overview

 

개요 - ADO.NET

.NET Framework ADO.NET 대한 개요를 읽고 자세한 설명과 예제를 보려면 리소스에 대해 읽어보세요.

docs.microsoft.com

 

 

6) cshtml ? 

확장자가 .cshtml인 파일은 웹 페이지 파일을 사용자 브라우저에 렌더링 하기 위해 Razor Markup 엔진에서 서버 측에서 사용하는 C# HTML 파일입니다. (Like JSP)

(A file with .cshtml extension is a C# HTML file that is used at server side by Razor Markup engine to render the webpage files to user’s browser. This server side coding is similar to the standard ASP.NET page enabling dynamic web content creation on the fly as the webpage is written to the browser. The server executes the server-side code inside the page before sending the generated page to the browser. Complex tasks such as accessing databases and rendering complex views. CSHTML files can be generated and programmed using Microsoft Visual Studio.)

https://docs.fileformat.com/web/cshtml/

 

CSHTML - ASP.NET Razor Webpage

Learn about CSHTML file format and APIs that can create and open CSHTML files.

docs.fileformat.com

 

 

 

 

 

 

 

 

 

 

 

 

 

[Visual Studio] 테마 변경, 줄 번호 표시, 텍스트 색 변경

 

Eclipse, STS, Android Studio, Intellij, Webstorm 그리고 Visual Studio까지.. 

C#,. NET 환경에서는 Visual Studio 사용이 필수 불가결하다.

. NET SDK를 이용하여 외부 IDE에서 작업할 수 있다고 하지만 애플 생태계처럼 microsoft 생태계가 호환이 잘 된다고 하니..

이제 Visual Studio로 작업을 해보자. 그 첫 번째는 테마 변경이다.

 

최초 설치한 상태는 이렇게 흰 화면으로 되어있다.

분명 공식문서에서는 어두운 테마가 default라고 하는데 왜 난 흰색..?

 

1. 테마 변경

1-1) 도구 - 옵션 탭

 

1-2) 환경 - 일반 - 색테마

 

1-3) 테마 변경 확인

흐음 어두운 건 좋은데 App.config 같은 XML 형식의 문서는 알아보기가 조금 어렵구나..!

일단 줄번호를 매겨보자

 

 

2. 줄번호 표시

2-1) 도구 - 옵션 탭

 

2-2) 텍스트 편집기 - 모든 언어 - 줄 번호

 

2-3) 확인

줄 번호까지 매겨봤으나... 뭔가 파랑~톤이 비슷비슷하게 보이네..! 해당 색들도 변경해보자.

 

 

3. 텍스트 색 변경

3-1) 도구 - 옵션 탭

 

3-2) 환경 - 글꼴 및 색 - 표시 항목(줄 번호)

설정 표시 드롭다운에서는 텍스트 편집기를 선택하고 표시 항목줄 번호. 항목 전경(Item foreground)을 원하는 색으로 변경해주자.

 

3-3) 환경 - 글꼴 및 색 - 표시 항목(XML 특성)

다른 여러 표시 항목이 있지만 그중에서도 XML 특성의 항목 전경을 다른 색으로 변경해주자.

 

3-4) 확인

 

짜잔 이제 XML 형태의 문서를 보기가 조금 편해진 것 같다!

 

 

 

 

<참조>

https://docs.microsoft.com/ko-kr/visualstudio/ide/quickstart-personalize-the-ide?view=vs-2022 

 

Visual Studio 어두운 테마를 설정하고 텍스트 색을 변경합니다. - Visual Studio (Windows)

기본 Visual Studio 색 테마를 어두운 모드로 변경하고 코드 편집기에서 글꼴 색을 변경하는 방법에 대해 알아봅니다.

docs.microsoft.com

 

[Visual Studio] 대상 프레임워크 버전 변경(target .NET Framework)

 

별안간 닷넷 개발자가 되어버렸다.

앞으로 수없이 배울 내용들을 기록하는 용도로 적어보려고 한다.

 

 

외부 솔루션(프로젝트)을 import 시킬 때 해당 프로젝트와 설치한 Visual Studio의. NET 버전이 안 맞을 수 있다.

만약 솔루션의 프레임워크 버전이 높다면 일단 로드를 한 뒤에, 인터넷으로 설치를 하여 타깃 프레임워크를 설치하고 Visual Studio를 재시작하여야한다.

그 뒤 설루션을 로드 한 다음에 해당 Properties탭서비스에서 변경이 가능하다.

 

 

 

읽어보면 좋을 글.

https://s-core.co.kr/insight/view/%EC%95%8C%EC%95%84%EB%91%90%EB%A9%B4-%EC%93%B8%EB%AA%A8-%EC%9E%88%EB%8A%94-%EB%8B%B7%EB%84%B7-net-%EC%9D%B4%EC%95%BC%EA%B8%B0/

 

에스코어

에스코어는 디지털 혁신을 위한 고급 프로페셔널 서비스를 제공합니다. 매니지먼트 컨설팅과 소프트웨어 테크놀로지 서비스 오퍼링을 살펴보세요.

s-core.co.kr

 

[Node.js] Node.js 설치 및 REPL 터미널 실행

 

 

Node.js란 javascript Runtime이다.

자바스크립트 엔진을 장착한 브라우저의 역할을 Node가 해준다.

Node의 장단점은 분명히 존재하는데 일단 가장 큰 장점 중 하나는 javascript로 구성된 백엔드 프로그래밍이 가능하다는 것이다.

java, python을 따로 배우지 않고 풀 스택으로 프로그래밍이 가능하다는 점에서 아주 생산성이 올라간다.

 

저번에 React 프로젝트 실행하면서 node.js를 설치해봤지만 이번엔 백엔드 프로그램을 만들어보려고 한다.

https://nodejs.org/ko/

 

Node.js

Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.

nodejs.org

에서 안정 버전을 설치해주도록 하자.

 

 

설치를 잘하고 나면

난 예전에 설치함..

 

REPL이란 REPL 은 Read Eval Print Loop의 약자로 터미널에서 커맨드를 입력하면 시스템이 값을 반환하는 환경을 가리킨다.

사용법은 단순하게 node라고 치면 된다.

그럼 명령어를 칠 수 있도록 > 표시가 나타난다.

 

브라우저의 개발자 모드 콘솔과 똑같이 작동한다! 

 

REPL 커맨드

  • Ctrl+C – 현재 명령어를 종료합니다.
  • Ctrl+C (2번)  – Node REPL을 종료합니다.
  • Ctrl+D – Node REPL을 종료합니다.
  • 위/아래 키 – 명령어 히스토리를 탐색하고 이전 명령어를 수정합니다.
  • Tab – 현재 입력란에 쓴 값으로 시작하는 명령어 / 변수 목록을 확인합니다.
  • .help – 모든 커맨드 목록을 확인합니다.
  • .break – 멀티 라인 표현식 입력 도중 입력을 종료합니다.
  • .clear – .break 와 같습니다.
  • .save filename – 현재 Node REPL 세션을 파일로 저장합니다.
  • .load filename – Node REPL 세션을 파일에서 불러옵니다.

 

 

 

 

 

 

 

 

<참조>

https://velopert.com/235

 

[Node.JS] 강좌 04편: REPL 터미널 | VELOPERT.LOG

REPL 은 Read Eval Print Loop의 약자입니다. 이는 윈도우 커맨드, 혹은 UNIX/LINUX Shell 처럼 사용자가 커맨드를 입력하면 시스템이 값을 반환하는 환경을 가르킵니다. Node.js는 REPL 환경과 함께 제공되며

velopert.com

 

+ Recent posts