일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- Sharding
- 인덱스 순서
- 다섯수치요약
- 머신러닝
- 상자그림
- LRU
- knn분류기
- partitioning
- redis
- Retry
- 인덱스 추가
- 가상면접 사례로 배우는 대규모 시스템 설계
- 데이터베이스 파티셔닝
- 레디스
- 글또
- 데이터베이스 인덱스
- axis interceptor
- axios
- k-Nearest Neighbors
- 쿼리 실행계획
- R Studio
- 샤딩
- 파티셔닝
- DB 파티셔닝
- 오버라이딩
- System Design
- f45
- 통계학개론
- 복합인덱스
- 데이터베이스
- Today
- Total
haileyjpark
Yarn workspace로 모노레포 관리하기 본문
모노레포를 효과적으로 관리하는 툴인 yarn workspace를 도입하기 위해, yarn workspace의 호이스팅에 관해 알아보았습니다.
모노레포의 장단점
모노레포의 장점
- 코드 공유 및 재사용 용이성 : 하나의 저장소에서 모든 코드를 관리하므로 코드를 쉽게 공유하고 재사용할 수 있습니다. 중복된 코드를 최소화하고 효율적으로 유지보수할 수 있습니다.
- 일관성 유지 : 하나의 저장소에서 모든 프로젝트를 관리하면 일관된 코딩 스타일, 디자인 패턴 및 프로젝트 구조를 적용하기가 더 쉽습니다.
- 종속성 관리 향상 : 공통된 의존성을 사용할 때, 버전 충돌 및 호환성 문제를 최소화할 수 있습니다. 이로써 프로젝트 간에 일관된 의존성을 관리할 수 있습니다.
- 테스트 용이성 : 여러 프로젝트 간에 통합 테스트를 수행하기가 용이합니다. 변경 사항이 전체 시스템에 미치는 영향을 빠르게 확인할 수 있습니다.
- CI/CD 적용 용이성 : 모노레포에서는 단일 저장소에서 다수의 프로젝트를 관리하므로 CI/CD 파이프라인을 더 쉽게 설정하고 유지할 수 있습니다.
모노레포의 단점
- 저장소 크기 : 모노레포는 코드의 크기가 커질 수 있습니다. 이는 저장소를 클론하거나 동기화할 때 시간이 오래 걸릴 수 있다는 것을 의미합니다.
- 복잡성 증가 : 다수의 프로젝트를 관리하다보면 저장소의 복잡성이 증가할 수 있습니다. 특히, 여러 팀이나 여러 버전의 언어와 프레임워크를 사용하는 경우 더욱 그러합니다.
- 이력 관리 어려움 : 하나의 저장소에서 여러 프로젝트를 관리하면 코드의 변경 이력이 복잡해질 수 있습니다. 특정 프로젝트의 변경 사항을 추적하거나 롤백하기 어려울 수 있습니다.
- 빌드 및 테스트 속도 : 저장소가 커지면 빌드 및 테스트 시간이 증가할 수 있습니다. 특히, 모든 프로젝트를 한 번에 빌드하고 테스트해야 하는 경우 이 문제가 더 심각해질 수 있습니다.
- 협업의 어려움 : 여러 팀이 모노레포에서 작업할 때 충돌이 발생할 수 있고, 동시에 여러 프로젝트를 변경하는 경우 협업이 어려울 수 있습니다.
Yarn Workspace란?
Yarn Workspace는 여러 패키지를 관리하는 데 사용되는 도구입니다. 모노레포(단일 저장소)에서 여러 패키지를 함께 개발하고, 이를 하나의 리포지토리로 관리할 수 있도록 돕습니다. 각 패키지는 서로 의존성이 있을 수 있으며, 이를 하나의 프로젝트로 효율적으로 관리할 수 있게 해줍니다.
Yarn WorkSpace 사용
루트 디렉토리에서 yarn init 또는 yarn init -y로 package.json을 만들어주고, package.json 파일의 workspaces 속성에 프로젝트의 이름 혹은 프로젝트 폴더의 직접 경로를 아래와 같이 추가합니다.
{
"name": "packages",
"private": true,
"version": "1.0.0",
"license": "MIT",
"workspaces": {
"packages": [
"package-a",
"package-b",
"package-c",
]
}
}
package.json 파일의 priavte 옵션은 npm 공식 배포용이 아닐 경우 true로 설정합니다.\
이렇게 최상단 루트 디렉토리의 package.json에 workspaces를 정의하고 yarn install을 실행하게 되면 최상단의 패키지와 workspaces에 정의된 패키지들을 설치하게 되고,
동일한 패키지를 두개 이상의 프로젝트에서 패키지가 사용하는 경우 호이스팅을 통해 최상위 루트 경로의 node_modules에 해당 패키지를 설치하여 중복 설치를 방지합니다.
Package 버전 관련 테스트
Packages 하위에 package-a, package-b, package-c 존재하는 구조
case 1. package-a / package-b / package-c 가 모두 동일한 패키지 버전을 사용하는 경우
각 서버에서 사용하는 동일 패키지의 메이저 버전이 다르지 않다면 최상단 package/node_modules에 패키지가 설치됨 (마이너 버전과 패치 버전이 달라도 메이저 버전이 같다면 최상단에 하나만 설치됨)
- 모든 서버에 "lodash": "^4.17.10"로 설정되어 있을 경우, 최상단에 4.17.21 버전의 lodash가 설치됨
- package-a에만 "^4.15.10"로 명시하고, package-b와 pacakge-c에는 "^4.17.10"로 설정되어 있을 경우에도 최상단에만 4.17.21 버전의 lodash가 설치됨
- package.json 파일
- package-a/package.json
{
"name": "package-a",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"dependencies": {
"lodash": "^4.17.10",
"sequelize-cli": "^6.2.0"
}
}
-
- package-b/package.json
{
"name": "package-b",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"dependencies": {
"lodash": "^4.17.10",
"sequelize-cli": "^6.2.0"
}
}
-
- package-c/package.json
{
"name": "package-c",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"dependencies": {
"lodash": "^4.17.10",
"sequelize-cli": "^6.2.0"
}
}
- 디렉토리 구조
- 최상단 server/yarn.lock 파일
lodash@^4.17.10, lodash@^4.17.21:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
case 2. package-a는 다른 패키지 버전을 사용하고, package-b / package-c 는 동일한 패키지 버전을 사용하는 경우
- 마이너 버전/ 패치 버전이 다르다면 최상단 package/node_modules에만 가장 최신 버전으로 패키지 설치됨 → ex) 아래와 같이 설정되어 있을 경우 최상단에 4.17.21이 설치됨
- package-a : "^4.16.5"
- package-b : "^4.17.15",
- package-c : "^4.17.10",
- package-d : "^4.17.21"
- 이 때의 yarn.lock 파일은 아래와 같음
-
lodash@^4.17.10, lodash@^4.17.21, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.7.0: version "4.17.21" resolved "<https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c>" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
- - package-a : "^4.16.5" - package-b : "^4.17.15", - package-c : "^4.17.10", - package-d : "^4.17.21"
- 메이저 버전이 다르다면 최상단 package/node_modules와 해당 서버에 각각 패키지가 설치됨
-
2. 메이저 버전이 다르다면 최상단 package/node_modules와 해당 서버에 각각 패키지가 설치됨
- package-a에 "lodash": "^3.10.1"로 설정되어 있고, package-b와 package-c에 "lodash": "^4.17.10"로 설정되어 있을 경우, 최상단에 4.17.21 버전의 lodash가 설치되고, package-a에 3.10.1 버전의 lodash가 각각 설치됨
- package.json 파일
- package-a/package.json
{
"name": "package-a",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"dependencies": {
"lodash": "^3.10.1",
"sequelize-cli": "^6.2.0"
}
}
-
- package-b/package.json
{
"name": "package-b",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"dependencies": {
"lodash": "^4.17.10",
"sequelize-cli": "^6.2.0"
}
}
-
- package-c/package.json
{
"name": "package-c",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"dependencies": {
"lodash": "^4.17.10",
"sequelize-cli": "^6.2.0"
}
}
- 디렉토리 구조
- 최상단 server/yarn.lock 파일
lodash@3.10.1:
version "3.10.1"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6"
integrity sha512-9mDDwqVIma6OZX79ZlDACZl8sBm0TEnkf99zV3iMA4GzkIT/9hiqP5mY0HoT1iNLCrKc/R1HByV+yJfRWVJryQ==
lodash@^4.17.10, lodash@^4.17.21:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
case 3. package-a / package-b / package-c 가 모두 다른 패키지 버전을 사용하는 경우
- 각 서버의 메이저 버전이 모두 다르다면
- lodash 버전이 각각 pacakge-a : ^3.10.1 / pacakge-b : ^2.4.1 / pacakge-c : ^4.17.10 인 경우
- 최상단 packages/node_modules에는 가장 최신 버전의 패키지(4.17.21)가 설치됨
- package-a/node_modules에는 3.10.1 버전의 lodash가 설치됨
- package-b/node_modules에는 2.4.2 버전의 lodash가 설치됨
- package-c/node_modules에는 lodash가 설치되지 않음 (최상단의 가장 최신 버전 lodash 사용)
- package.json 파일
- package-a/package.json
{
"name": "package-a",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"dependencies": {
"lodash": "^3.10.1",
"sequelize-cli": "^6.2.0"
}
}
-
- package-b/package.json
{
"name": "package-b",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"dependencies": {
"lodash": "^2.4.1",
"sequelize-cli": "^6.2.0"
}
}
-
- package-c/package.json
{
"name": "package-c",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"dependencies": {
"lodash": "^4.17.10",
"sequelize-cli": "^6.2.0"
}
}
- 디렉토리 구조
- 최상단 server/yarn.lock 파일
lodash@3.10.1:
version "3.10.1"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6"
integrity sha512-9mDDwqVIma6OZX79ZlDACZl8sBm0TEnkf99zV3iMA4GzkIT/9hiqP5mY0HoT1iNLCrKc/R1HByV+yJfRWVJryQ==
lodash@^2.4.1:
version "2.4.2"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-2.4.2.tgz#fadd834b9683073da179b3eae6d9c0d15053f73e"
integrity sha512-Kak1hi6/hYHGVPmdyiZijoQyz5x2iGVzs6w9GYB/HiXEtylY7tIoYEROMjvM1d9nXJqPOrG2MNPMn01bJ+S0Rw==
lodash@^4.17.10, lodash@^4.17.21:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
case 4. package-a / package-b / package-c 가 모두 동일한 패키지 버전을 사용하다가 package-a만 버전이 변경되는 경우 - 메이저 버전 변경
- package-a / package-b / package-c 모두 ^2.4.2 버전의 lodash를 사용하여 최상단 server/node_modules에만 lodash ^2.4.2 버전이 설치되어 있을 때 pacakge-a의 lodash 버전을 ^3.10.1로 변경하면 package-a 경로에만 3.10.1 버전의 패키지가 설치됨
- server/yarn.lock 파일
변경 전
lodash@^2.4.1:
version "2.4.2"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-2.4.2.tgz#fadd834b9683073da179b3eae6d9c0d15053f73e"
integrity sha512-Kak1hi6/hYHGVPmdyiZijoQyz5x2iGVzs6w9GYB/HiXEtylY7tIoYEROMjvM1d9nXJqPOrG2MNPMn01bJ+S0Rw==
변경 후
lodash@^2.4.1:
version "2.4.2"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-2.4.2.tgz#fadd834b9683073da179b3eae6d9c0d15053f73e"
integrity sha512-Kak1hi6/hYHGVPmdyiZijoQyz5x2iGVzs6w9GYB/HiXEtylY7tIoYEROMjvM1d9nXJqPOrG2MNPMn01bJ+S0Rw==
lodash@^3.10.1:
version "3.10.1"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6"
integrity sha512-9mDDwqVIma6OZX79ZlDACZl8sBm0TEnkf99zV3iMA4GzkIT/9hiqP5mY0HoT1iNLCrKc/R1HByV+yJfRWVJryQ==
case 5. package-a / package-b / package-c 가 모두 동일한 패키지 버전을 사용하다가 package-a만 버전이 변경되는 경우 - 마이너 버전 변경
- 캐럿(^) 사용 시
- 최상단 package/node_modules에 패키지가 설치되고, yarn.lock 파일이 변경됨 (마이너 버전과 패치 버전이 달라도 메이저 버전이 같다면 최상단에 하나만 설치됨)
- yarn.lock 파일이 변경됨
변경 전
lodash@^3.1.0:
version "3.10.1"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6"
integrity sha512-9mDDwqVIma6OZX79ZlDACZl8sBm0TEnkf99zV3iMA4GzkIT/9hiqP5mY0HoT1iNLCrKc/R1HByV+yJfRWVJryQ==
변경 후
lodash@^3.1.0, lodash@^3.10.1:
version "3.10.1"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6"
integrity sha512-9mDDwqVIma6OZX79ZlDACZl8sBm0TEnkf99zV3iMA4GzkIT/9hiqP5mY0HoT1iNLCrKc/R1HByV+yJfRWVJryQ==
- 캐럿 (^) 사용하지 않을 시
- package-a / package-b / package-c 모두 ^3.1.0 버전의 lodash를 사용하여 최상단 server/node_modules에만 lodash ^3.1.0 버전이 설치되어 있을 때 → pacakge-a의 lodash 버전을 ^3.10.1로 변경하고, package-b의 버전에서 캐럿(^)을 제거한 3.1.0으로 설정 시 → package-b 경로에만 3.1.0 버전의 패키지가 설치되고, server/node_modules 최상단에 3.10.1 설치됨
- server/yarn.lock 파일
변경 전
lodash@^3.1.0:
version "3.10.1"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6"
integrity sha512-9mDDwqVIma6OZX79ZlDACZl8sBm0TEnkf99zV3iMA4GzkIT/9hiqP5mY0HoT1iNLCrKc/R1HByV+yJfRWVJryQ==
변경 후
lodash@3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.1.0.tgz#d41b8b33530cb3be088853208ad30092d2c27961"
integrity sha512-kH7H/6T8ut2DMWAHIKJWZoDzYdvy+echL6u2VZbhYYkEjr6Zp15Yjt9pPvIPQwAT/5QaQYdaVPwCcLMP9qeu0w==
lodash@3.10.1, lodash@^3.1.0:
version "3.10.1"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6"
integrity sha512-9mDDwqVIma6OZX79ZlDACZl8sBm0TEnkf99zV3iMA4GzkIT/9hiqP5mY0HoT1iNLCrKc/R1HByV+yJfRWVJryQ==
'소프트웨어 공학' 카테고리의 다른 글
알고리즘 개념 정리 - 정렬 (1) | 2024.10.27 |
---|---|
Yarn workspace로 모노레포 관리시 발생할 수 있는 문제 (2) | 2024.02.04 |
[컴퓨터 구조] 컴퓨터 아키텍처의 주소 지정 방식과 마이크로 연산 (0) | 2023.12.24 |
[JAVA] 함수의 다형성(Polymorphism)과 오버로딩 & 오버라이딩 (0) | 2023.06.04 |
[운영체제] CPU 스케줄링 - 라운드로빈 알고리즘 (1) | 2023.05.21 |