Vue.js로 개발을 하기위해 환경세팅을 할 때, npm과 yarn을 사용할 일이 있었습니다.

둘 다 node.js 개발환경에 필요한 패키지를 관리하는 패키지매니저라는 것을 알고 있었는데, 어떤 차이점이 있는지, 그리고 두가지를 혼용하여 사용해도 왜 크게 문제가 없는지 궁금하여 각각의 특징과 차이점을 찾아보았습니다.

 

Yarn과 npm

Yarn과 npm은 둘 다 JavaScript 개발에서 종종 사용되는 패키지 매니저로, 프로젝트의 종속성을 관리하고 설치하는 데 사용됩니다. 이들은 개발자가 애플리케이션에 필요한 외부 라이브러리와 패키지를 쉽게 관리할 수 있게 해줍니다.

npm (Node Package Manager)

npm은 Node.js의 기본 패키지 매니저입니다. Node.js는 JavaScript 실행 환경이며, npm은 Node.js를 다운로드하고 설치할 때 자동으로 함께 설치됩니다. npm은 npm 레지스트리라는 저장소를 통해 수많은 패키지 생태계를 제공합니다. 이는 패키지를 설치, 게시, 관리하는 데 사용되는 명령 줄 도구입니다.


주요 기능:

  • 대규모 패키지 생태계: npm은 사용 가능한 수백만 개의 패키지를 보유하고 있어 프로젝트에서 쉽게 사용할 수 있습니다.
  • 버전 관리: npm은 패키지 버전을 지정하고 semantic versioning에 따라 종속성을 관리할 수 있습니다.
  • 스크립팅: npm에는 다양한 개발 작업을 정의하고 실행할 수 있는 내장된 태스크 러너가 포함되어 있습니다.
  • 협업: npm은 자체 패키지를 공유하고 게시할 수 있도록 해주어 다른 사람들이 해당 패키지를 사용할 수 있습니다.

Yarn

Yarn은 JavaScript 애플리케이션용으로 개발된 또 다른 인기 있는 패키지 매니저입니다. Facebook에서 npm의 한계와 성능 문제를 해결하기 위해 개발되었습니다. Yarn은 npm으로 설계된 패키지와 호환될 수 있도록 되어 있습니다.


주요 기능:

  • 성능: Yarn은 패키지 설치 및 종속성 해결 등에서 보다 빠르고 안정적입니다. 특히 대규모 프로젝트에서 성능상 이점이 있습니다.
  • 결정론적 설치: Yarn은 락파일(yarn.lock)을 사용하여 동일한 종속성 버전이 다른 기기에서도 일관되게 설치되도록 보장합니다.
  • 오프라인 모드: Yarn은 내장된 오프라인 캐싱을 가지고 있어 인터넷에 연결되지 않은 상태에서도 패키지를 설치할 수 있습니다.
  • 병렬 다운로드: Yarn은 패키지를 병렬로 가져오기 때문에 설치 과정을 크게 가속화할 수 있습니다.

Yarn과 npm의 차이점

  • 패키지 설치: Yarn은 결정론적 알고리즘과 락파일을 사용하여 일관된 설치를 보장하는 반면, npm은 package-lock.json 파일을 사용합니다. 이로 인해 설치된 종속성에 약간의 차이가 생길 수 있습니다.
  • 성능: 일반적으로 Yarn이 패키지 설치 및 종속성 해결과 같은 작업에서 더 빠르고 효율적입니다. 특히 대규모 프로젝트에서 그 이점이 큽니다.
  • 캐싱: Yarn은 내장된 캐싱 기능을 가지고 있어 인터넷 연결이 없는 상황에서도 패키지를 설치할 수 있으며, 다음 설치 과정을 가속화합니다. npm은 npm 버전 5부터 캐싱을 지원하지만 Yarn의 캐싱 기능만큼 고급화되지 않았습니다.
  • 사용자 인터페이스: Yarn은 npm에 비해 더 간결하고 사용자 친화적인 명령 줄 인터페이스를 제공합니다.

 

요약하면, Yarn과 npm은 JavaScript 프로젝트에서 종속성을 관리하는 데 사용되는 패키지 매니저입니다. Yarn은 npm의 성능 및 신뢰성 문제를 개선하기 위해 만들어졌지만, 두 패키지 매니저 모두 JavaScript 생태계에서 널리 사용됩니다. 선택은 주로 개인의 선호도와 프로젝트 요구 사항에 따라 달라집니다.

'IT > VS' 카테고리의 다른 글

[Java] StringBuilder VS BufferedWriter  (0) 2023.04.02
[Shell] $*과 $@의 차이  (0) 2022.07.30
[ VS]arguments VS parameter  (0) 2021.09.23

알고리즘 문제를 풀 때 답을 제출하기 위해서 문자열을 조작할 때 자주 사용하는 클래스가 두가지가 있습니다.

StringBuilder와 BufferedWriter가 있는데, 두가지 모두 유사하게 사용하고 있지만, 자세하게 어떤 차이가 있는지 그리고 어떤 특징과 장단점이 있는지 잘 정리가 안되어서 각각의 특징과 장단점을 알아봅시다.

 

 

StringBuilder와 BufferedWriter는 둘 다 문자열을 처리하는 클래스입니다. 하지만 각각의 특징과 장단점은 다릅니다.

 

StringBuilder

StringBuilder는 문자열을 조작하는 데 사용되며, 내부적으로 가변 문자열 배열을 사용합니다. 문자열 조작은 메모리 내부에서 수행되므로 속도가 빠르며, 문자열을 추가하거나 수정하는 데 용이합니다. 반면에 StringBuilder는 멀티스레드 환경에서 안전하지 않으므로, 동시에 여러 스레드에서 접근하거나 수정하는 것은 권장되지 않습니다.

 

StringBuilder의 장점

  • 문자열 조작이 빠르다.
  • 추가 및 수정이 용이하다.

StringBuilder의 단점

  • 멀티스레드 환경에서 안전하지 않다.
  • 문자열 출력 기능이 없다.

BufferedWriter

BufferedWriter는 출력 스트림에 대한 버퍼를 제공하여 문자열을 출력할 때 I/O 작업 횟수를 줄입니다. 즉, 출력 작업이 매우 빠르게 수행되며, 매번 파일에 접근하지 않고, 한 번에 많은 양의 데이터를 출력할 때 유용합니다. BufferedWriter는 멀티스레드 환경에서 안전합니다.

 

BufferedWriter의 장점

  • 출력 작업이 매우 빠르다.
  • 파일에 접근하지 않고, 한 번에 많은 양의 데이터를 출력할 때 유용하다.

BufferedWriter의 단점

  • 문자열 조작 기능이 없다.

참고 자료

StringBuilder 공식문서: https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/StringBuilder.html

BufferedWriter 공식문서: https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/BufferedWriter.html

 
 
 

'IT > VS' 카테고리의 다른 글

[JavaScript] NPM vs Yarn  (0) 2023.07.14
[Shell] $*과 $@의 차이  (0) 2022.07.30
[ VS]arguments VS parameter  (0) 2021.09.23

리눅스에서 쉘스크립트를 확인하다 보면 볼 수 있는 인자값 $*과 $@이 있다.

검색해보면 둘 다 인자값을 넘겨주는 변수인데 어떤 차이가 있는지 알아보았다.

 

$* expands to all parameters that were passed to that shell script.
$0 = shell script's name
$1 = first argument
$2 = second argument ...etc
$# = number of arguments passed to shellscript

 

It means all the arguments passed to the script or function, split by word.
It is usually wrong and should be replaced by "$@", which separates the arguments properly

 

리눅스에서 사용되는 명령어들은 인자값을 받을 수 있다.

예를들면 도커 이미지를 실행하는 명령어는 다음과 같다.

docker start [images]

위의 명령어를 보면 docker 명령어에, start와 images 인자를 함께 전달하여 명령어를 실행한 것인데

 

$* 같은 경우는 넘어온 모든 인자들을 하나의 문자열로 보기 때문에

[start images]라고 인식을 하며

 

$@ 같은 경우는 넘오온 인자들을 각각의 인자로 인식하기 때문에

start / images 로 인식하게 된다.

 

위에 언급한 인용문처럼 일반적으로 $*는 잘못된 사용법이며, $@로 바꿔야 한다고 이야기하고 있다.

 

참고

 

https://stackoverflow.com/questions/12413848/what-does-mean-in-a-shell-script

 

what does $* mean in a shell script

What does $* exactly mean in a shell script? For example consider the following code snippet $JAVA_HOME/bin/java/com/test/Testclass $*

stackoverflow.com

 

 

'IT > VS' 카테고리의 다른 글

[JavaScript] NPM vs Yarn  (0) 2023.07.14
[Java] StringBuilder VS BufferedWriter  (0) 2023.04.02
[ VS]arguments VS parameter  (0) 2021.09.23

파라미터와 매개변수, 사람들과 이야기할 때 자주 사용하는 단어이다.

어떤 사람들은 파라미터를 쓰고, 다른 사람은 매개변수라고 말하는데 두개 모두 함수에 전달하는 값을 의미하는 것 같은데 도대체 정확한 정의가 무엇인지, 왜 단어가 두개이고 혼용해서 사용해도 괜찮은 것인지 헷갈려서 찾아보았다.

 

https://stackoverflow.com/questions/156767/whats-the-difference-between-an-argument-and-a-parameter

 

What's the difference between an argument and a parameter?

When verbally talking about methods, I'm never sure whether to use the word argument or parameter or something else. Either way the other people know what I mean, but what's correct, and what's the

stackoverflow.com

구글링을 하였을 때 가장 먼저 나오는 스택오버플로의 답변은 파라미터는 함수의 정의, 선언에서 사용되는 변수를 뜻하고, 아규먼트는 함수를 호출하여 인자를 전달할 때 사용하는 변수들을 의미한다고 한다.

 

수학에서는 어떤 두 식 x = t+1, y = t^2 가 있을 때, 두 식을 묶어주는 변수 t를 매개변수라고 한다.

 

프로그래밍에서도 int a = abc(x) 명령어와 int abc(x){} 함수 선언 사이에 관계를 만들어 준다는 점에서 수학에서의 쓰임과 유사한 점이 있어서 혼용해서 사용하는 것 같고, 한글위키에서 수학의 매개변수 정의나 컴퓨터 프로그래밍의 매개변수 정의 모두 파라미터가 포함되어 있으며, 영문위키에서도 파라미터가 흔히 아규먼트(지역변수)처럼 사용된다고 언급하고 있다.

 

따라서 그냥 편한대로 써도 상관 없을 것 같다.

근데 두 단어의 차이를 알고 나니까 Java Main의 (String[] args)는 왜 메인함수의 선언인데 아규먼트의 약자를 썼을까 하는 생각과, sysparam이나 .param()등으로 자주 보이는 함수들은 왜 그렇게 썼을까 궁금해진다.

 

parameter : 함수,메서드의 선언에 사용되는 변수
arguments : 지역변수, 함수호출시 parameter에 전달되는 데이터

'IT > VS' 카테고리의 다른 글

[JavaScript] NPM vs Yarn  (0) 2023.07.14
[Java] StringBuilder VS BufferedWriter  (0) 2023.04.02
[Shell] $*과 $@의 차이  (0) 2022.07.30

+ Recent posts