23.06.15
DEVOTEE를 활성화 시키면
지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.
버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.
| 컨텐츠 유형 | 제목 | 저장일 | 삭제 |
|---|
본인인증 로그인에 실패하였습니다.
회원이 아니시거나 본인인증 등록이
완료되지 않은 사용자입니다.
안녕하세요. 에이닷에서 프론트개발 하고 있는 스카이입니다. 오랜만에 인사드립니다.
업무를 하면서 한 가지 고민이 생겼습니다. 프로젝트의 규모가 커지면서 도메인 별로 저장소와 서버를 분리해서 관리하게 되었습니다.
공통으로 사용되는 로깅 모듈을 개발해야 해야 했는데요. 같은 코드를 모든 프로젝트에 복사/붙여넣기 하는 것은 관리 측면에서 큰 문제가 될 것이라고 생각되었습니다.
이를 해결하기 위해서 npm 처럼 모듈을 개발하고 제공할수 있는 방법이 없을까 고민하게 되었습니다.
npm은 의존성을 쉽게 관리할 수 있는 훌륭한 도구입니다. 쉽게 설치 및 삭제할 수 있고 버전 관리도 간단합니다.
이러한 장점을 그대로 가져가고 싶었습니다. 가장 큰 문제는 회사 전용 모듈이라 모두 공개되는 npmjs 사이트에 등록할 수 없다는 것입니다.
회사 전용 npm 시스템을 구성하는 것도 잠시 생각했으나 얼마나 사용하게 될지 알 수 없는 상황에서 일을 키우는 게 아닌가 싶었습니다.
작고 단순하게 시작해 볼 방법을 찾아봤고 npm 등록하지 않고도 가능한 방법이 있어서 이를 해결한 방법을 소개합니다.
단독 모듈을 만들겠다는 아이디어를 떠올렸을때 빌드 도구로 유명한 Webpack으로 프로젝트 구성을 시도했습니다.
하지만 모든 옵션을 개발자가 이해하고 한땀한땀 설정해줘야 해서 시작부터 쉽지 않았습니다.
어렵게 기본 동작만 가능한 프로젝트를 구성했으나 타입스크립트를 사용하는 프로젝트에서 설치하여 사용하니, 타입 에러 경고가 뜹니다. 타입을 지정해줄 방법을 찾아야했습니다.
다시 Webpack에 기술되어 있는 옵션을 읽고, 이해하고, 테스트해서 정상 동작하는데 확인해야했습니다.
간단한 모듈을 만드는데 이렇게까지 리소스를 들여야 하나 하는 고민이 들었습니다.
그러다가 좀 더 효율적으로 설정할 수 있는 방법을 찾았고 Nuxt 자체에서 이미 Vite를 사용하고 있어서 빌드 도구로 Vite를 도입하게 되었습니다.
Webpack으로 설정하느라 몇 시간이 걸렸는데 Vite로는 1시간 밖에 걸리지 않았습니다.
Vite 빌드 도구인데 이전의 빌드 도구와 차이점, 자세한 내용을 알고 싶다면 사이트에서 알 수 있습니다.
아래 명령어로 Vite가 전역에 설치되어 있는지 먼저 확인합니다.
> npm list -g없다면 Vite를 먼저 설치해주세요.
> npm install vite -gVite 프로젝트를 설정하는 명령어로 프로젝트를 생성합니다.
> npm create vite화면이 없는 모듈을 구성하려고 다음과 같이 선택했습니다.
package.json 파일 열어 보면 다음과 같이 기본 설정이 되어 있습니다.
{
"name": "logger",
"private": true,
"version": "0.0.0",
"type": "module",
"files": [
"dist",
"index.d.ts"
],
"main": "./dist/counter.umd.cjs",
"module": "./dist/counter.js",
"types": "./index.d.ts",
"exports": {
"types": "./index.d.ts",
"import": "./dist/counter.js",
"require": "./dist/counter.umd.cjs"
},
"scripts": {
"dev": "vite",
"build": "tsc && vite build"
},
"devDependencies": {
"typescript": "^5.4.5",
"vite": "^5.2.10"
}
}의존 모듈을 설치하고 로컬에서 실행해 보면 간단한 예제가 잘 동작합니다.
> npm install
> npm run dev'count is' 영역을 누르면 숫자가 증가합니다.
lib/main.ts 코드를 추가합니다. 예제 코드는 단순하게 콘솔 로그를 찍는 코드를 추가했습니다.
export default function logger() {
const sendLog = () => {
console.log('sendLog', arguments)
}
return {
sendLog
}
}index.d.ts 파일에 우리가 정의한 모듈의 타입을 아래처럼 정의해 줍니다.
해당 파일에 정의되어 있어야 타입스크립트를 사용하는 곳에서 타입을 찾을 수 없다는 에러가 발생하지 않습니다.
export default function logger(): {
sendLog: () => void;
};src/main.ts 파일에 코드가 정상 동작하는지 테스트할 코드를 작성합니다.
import logger from '../lib/main'
const log = logger()
log.sendLog()index.html 파일에 코드를 정리합니다. lang, title 변경하고 불필요한 코드를 삭제했습니다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>logger</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.ts"></script>
</body>
</html>아래 명령어로 로컬 환경을 구동합니다.
> npm run dev로컬에서 정상 동작하는지 확인합니다.
빌드 했을 때 만들어지는 파일 이름을 변경하는 작업입니다.
기본 counter로 되어 있는데 이를 프로젝트 이름에 맞게 logger로 변경합니다.
vite.config.ts 과 package.json 파일에 counter를 logger로 변경합니다.
import { defineConfig } from 'vite'
export default defineConfig({
build: {
lib: {
entry: './lib/main.ts',
name: 'logger',
fileName: 'logger'
}
}
}){
"name": "logger",
"private": true,
"version": "0.0.0",
"type": "module",
"files": [
"dist",
"index.d.ts"
],
"main": "./dist/logger.umd.cjs",
"module": "./dist/logger.js",
"types": "./index.d.ts",
"exports": {
"types": "./index.d.ts",
"import": "./dist/logger.js",
"require": "./dist/logger.umd.cjs"
},
"scripts": {
"dev": "vite",
"build": "tsc && vite build"
},
"devDependencies": {
"typescript": "^5.4.5",
"vite": "^5.2.10"
}
}프로젝트에 불필요한 css, svg 기본 이미지를 삭제합니다.
아래 명령어로 빌드합니다.
> npm run builddist 폴더 하위에 빌드 된 파일이 생성됩니다.
각 파일을 확인해 보면 다음과 같습니다.
// logger.js
function e() {
return {
sendLog: () => {
console.log("sendLog", arguments);
}
};
}
export {
e as default
};// logger.umd.js
(function(e,n){typeof exports=="object"&&typeof module<"u"?module.exports=n():typeof define=="function"&&define.amd?define(n):(e=typeof globalThis<"u"?globalThis:e||self,e.logger=n())})(this,function(){"use strict";function e(){return{sendLog:()=>{console.log("sendLog",arguments)}}}return e});.gitignore 파일에 dist를 주석 처리합니다. 빌드 된 결과도 함께 commit 해야 다른 프로젝트에서 사용할 수 있습니다.
다음 명령어로 git 초기화를 한 후 모든 내용을 commit 합니다.
그리고 저장소에 push 합니다.
> git init
> git remote add origin https://{저장소url}/logger.git
> git push -uf origin main태그를 생성합니다. 태그를 생성하는 이유는 모듈을 사용하는 프로젝트마다 다른 버전을 사용할 수 있도록 지원하기 위해서입니다.
회사 내부에서만 사용 가능한 모듈이기 때문에 직접 가져올 수 있도록 사용할 프로젝트 package.json에 다음과 같이 추가했습니다.
#1.0.0 은 앞서 지정한 태그 버전입니다.
"dependencies": {
"logger": "git+https://{저장소url}/logger.git#1.0.0"
}모듈에 타입을 설정했기 때문에 타입 추론이 가능하고 import 해서 사용할 수 있습니다.
아래 명령어로 만든 모듈을 설치하고 사용하면 됩니다.
> npm install버전의 업데이트가 필요하면 아래 명령어로 꼭 업데이트 합니다.
> npm update logger개인 프로젝트라면 여기 끝이 났겠지만 jenkins 활용해서 배포하는 환경에 문제가 발생했습니다.
회사 내에 보안 정책 때문에 다음과 같은 에러가 발생했습니다.
https://{저장소url}/logger.git#1.0.0 접근하지 못해서 발생하는 에러입니다.
이것을 해결하고자 access token을 발급받고 해당 access token id, password를 다음과 같이 추가해서 에러를 해결했습니다.
"dependencies": {
"logger": "git+https://{id}:{password}@{저장소url}/logger.git#1.0.0"
}단독 모듈 개발을 고민하고 있다면 Webpack으로 고통받지 말고 Vite 도입해서 깔끔하게 설정을 끝내세요.
설정하는 삽질은 덜하고 코드 구현에만 집중할 수 있게 도와줍니다.
긴 글 읽어 주셔서 감사합니다.
DEVOTEE를 활성화 시키면
지금 작성한 댓글에 AI가 댓글을 달아줍니다.