Bower와 npm의 차이점은 무엇입니까?


1763

사이의 근본적인 차이 무엇 bowernpm? 평범하고 단순한 것을 원하십시오. 내 동료 사용의 몇 가지 본 적이 bowernpm자신의 프로젝트에서 상호 교환을.




7
이 질문에 대한 답변은 구식입니다. 우리가 평탄한 의존성을 지원하는 npm 3을 사용한다면 2016 년에 무엇을 해야하는지 말해 줄 수 있습니까? wince npm3와 bower의 차이점은 무엇이며 지금 가장 좋은 방법은 무엇입니까?
amdev

2
결론 : @amdev : 이제 bower는 더 이상 사용되지 않습니다. npm (또는 약간의 차이 인 Yarn)이 있습니다. 실행 가능한 대안을 모릅니다.
XML

답변:


1914

모든 패키지 관리자는 많은 단점이 있습니다. 당신은 당신이 살 수있는 것을 선택해야합니다.

역사

npm 은 node.js 모듈 관리를 시작했지만 ( node_modules기본적으로 패키지가 들어가는 이유 ) Browserify 또는 webpack 과 결합하면 프론트 엔드에서도 작동합니다 .

Bower 는 프론트 엔드만을 위해 만들어졌으며이를 염두에두고 최적화되었습니다.

저장소의 크기

npm은 범용 JavaScript ( country-data국가 정보 또는 sorts프런트 엔드 또는 백 엔드에서 사용할 수있는 정렬 기능 등)를 포함하여 bower보다 훨씬 큽니다 .

바우어는 훨씬 적은 양의 패키지를 가지고 있습니다.

스타일 처리

Bower는 스타일 등을 포함합니다.

npm은 JavaScript에 중점을두고 있습니다. 스타일은 개별적으로 다운로드하거나 같은 것을 요구하는 npm-sasssass-npm.

의존성 처리

가장 큰 차이점은 npm이 중첩 된 종속성을 수행하지만 (기본적으로 고정되어 있음) Bower는 평평한 종속성 트리를 필요로한다는 것입니다 (사용자에 대한 종속성 해결 부담을 가짐) .

중첩 된 종속성 트리는 종속성에 고유 한 종속성 등이있을 수 있음을 의미합니다. 이를 통해 두 모듈이 서로 다른 버전의 동일한 종속성을 요구하고 여전히 작동합니다. npm v3 이후로 종속성 트리는 기본적으로 기본적으로 공간을 절약하고 필요한 경우에만 중첩됩니다 (예 : 두 개의 종속성에 자체 버전의 Underscore가 필요한 경우).

일부 프로젝트는 프론트 엔드 패키지에 Bower를 사용하고 Yeoman, Grunt, Gulp, JSHint, CoffeeScript 등과 같은 개발자 도구에는 npm을 사용한다는 것입니다.


자원


37
프론트 엔드에서 중첩 종속성 트리가 왜 그렇게 잘하지 않습니까?
Lars Nyström

24
프론트 엔드 npm 패키지도 플랫 종속성 트리가 아닐 수 있습니까? "왜 2 개의 패키지 관리자가 필요합니까?" 양도 논법.
Steven Vachon

38
"플랫 의존성 트리"는 무엇을 의미합니까? 평평한 나무는 무엇입니까? 그때는 나무가 아닙니다.
mvmn

14
실제로 경로는 나무이기도합니다. 특별한 경우입니다. WikiPedia에서 : "수학에서, 특히 그래프 이론에서, 트리는 두 정점이 정확히 하나의 경로로 연결되는 무 방향 그래프입니다."
Jørgen Fogh 2014

42
npm 3은 현재 플랫 종속성 트리를 지원합니다.
vasa

361

이 답변은 Sindre Sorhus의 답변에 추가 된 것입니다. npm과 Bower의 주요 차이점은 재귀 종속성을 처리하는 방식입니다. 단일 프로젝트에서 함께 사용할 수 있습니다.

NPM 자주 묻는 질문 : (2015 9월 6일에서 archive.org 링크)

중첩 종속성없이 종속성 충돌을 피하는 것이 훨씬 어렵습니다. 이는 npm 작동 방식의 기본이며 매우 성공적인 접근 방식으로 입증되었습니다.

바우어의 홈페이지 :

Bower는 프론트 엔드에 최적화되어 있습니다. Bower는 플랫 종속성 트리를 사용하여 각 패키지마다 하나의 버전 만 필요하므로 페이지로드를 최소로 줄입니다.

요컨대, npm은 안정성을 목표로합니다. Bower는 최소한의 리소스로드를 목표로합니다. 의존성 구조를 작성하면 다음과 같이 표시됩니다.

npm :

project root
[node_modules] // default directory for dependencies
 -> dependency A
 -> dependency B
    [node_modules]
    -> dependency A

 -> dependency C
    [node_modules]
    -> dependency B
      [node_modules]
       -> dependency A 
    -> dependency D

보시다시피 일부 종속성을 재귀 적으로 설치합니다. 종속성 A에는 세 개의 설치된 인스턴스가 있습니다!

나무 그늘:

project root
[bower_components] // default directory for dependencies
 -> dependency A
 -> dependency B // needs A
 -> dependency C // needs B and D
 -> dependency D

여기에서 모든 고유 한 종속성은 동일한 수준에 있습니다.

그렇다면 왜 npm을 사용합니까?

종속성 B는 종속성 C와 다른 버전의 종속성 A가 필요할 수 있습니다. npm 은이 종속성의 두 버전을 모두 설치하므로 어쨌든 작동하지만 Bower는 중복을 좋아하지 않기 때문에 충돌을 일으킬 것입니다 (웹 페이지에 동일한 리소스를로드하기 때문에 매우 비효율적이며 비용이 많이 들며 심각한 오류가 발생할 수 있습니다). 설치할 버전을 수동으로 선택해야합니다. 이렇게하면 종속성 중 하나가 중단 될 수 있지만 어쨌든 수정해야합니다.

따라서 일반적인 사용법은 웹 페이지에 게시하려는 패키지 (예 : 런타임 , 중복을 피하는 경우)에 대해 Bower 이고 테스트, 빌드, 최적화, 확인 등과 같은 다른 항목 (예 : 개발 시간)에 npm을 사용합니다. 중복이 덜 걱정되는 곳).

npm 3 업데이트 :

npm 3은 여전히 ​​Bower와 다르게 작동합니다. 종속성을 전 세계적으로 설치하지만 첫 번째 버전에서만 발생합니다. 다른 버전은 트리에 설치됩니다 (부모 모듈, node_modules).

  • [node_modules]
    • 뎁 A v1.0
    • 뎁 B v1.0
      • 뎁 A v1.0 (루트 버전 사용)
    • 뎁 C v1.0
      • dep v2.0 (이 버전은 루트 버전과 다르므로 중첩 된 설치 임)

자세한 내용 은 npm 3문서를 읽는 것이 좋습니다.


4
"소프트웨어 개발이 절충점에 관한 것"이라는 것이 이제는 거의 진부한 일입니다. 이것은 좋은 예입니다. 하나는 선택해야 하나 에 더 큰 안정성 npm 또는 최소한의 리소스 부하를 bower.
jfmercer 2016 년

6
@ 슈렉 나는 당신이 실제로 두 가지를 모두 사용할 수 있다고 암시 적으로 말하고 있습니다. 마지막 단락에서 언급했듯이 목적이 다릅니다. 내 눈에는 절충이 아닙니다.
Justus Romijn

아, 내가 당신을 오해하는 것을 본다. 아니면 충분히 읽지 못했습니다. 설명해 주셔서 감사합니다. :-) 둘 다 절충없이 사용할 수있는 것이 좋습니다.
jfmercer 2016 년

4
@AlexAngas npm3에 대한 업데이트를 추가했습니다. Bower와 비교할 때 여전히 큰 차이점이 있습니다. npm은 항상 여러 버전의 종속성을 지원하지만 Bower는 항상 지원하지 않습니다.
Justus Romijn

npm 3 bower에 다가 가기;)
ni3

269

TL; DR : 일상적인 사용에서 가장 큰 차이점은 중첩 된 종속성이 아니라 모듈과 전역의 차이점입니다.

이전 포스터는 기본적인 차이점을 잘 다루었다고 생각합니다. (npm의 중첩 된 종속성 사용은 실제로 가장 중요한 차이점이라고 생각하지 않지만 크고 복잡한 응용 프로그램을 관리하는 데 실제로 도움이됩니다.)

그러나 Bower와 npm의 가장 근본적인 차이점 중 하나를 명시 적으로 설명한 사람은 아무도 없습니다. 위의 답변을 읽으면 'pms'라는 단어가 npm의 맥락에서 자주 사용됩니다. 그러나 그것은 심지어 구문 차이 일 수도있는 것처럼 우연히 언급됩니다.

그러나 모듈 대 전역 (또는 모듈 대 '스크립트') 의 이러한 구분은 Bower와 npm의 가장 중요한 차이점 일 수 있습니다.모듈에 모든 것을 넣는 npm 접근 방식을 사용하려면 브라우저의 Javascript 작성 방식을 거의 확실히 개선해야합니다.

Bower 접근법 : <script>태그 와 같은 글로벌 리소스

기본적으로 Bower는 일반 스크립트 파일을로드하는 것입니다. 해당 스크립트 파일이 무엇이든 Bower가로드합니다. 기본적으로 어떤 정자는 그냥 평범한 된 모든 스크립트를 포함 같다고 수단 <script>에 '이야 <head>당신의 HTML의.

따라서 동일한 기본 접근 방식을 사용하지만 몇 가지 자동화 편의를 얻을 수 있습니다.

  • 예전에는 프로젝트 저장소에 JS 종속성을 포함 시키거나 (개발하는 동안) CDN을 통해 JS 종속성을 가져와야했습니다. 이제 리포지토리에서 추가 다운로드 무게를 건너 뛸 수 있으며, 누군가는 bower install로컬에서 필요한 것을 신속 하고 즉시 얻을 수 있습니다.
  • Bower 종속성이에 자체 종속성을 지정하면 해당 종속성 bower.json도 다운로드됩니다.

그러나 그 이상으로 Bower는 javascript 작성 방법을 변경하지 않습니다 . Bower가로드 한 파일에 들어가는 내용은 전혀 변경할 필요가 없습니다. 특히 이것은 Bower가로드 한 스크립트에서 제공되는 리소스 가 브라우저 실행 컨텍스트의 어느 곳에서나 사용할 수있는 전역 변수 로 정의 될 수 있음을 의미합니다.

npm 접근 방식 : 공통 JS 모듈, 명시 적 종속성 주입

노드 랜드의 모든 코드 (및 npm을 통해로드 된 모든 코드)는 모듈 (구체적으로 CommonJS 모듈 형식 의 구현 또는 현재 ES6 모듈)로 구성됩니다. 따라서 NPM을 사용하여 브라우저 측 종속성을 처리하는 경우 (Browserify 또는 동일한 작업을 수행하는 다른 작업을 통해) Node와 같은 방식으로 코드를 구성합니다.

내가 왜 똑똑한 사람들이 '왜 모듈입니까?'라는 문제를 다루었지만 캡슐 요약은 다음과 같습니다.

  • 모듈 내부의 모든 것은 사실상 네임 스페이스 이므로 더 이상 전역 변수가 아니며 의도하지 않고 실수로 참조 할 수 없습니다.
  • 모듈을 사용하려면 모듈 내부의 모든 것을 특정 컨텍스트 (일반적으로 다른 모듈)에 의도적으로 주입해야합니다.
  • 즉, 응용 프로그램의 여러 부분에서 동일한 외부 종속성 (lodash,하자)의 여러 버전을 가질 수 있으며 충돌 / 충돌하지 않습니다. (자신의 코드가 한 버전의 종속성을 사용하려고하지만 외부 종속성 중 하나가 충돌하는 다른 버전을 지정하기 때문에 놀라 울 정도로 자주 발생합니다. 또는 각각 다른 버전을 원하는 두 개의 외부 종속성이 있습니다.)
  • 모든 종속성은 특정 모듈에 수동으로 주입되기 때문에 추론하기가 매우 쉽습니다. 당신은 사실을 알고 있습니다. "이 작업을 할 때 고려해야 할 유일한 코드는 의도적으로 여기에 주입하기로 선택한 것 입니다. "
  • 주입 된 모듈의 내용도 사용자가 할당 한 변수 뒤에 캡슐화 되고 모든 코드가 제한된 범위 내에서 실행되므로 놀라움과 충돌이 매우 불가능합니다. 의존성 중 하나에서 무언가가 실수로 전역 변수를 재정의하지 않고 실수로 재정의하거나 그렇게 할 가능성은 훨씬 적습니다. (이 일이 있지만, 일반적으로 같은과, 그것을 할 수있는 길 밖으로 갈 필요 window.variable. 즉, 여전히 할당되어 발생하는 경향이 한 사고 this.variable즉 실현하지, this실제로 window현재 컨텍스트에 있습니다.)
  • 개별 모듈을 테스트하려는 경우 모듈 내부에서 실행되는 코드에 정확히 어떤 다른 요소 (종속성)가 영향을 미치는지 쉽게 알 수 있습니다. 또한 모든 것을 명시 적으로 주입하기 때문에 이러한 종속성을 쉽게 조롱 할 수 있습니다.

프론트 엔드 코드를위한 모듈의 사용은 다음과 같이 요약됩니다.보다 좁은 컨텍스트에서 작업하고 추론하고 테스트하기가 더 쉬워지고, 무슨 일이 일어나고 있는지 확실하게 알 수 있습니다.


CommonJS / Node 모듈 구문을 사용하는 방법을 배우는 데 약 30 초가 걸립니다. 모듈이 될 주어진 JS 파일 내에서 먼저 다음과 같이 사용하려는 외부 종속성을 선언하십시오.

var React = require('react');

파일 / 모듈 내에서 평소와 같이 무엇이든하고 외부 사용자에게 노출시키고 자하는 객체 나 함수를 생성합니다. myModule 있습니다.

파일 끝에서 다음과 같이 세상과 공유하려는 모든 것을 내 보냅니다.

module.exports = myModule;

그런 다음 브라우저에서 CommonJS 기반 워크 플로우를 사용하려면 Browserify와 같은 도구를 사용하여 모든 개별 모듈 파일을 가져 와서 런타임에 컨텐츠를 캡슐화하고 필요에 따라 서로 삽입하십시오.

그리고 ES6 모듈 (Babel 또는 이와 유사한 것으로 ES5로 변환 될 가능성이 높음)이 널리 수용되고 있으며 브라우저 또는 노드 4.0에서 모두 작동하므로 좋은 개요를 언급해야합니다. 를 합니다.

이 데크 에서 모듈로 작업하기위한 패턴에 대해 자세히 알아보십시오 .


편집 (2017 년 2 월) : Facebook의 Yarn 은 요즘 npm을위한 매우 중요한 잠재적 교체 / 보충입니다. npm이 제공하는 것을 기반으로하는 빠르고 결정적인 오프라인 패키지 관리입니다. JS 프로젝트를 살펴볼 가치가 있습니다. 특히 프로젝트를 쉽게 교체 할 수 있기 때문입니다.


EDIT (2019 년 5 월) "Bower는 더 이상 사용되지 않습니다 . 스토리 끝." (h / t : @DanDascalescu, 아래에 정리 요약이 나와 있습니다.)

그리고 Yarn 이 여전히 활성화되어 있지만 Yarn의 주요 기능 중 일부를 채택하면 많은 모멘텀이 npm으로 돌아갔습니다.


13
이 답변이 여기에있어서 다행입니다. 다른 인기있는 답변은이 세부 사항을 언급하지 않습니다. npm은 모듈 식 코드를 작성하도록합니다.
Juan Mendes

자바 스크립트 parlands의 모든 혼란을 거의 신경 쓰지 않는 사람들로부터 미안하지만 작은 웹 응용 프로그램을 사용하는 비즈니스를 운영합니다. 최근에 웹에서 개발할 툴킷과 함께 bower를 사용하여 npm을 시도해야했습니다. 가장 큰 차이점은 대기 시간이며 npm은 나이가 걸린다는 것을 알 수 있습니다. 칼로 싸우는 사람들이 자신의 상사에게 '컴파일'소리를 지르면서 xkcd 만화를 컴파일한다는 것을 기억하십시오. 그것은 npm이 bower에 추가 한 것입니다.
Pedro Rodrigues

129

2017 년 10 월 업데이트

Bower는 마침내 더 이상 사용되지 않습니다. . 이야기의 끝.

이전 답변

Spotify의 JavaScript 개발자 인 Mattias Petter Johansson의 의견 :

거의 모든 경우에 Bower보다 Browserify 및 npm을 사용하는 것이 더 적합합니다. Bower보다 프론트 엔드 앱을위한 더 나은 패키징 솔루션입니다. Spotify에서는 npm을 사용하여 전체 웹 모듈 (html, css, js)을 패키징하고 매우 잘 작동합니다.

Bower는 자체적으로 웹 패키지 관리자로 브랜드화합니다. 이것이 사실이라면 정말 좋을 것입니다. 프론트 엔드 개발자로서 제 인생을 더 좋게 만든 패키지 관리자는 정말 좋을 것입니다. 문제는 Bower가 목적에 맞는 특수 공구를 제공하지 않는다는 것입니다. 그것은 npm이 알지 못하는 툴링을 제공하지 않으며 특히 프론트 엔드 개발자에게 특히 유용한 툴은 없습니다.프론트 엔드 개발자가 npm 이상 Bower를 사용하면 아무런 이점이 없습니다.

우리는 bower 사용을 중단하고 npm 주위에 강화해야합니다. 고맙게도, 그 일 이 일어나고 있습니다 :

모듈 수-정자 대 npm

browserify 또는 webpack을 사용하면 모든 모듈을 큰 축소 파일로 연결하는 것이 매우 쉬워 져 성능, 특히 모바일 장치에 적합합니다. 같은 효과를 얻으려면 훨씬 더 많은 노력이 필요합니다.

npm은 또한 여러 버전의 모듈을 동시에 사용할 수있는 기능을 제공합니다. 많은 응용 프로그램 개발을 수행하지 않은 경우 처음에는 나쁜 일이 될 수 있지만 일단 의존성 문제 를 겪고 나면 한 모듈의 여러 버전을 가질 수있는 능력이 꽤 있다는 것을 알게 될 것입니다. 훌륭한 기능. NPM이 매우 편리한 포함 참고 중복 제거 도구를 자동으로 당신이 실제로있는 경우에만 모듈의 두 가지 버전을 사용할 수 있는지 확인합니다 것을 두 모듈이 모두있는 경우 -에 있습니다 , 그들은 것 하나 개의 모듈의 동일한 버전을 사용하십시오. 그러나 그들이 할 수 없다면 매우 유용합니다.

(참고 웹팩롤업 널리 8월 2016 년 기준으로 더 나은 Browserify 이상으로 간주된다)


7
<풍자는>도 '안녕하세요 세계'NPM 프로젝트를 실행하는 데 300 + 모듈이 필요하다고 생각하고있는하시기 바랍니다 ... </ 풍자> : O
MARIUSZ Jamro

1
"최소 축소 파일"이 "특히 모바일 장치에 적합"하다는 데 동의하지 않습니다. 반대의 경우 : 제한된 대역폭에는 필요에 따라로드되는 작은 파일이 필요합니다.
Michael Franzl

좋은 조언은 아닙니다. 대부분의 npm 패키지는 nodejs 백엔드입니다. 백엔드에서 자바 스크립트를 사용하지 않거나 모듈 시스템이없는 경우 Bower가 사용자의 요구를 훨씬 더 잘 충족시킬 수 있기 때문에 패키지 수는 관련이 없습니다.
Gerardo Grignoli

4
@GerardoGrignoli : bower가 나왔습니다 .
Dan Dascalescu

45

Bower는 단일 버전의 모듈을 유지 관리하며 올바른 / 최적의 모듈을 선택하도록 도와줍니다.

자바 스크립트 의존성 관리 : npm vs bower vs volo?

모듈 시스템이 있고 로컬에서 작업하기 때문에 NPM이 노드 모듈에 더 좋습니다. Bower는 현재 글로벌 범위 만 있고 작업중인 버전에 대해 매우 선택 적이기 때문에 브라우저에 적합합니다.


4
나는 Sindre가 그가 중첩 된 의존성에 대해 이야기 할 때 언급했다고 생각합니다.
게임 Brainiac

5
@GamesBrainiac 당신의 정확한, 그냥 내 자신의 말로 넣어 줄 알았는데.
Sagivf

1
@Sagivf 당신이 여기에 원래의 답변을 제공 한 곳이 아니라면 – 이것들은 당신 자신의 말이 아닙니다
dayuloli

4
@Sagivf ** 답변을 스스로 제공하지 않았다면 ** 다른 답변의 해당 부분 을 복사하는 데 아무런 문제 가 없습니다. 당신이 "내가 말한대로 넣을 줄 알았는데"라고 말하면서 약간의 버그가 생겼습니다. 크레딧은 크레딧이 필요한 곳으로 가야합니다.
dayuloli

2
너희들이 왜이 답변을 그렇게 많이 선택했는지 모르겠다. 이 답변에는 실제로 새로운 정보 / 관점이 있습니다.
Calvin

33

우리 팀은 Bower를 떠나 다음과 같은 이유로 npm으로 마이그레이션했습니다.

  • 프로그래밍 방식의 사용법이 힘들었습니다.
  • 바우어의 인터페이스는 계속 바뀌었다
  • url 속기와 같은 일부 기능은 완전히 손상되었습니다.
  • 같은 프로젝트에서 Bower와 npm을 모두 사용하는 것은 고통 스럽습니다.
  • bower.json 버전 필드를 git 태그와 동기화하는 것은 고통 스럽습니다.
  • 소스 제어! = 패키지 관리
  • CommonJS 지원은 간단하지 않습니다

자세한 내용은 "팀에서 bower 대신 npm을 사용하는 이유"를 참조하십시오 .


17

이 유용한 설명은 http://ng-learn.org/2013/11/Bower-vs-npm/ 에서 발견되었습니다.

한편으로 npm은 node.js 환경에서 사용되는 모듈 또는 Karma, lint, minifiers 등과 같은 node.js를 사용하여 개발 된 개발 도구를 설치하기 위해 만들어졌습니다. npm은 프로젝트에서 로컬로 (기본적으로 node_modules) 모듈을 설치하거나 전역 적으로 여러 프로젝트에서 사용할 수 있습니다. 대규모 프로젝트에서 종속성을 지정하는 방법은 종속성 목록이 포함 된 package.json이라는 파일을 작성하는 것입니다. 이 목록은 npm install을 실행할 때 npm에 의해 인식되며이를 다운로드하여 설치합니다.

한편, bower는 프론트 엔드 종속성을 관리하기 위해 작성되었습니다. jQuery, AngularJS, 밑줄 등과 같은 라이브러리. npm과 유사하게 bower.json이라는 종속성 목록을 지정할 수있는 파일이 있습니다. 이 경우 프론트 엔드 종속성은 bower install을 실행하여 설치되며 기본적으로 bower_components라는 폴더에 설치됩니다.

보시다시피, 비슷한 작업을 수행하지만 매우 다른 라이브러리 세트를 대상으로합니다.


1
의 등장으로 npm dedupe약간 구식입니다. Mattias의 답변을 참조하십시오 .
Dan Dascalescu

7

node.js를 사용하는 많은 사람들에게 bower의 주요 이점은 전혀 자바 스크립트가 아닌 종속성을 관리하는 것입니다. Javascript로 컴파일되는 언어로 작업하는 경우 npm을 사용하여 일부 종속성을 관리 할 수 ​​있습니다. 그러나 모든 종속성이 node.js 모듈이되는 것은 아닙니다. 자바 스크립트로 컴파일하는 일부 사용자는 소스 코드를 기대할 때 이상한 소스 언어로 변환하여 자바 스크립트로 컴파일하여 불필요한 옵션을 전달할 수 있습니다.

npm 패키지의 모든 것이 사용자 용 자바 스크립트 일 필요는 없지만 npm 라이브러리 패키지의 경우 적어도 일부는 있어야합니다.


이 npmjs 블로그 게시물 에는 "패키지에는 ES6, 클라이언트 측 JS 또는 HTML 및 CSS 등 어떤 것이 든 포함될 수 있습니다. 이들은 자연스럽게 JavaScript와 함께 제공되므로 여기에 넣으십시오."
Dan Dascalescu

1
사이에 차이가 포함될 수 있습니다 , 그리고 포함해야한다는 . 물론 어떤 것도 포함 할 수 있지만 일반적 으로 commonJS에 대한 일종의 인터페이스를 포함해야합니다 . 결국 '노드 패키지 관리자'입니다. 이것들에 관한 부분은 Javascript와 함께 자연스럽게 나타나는 것들입니다 . Javascript와 접하게 관련되어 자연스럽게 나타나지 않는 많은 것들이 있습니다.
jessopher
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.