반응형

JavaScript에서 날짜와 시간을 다루다 보면, 타임존(Timezone) 관련 코드에서 종종 헷갈리는 순간이 있습니다.
특히 dayjs를 사용할 때, 아래 두 코드의 차이를 아는 것이 정말 중요해요:

const t1 = dayjs('202505271800', 'YYYYMMDDHH').tz("Asia/Seoul");
const t2 = dayjs.tz('202505271800', 'YYYYMMDDHH', 'Asia/Seoul');

겉보기엔 비슷해 보이지만, 내부적으로는 아주 다른 동작을 하게 됩니다.
이 글에서는 그 차이를 최대한 쉽게 설명해볼게요.


우선 두 코드의 차이부터 볼게요

① dayjs('202505271800', 'YYYYMMDDHH').tz("Asia/Seoul")

  • 이 코드는 먼저 '202505271800'을 UTC 기준으로 해석합니다.
    즉, '2025년 5월 27일 18시'는 UTC 시간대의 6시라고 인식합니다.
  • 그 다음, .tz("Asia/Seoul")을 적용하면서 UTC 6시 → KST 기준 15시로 변환됩니다.
  • 결과적으로 날짜와 시간이 변형됩니다.

② dayjs.tz('202505271800', 'YYYYMMDDHH', 'Asia/Seoul')

  • 이 코드는 처음부터 '202505271800'을 "Asia/Seoul" 시간대로 해석합니다.
  • 즉, '2025년 5월 27일 18시 (한국시간 기준)' 그대로 유지됩니다.
  • 시간 값은 그대로이고, 정확한 타임존이 적용됩니다.

예시로 비교해볼게요

// 1번 방식 (시간이 바뀜)
const t1 = dayjs('202505271800', 'YYYYMMDDHH').tz("Asia/Seoul");
console.log(t1.format()); // 2025-05-28T03:00:00+09:00 ❌ 원래 18시 아님

// 2번 방식 (정확하게 해석됨)
const t2 = dayjs.tz('202505271800', 'YYYYMMDDHH', 'Asia/Seoul');
console.log(t2.format()); // 2025-05-27T18:00:00+09:00 ✅ 원하던 시간

그래서 어떤 걸 써야 할까?

목적추천 방식

 

목적 추천 방식
입력된 시간이 이미 KST라고 가정하고 싶다면 ✅ dayjs.tz(..., ..., 'Asia/Seoul')
입력된 시간이 UTC인데 KST로 변환해서 보여주고 싶다면 ✅ .tz('Asia/Seoul')
 

 


📝 마무리 정리

  • dayjs(...).tz(...)는 UTC로 해석 후 시간대 변환
  • dayjs.tz(..., ..., timezone)는 처음부터 그 시간대를 기준으로 파싱
  • 사용자 입력이 "한국 시간"이라는 것이 확실하다면, 무조건 dayjs.tz(...)를 쓰는 것이 안전합니다
728x90
반응형
반응형

Google Cloud Platform(GCP)에서는 Compute Engine을 통해 가상 머신(VM)을 쉽게 생성하고 관리할 수 있습니다.
이 글에서는 GCP에서 생성한 VM 인스턴스에 SSH로 접속하는 방법을 단계별로 설명합니다.

 

✅ 1. 사전 준비

SSH 접속을 위해 다음 사항이 준비되어 있어야 합니다:

  • ✅ GCP 계정 및 프로젝트 생성 완료
  • ✅ VM 인스턴스 생성 완료
  • ✅ 로컬 환경에 Google Cloud SDK (gcloud) 설치 및 로그인

설치 후 로그인:

gcloud auth login

 

활성화할 프로젝트 지정:

gcloud config set project [PROJECT_ID]

 

✅ 2. gcloud compute ssh 명령어로 SSH 접속하기

GCP에서는 gcloud 명령어로 SSH 키 생성 → VM 등록 → 접속 과정을 자동으로 처리할 수 있습니다.

gcloud compute ssh [VM_INSTANCE_NAME] --zone=[ZONE]

 

실행 시:

  • 로컬에 SSH 키가 없으면 자동 생성
  • VM 인스턴스에 공개키 자동 등록
  • SSH 터널을 통해 접속

✅ 3. 수동 SSH 접속 (이미 키가 등록된 경우)

공개키가 이미 VM에 등록되어 있다면, 일반적인 SSH 명령어로 접속할 수 있습니다:

ssh -i ~/.ssh/google_compute_engine [USERNAME]@[EXTERNAL_IP]

※ 기본 SSH 키는 ~/.ssh/google_compute_engine에 생성됩니다.
※ 퍼미션 오류를 방지하려면 .ssh 폴더는 700, 개인키는 600으로 설정하세요.

 

✅ 4. 접속 오류 발생 시 점검사항

에러 메시지 원인 및 해결
Permission denied (publickey) SSH 키가 VM에 등록되지 않았거나 권한 문제
connection timed out 방화벽 설정에서 포트(22) 허용 안 됨
not found: [VM name] zone 또는 project 설정이 잘못되었을 가능성
 

🔧 확인 명령어들

  • 프로젝트 확인:
gcloud config list project
  • 인증된 사용자 확인:
gcloud auth list
  • VM 목록 확인:
gcloud compute instances list

 

#GCP #GoogleCloud #ComputeEngine #SSH접속 #클라우드서버 #VM인스턴스 #gcloud #서버관리 #리눅스서버 #개발환경세팅 #인프라구축 #DevOps #클라우드기초 #우분투서버 #Debian서버 #IT블로그 #개발자팁 #백엔드개발 #터미널사용법

728x90
반응형
반응형

concurrent.futures란?

Python 3.2 이상에서 기본 제공되는 고수준(High-level) 병렬 처리 라이브러리

concurrent.futures는 멀티스레딩(Thread) 또는 멀티프로세싱(Process)을 훨씬 간단하게 구현할 수 있게 도와주는 표준 라이브러리입니다.
Executor, submit, Future 같은 개념을 기반으로 병렬 작업을 추상화하고 자동으로 스케줄링해줍니다.

대표 클래스

  • ThreadPoolExecutor: 스레드 기반 병렬 처리
  • ProcessPoolExecutor: 프로세스 기반 병렬 처리 (CPU 병렬화에 적합)

주요 개념 설명

Executor 스레드 또는 프로세스를 관리하는 실행기
Future 아직 완료되지 않은 작업의 결과를 나타내는 객체
*submit(fn, args) 작업을 실행 큐에 비동기로 등록
result() 작업이 완료될 때까지 기다린 후 결과 반환

 

기본 사용 예제

from concurrent.futures import ThreadPoolExecutor

def task(x):
    return x * x

with ThreadPoolExecutor(max_workers=3) as executor:
    future = executor.submit(task, 5)
    print(future.result())  # 출력: 25

 

  • submit()은 작업을 비동기로 예약
  • result()는 Future 객체의 실행 결과를 반환 (필요하면 대기)

 

threading 모듈과의 차이점

concurrent.futures는 threading 모듈보다 더 간결하고, 안전하며, 확장성 있는 방식으로 병렬 처리를 제공합니다.

 

항목 threading 모듈 concurrent.futures 모듈
레벨 저수준 (Low-level) 고수준 (High-level)
제어 직접 Thread 객체 생성, 시작, 관리 Executor가 스레드를 대신 관리
코드 복잡도 복잡함 (start/join/lock 등 직접 관리) 매우 간결 (submit만 하면 됨)
오류 처리 try/except 수작업 Future에서 예외 자동 관리
스케줄링 수동 (Queue 사용 필요) 자동 (Executor가 내부 큐 관리)
멀티프로세싱 지원 불가 (Thread만) 가능 (ProcessPoolExecutor로 프로세스 병렬화)

 

코드 비교

1. threading 모듈 사용

import threading

def worker(x):
    print(x * x)

threads = []
for i in range(5):
    t = threading.Thread(target=worker, args=(i,))
    t.start()
    threads.append(t)

for t in threads:
    t.join()
  • 직접 Thread 객체를 생성하고 start(), join()을 관리해야 합니다.
  • 예외 처리는 try/except를 수동으로 구현해야 함

2. concurrent.futures 사용

from concurrent.futures import ThreadPoolExecutor

def worker(x):
    return x * x

with ThreadPoolExecutor(max_workers=5) as executor:
    futures = [executor.submit(worker, i) for i in range(5)]
    results = [f.result() for f in futures]

print(results)  # 출력: [0, 1, 4, 9, 16]
  • submit()만 호출하면 Executor가 자동으로 작업을 관리
  • Future.result()를 통해 결과 또는 예외를 얻을 수 있음

실무에서 언제 어떤 걸 써야 할까?

상황 추천 모듈
웹 크롤링, 파일 다운로드, DB insert 등 I/O 중심 ThreadPoolExecutor
영상 인코딩, 이미지 처리 등 CPU 집중 작업 ProcessPoolExecutor
세밀한 스레드 동기화 제어 필요 (Lock 등) threading (낮은 수준의 제어)

마무리 요약

concurrent.futures란? Executor 기반 병렬 처리 고수준 API
threading과 차이점은? 수동 관리 vs 자동 스케줄링/예외처리
언제 쓰면 좋나? 빠르게 병렬처리를 설계하고 싶을 때 특히 유용

🔗 참고자료

728x90
반응형
반응형

헤비츠 카드지갑 구매 후기

지갑은 늘 손에 닿는 물건이기에, 그 변화가 더 크게 느껴지곤 합니다. 오래 사용해오던 카드 지갑이 점점 헤져가면서, 자연스럽게 '이제 바꿔야 할 때가 왔구나' 하는 생각이 들었습니다. 그러던 중 문득 떠오른 브랜드, 헤비츠.

기존에 쓰던 스타벅스 카드지갑 - 고생했다

다시 떠오른 헤비츠, 익숙한 신뢰감

헤비츠는 예전에 시계 가죽 스트랩을 구매하면서 처음 알게 된 가죽 공방 브랜드입니다. 직접 사용해본 스트랩의 퀄리티와 감촉이 정말 만족스러워, 그 기억이 오래 남아 있었죠. 가죽이 주는 깊이 있는 질감과 시간이 지날수록 자연스럽게 더 멋스러워지는 그 매력, 헤비츠는 그런 가죽을 정말 잘 다루는 브랜드라는 인상이 강했습니다.

그래서 이번에 카드 지갑을 새로 구입해야겠다고 마음먹었을 때, 가장 먼저 떠오른 곳도 당연히 헤비츠였습니다.

마음을 사로잡은 색 조합

홈페이지를 둘러보다가 마침 딱 내 취향에 쏙 드는 색 조합의 카드 지갑을 발견했어요. 너무 튀지 않으면서도 은은하게 멋이 느껴지는 색감, 그리고 군더더기 없는 디자인. 특히 가죽의 질감이 사진으로도 느껴질 만큼 깊고 탄탄해 보였고, 실물이 오기 전부터 이미 마음은 반 이상 기울어 있었죠.

첫인상: ‘단단하지만 가벼운’

지갑을 처음 받아들었을 때의 느낌은 "가볍다" 그리고 "단단하다"였습니다. 손에 쥐었을 때 부담스럽지 않은 무게감과 함께, 가죽 자체가 탄탄하게 마감되어 있다는 인상이 강했습니다. 바느질은 균일하고  내부 마감도 깔끔해서 오래도록 쓰고 싶다는 생각이 들었습니다.

카드는 3~4장 정도 넣을 수 있다고 하는데 3장 정도가 적당할거 같다고 생각됩니다.

2미리 두께 - 원포켓

일상을 담을 공간

요즘은 현금을 거의 사용하지 않기에 카드 지갑 하나면 충분하다는 생각입니다. 오히려 너무 두꺼운 지갑은 부담스러울 정도니까요. 이번에 새로 산 헤비츠 카드 지갑은 그런 현대적인 라이프스타일에 딱 맞는 구성입니다. 꼭 필요한 카드 몇 장과 명함 몇 장만 넣고 다닐 수 있는, 가볍지만 실용적인 동반자 같은 느낌.

 

한 손에 들어오는 크기의 카드 지갑 : 가죽공방 헤비츠

바지 주머니, 자켓 안주머니 등 어디에나 부담 없이 수납 가능한 카드지갑.

smartstore.naver.com

 


마무리하며

헤비츠 카드 지갑을 고른 건 단순히 예쁘기 때문만은 아니었습니다. 예전부터 알고 있던 브랜드, 실제로 써본 경험에서 오는 신뢰, 그리고 가죽이 주는 감성.


이 모든 것이 모여 다시 한 번 선택하게 만든 거죠.

앞으로 이 지갑과 함께 또 어떤 하루하루를 담게 될지 기대됩니다.
가죽이 점점 나만의 흔적으로 변해가는 그 과정마저 즐겁게 느껴지겠죠.

728x90
반응형
반응형

수학 공식이나 머신러닝 관련 수식을 티스토리 블로그에 작성해보신 분들이라면 이런 경험 있으실 거예요:

d(x, y) = \sqrt{\sum_{i=1}^{n}(x_i - y_i)^2}

분명 LaTeX 문법으로 썼는데, 그대로 텍스트로 보이기만 한다고요?

그 이유는 티스토리는 기본적으로 수학 공식(LaTeX)을 렌더링하는 기능이 없기 때문입니다.
하지만 걱정 마세요! 아주 간단한 설정만 해주면 수학 공식을 예쁘게 수식 형태로 표시할 수 있습니다.
이번 글에서는 KaTeX을 활용한 설정 방법과 사용 예시까지 알려드릴게요.


✅ KaTeX란?

KaTeX는 LaTeX 문법으로 작성된 수학 공식을 웹에서 빠르게 렌더링해주는 라이브러리입니다.
MathJax보다 가볍고 빠르기 때문에 블로그나 기술 문서에 매우 적합합니다.


🔧 티스토리에 KaTeX 설정하는 방법

1단계. 티스토리 관리자 페이지 접속

[티스토리 관리 > 꾸미기 > HTML/CSS 편집] 메뉴로 이동합니다.

2단계. </head> 태그 바로 위에 아래 코드를 추가

<!-- KaTeX for LaTeX math rendering -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.css">
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.js"></script>
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/contrib/auto-render.min.js"
        onload="renderMathInElement(document.body, {
          delimiters: [
            {left: '$$', right: '$$', display: true},
            {left: '$', right: '$', display: false}
          ]
        });">
</script>

💡 이 스크립트는 $...$ 또는 $$...$$로 감싼 수식을 자동으로 감지하고 렌더링해줍니다.


✍️ 수식 입력 예시

▶ 인라인 수식 (본문 중간에 넣는 방식)

$E = mc^2$

결과:
👉 E = mc²


▶ 디스플레이 수식 (가운데 정렬되는 블록 형태)

$$
d(x, y) = \sqrt{\sum_{i=1}^{n}(x_i - y_i)^2}
$$

결과:

👉

d(x,y)=∑i=1n(xi−yi)2d(x, y) = \sqrt{\sum_{i=1}^{n}(x_i - y_i)^2}


📌 주의사항

  • 미리보기에서는 수식이 제대로 보이지 않을 수 있습니다.
    → 실제 블로그 포스트로 발행 후 확인하세요.
  • 티스토리 에디터에서는 HTML/텍스트 모드를 사용하는 것이 안전합니다.
  • 글에 수식이 많은 경우 페이지 로딩이 살짝 느려질 수 있으니 중요한 수식만 표시하는 것도 팁!

✅ 마무리 요약

항목설명
렌더링 도구 KaTeX
설정 위치 HTML/CSS 편집 > </head> 바로 위
인라인 수식 $ 수식 $
블록 수식 $$ 수식 $$
미리보기 발행 후 확인 필수

🔗 참고 링크

 

KaTeX – The fastest math typesetting library for the web

Simple API, no dependencies – yet super fast on all major browsers.

katex.org

 

728x90
반응형
반응형

데이터를 자동으로 분류할 수 있는 클러스터링 알고리즘 중 가장 널리 사용되는 K-means Clustering!
이번 포스트에서는 이론적인 배경부터, 저사양 CPU에서도 무리 없이 돌릴 수 있는 실습 코드까지 깔끔하게 정리해볼게요.

목차

  1. K-means Clustering이란?
  2. 작동 원리 (알고리즘 흐름)
  3. 수학적 개념 정리
  4. 장점과 단점
  5. 실행 가능한 예제 코드 (CPU 저사양 OK!)
  6. 마무리 요약

1.  K-means Clustering 이란?

K-means는 데이터를 **K개의 클러스터(군집)**로 나누는 대표적인 비지도 학습(Unsupervised Learning) 알고리즘입니다.
각 클러스터는 중심점(centroid)을 가지며, 데이터는 가장 가까운 중심점에 소속됩니다.

📌 예를 들어, 고객을 3개의 소비 성향 그룹으로 나누고 싶을 때 사용할 수 있어요.


2.  작동 원리

K-means는 아래 4단계를 반복하며 군집을 형성합니다.

  1. 초기 중심점 설정 (보통 랜덤 또는 K-means++ 방식)
  2. 데이터 포인트를 가장 가까운 중심점에 할당
  3. 각 클러스터의 평균으로 중심점 업데이트
  4. 중심점 변화가 없으면 종료 (또는 max 반복 횟수까지)

3.  수학적으로 살펴보기

 유클리드 거리

데이터 간의 거리는 보통 **유클리드 거리(Euclidean Distance)**로 계산합니다:

 최적화 목표 (Objective)

K-means는 Within-Cluster Sum of Squares (WCSS) 를 최소화하는 것이 목표입니다:

$$J = \sum_{i=1}^{k} \sum_{x \in C_i} \|x - \mu_i\|^2$$

  • $C_i$: i번째 클러스터
  • $\mu_i$: 클러스터 중심점

4.  장점과 단점

장점

  • 구현이 매우 간단하고 빠름
  • 대용량 데이터에서도 확장 가능
  • 널리 사용됨

단점

  • K를 미리 알아야 함
  • 이상치(outlier)에 민감
  • 구형(원형)이 아닌 클러스터에 부적합

5.  실습 코드: 저사양 CPU에서도 OK!

아래 코드는 scikit-learn을 이용한 간단한 2D 데이터 클러스터링 예제입니다.
저사양 환경(CPU 1코어, 1GB RAM 정도)에서도 무리 없이 실행됩니다.

필요한 라이브러리 설치

pip install numpy matplotlib scikit-learn

 

전체 코드

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans

# 1. 2D 클러스터 데이터 생성
X, y_true = make_blobs(n_samples=300, centers=3, cluster_std=0.60, random_state=0)

# 2. K-means 모델 학습
kmeans = KMeans(n_clusters=3, random_state=0, n_init='auto')
kmeans.fit(X)

# 3. 클러스터 예측 결과
y_kmeans = kmeans.predict(X)

# 4. 시각화
plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=40, cmap='viridis')

# 중심점 시각화
centers = kmeans.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.5, marker='X')
plt.title("K-means Clustering 결과")
plt.xlabel("X1")
plt.ylabel("X2")
plt.show()

결과

  • 3개의 색깔로 나뉜 점들이 각각 클러스터
  • 빨간 X는 각 클러스터의 중심점

마무리 요약

항목설명
알고리즘 종류 비지도 학습 (Unsupervised)
사용 목적 자동으로 데이터 분류
주요 개념 중심점, 유클리드 거리, WCSS 최소화
실습 환경 저사양 CPU에서도 실행 가능

🔗 참고 자료

 

https://matplotlib.org/stable/tutorials/introductory/pyplot.html

 

matplotlib.org

 

 

make_blobs

Gallery examples: Release Highlights for scikit-learn 1.1 Release Highlights for scikit-learn 0.23 Probability Calibration for 3-class classification Probability calibration of classifiers Normal, ...

scikit-learn.org

 

 

KMeans

Gallery examples: Release Highlights for scikit-learn 1.1 Release Highlights for scikit-learn 0.23 A demo of K-Means clustering on the handwritten digits data Bisecting K-Means and Regular K-Means ...

scikit-learn.org

 

728x90
반응형
반응형

“What's my story?” & “My Parallel Universe Job” 아바타 세트 아이디어 ✨

요즘 AI 이미지 생성으로 재미있는 프로필 이미지를 만드는 게 유행이죠?
하지만 단순히 지브리 스타일이나 픽사풍 이미지 말고, 더 창의적이고 특별한 방식으로 자신을 표현할 수는 없을까요?

오늘은 **내 취미와 상상력을 담은 ‘프리미엄 아바타 수집 세트’**라는 콘셉트로, 두 가지 기발한 프롬프트를 소개합니다.
이 아이디어들은 당신만의 개성을 담은 프로필 이미지나, 블로그・SNS 아바타, 혹은 자기소개 콘텐츠로 활용하면 어떨까요!

1️⃣ “What's my story?” 아바타 세트

Create a premium wooden box-style collectible avatar display titled “What’s my story?” for a 45-year-old.
The central figure is a stylized cartoon portrait of the person in the photo, slightly smiling and full of character. The figure is surrounded by a collection of highly detailed miniature items placed in labeled compartments:

  • a tiny notebook
  • a retro handheld game console
  • a classic robot figurine
  • wireless headphones
  • running shoes
  • a folded bicycle
  • a compact fishing rod & colorful lures
  • a mug of black coffee
  • a desk plant
  • a miniature open laptop with code on screen

All items should look realistic but with a playful, collectible figure aesthetic (like Nendoroid or Bearbrick style).
The wooden box background should be warm and grainy, with engraved text:

Top: "What’s my story?"
Bottom: "Age: 45 | Hobbyist. Dreamer. Explorer."

The overall vibe is cozy, creative, and slightly nostalgic — perfect for a modern avatar with personality and charm.

이 프롬프트는 마치 당신의 삶을 장난감 상자에 담아낸 듯한 느낌을 줍니다.
실제 자신이 좋아하는 아이템들을 미니어처로 구성하면서, 그 자체가 자기소개가 되는 거죠.


2️⃣ “My Parallel Universe Job” 아바타 세트

Create a wooden-box style premium collectible avatar display titled "My Parallel Universe Job" for a 45-year-old.
The central figure is a stylized cartoon avatar of the person in the photo, reimagined as a “Time-Traveling Librarian” — wearing steampunk-inspired gear, with brass goggles, a book satchel, and a glowing compass.

Surround the avatar with labeled compartments, each holding magical or sci-fi themed mini items:

  • An enchanted floating book
  • A mini time compass
  • A scroll with glowing runes
  • A tiny steampunk coffee machine
  • A magical plant that reacts to sound
  • A pocket-sized AI assistant in a crystal orb
  • Mini shelves of otherworldly books
  • A holographic cat companion
  • A star map

The wooden box is dark walnut with celestial engravings.

Top label: "My Parallel Universe Job"
Bottom label: "Time-Traveling Librarian | Age 45 | Keeper of Stories & Time"

The entire display should have a mystical, cozy, and geeky charm — like a collectible from a fantasy convention.

이건 정말 상상력을 자극하는 프롬프트입니다.
평행세계에서의 나의 직업을 테마로 설정해, 마치 영화 속 캐릭터처럼 나를 새롭게 재해석할 수 있죠.
'시간 여행하는 사서' 말고도 우주 요리사, 몬스터 유치원 선생님, 드림 엔지니어 등으로도 확장할 수 있어요.


🪄 마무리 팁

이 프롬프트들은 DALL·E, Midjourney, Leonardo AI 같은 이미지 생성 AI에 넣으면 꽤 괜찮은 결과물이 나옵니다.
조금만 편집해서 SNS 프로필, 명함, 웹사이트, 소개 슬라이드 등에 넣어보세요.
지브리풍도 좋지만 그와 다른 기억에 남을 캐릭터를 만들 수 있을 거라 생각합니다.

728x90
반응형
반응형

Node.js 개발에서 TypeScript를 도입할 때 가장 먼저 마주치는 고민 중 하나는 바로 이것입니다.

TypeScript를 전역으로 설치할까? 로컬로 설치할까?

이 글에서는 두 방식의 차이점, 장단점, 실제 추천 시나리오까지 한번에 정리해드립니다.


✅ 전역 설치란?

전역 설치는 시스템 전체에 TypeScript를 설치하여 어느 프로젝트 디렉토리에서도 tsc 명령어를 사용할 수 있게 하는 방식입니다. 다음과 같은 명령어로 설치합니다:

npm install -g typescript

설치 후에는 터미널 어디에서나 다음 명령이 작동합니다:

tsc --version
tsc yourfile.ts

전역 설치의 장점

  • tsc 명령을 터미널 어디서든 바로 쓸 수 있다
  • CLI 툴 사용 시 빠르게 실행 가능
  • 전역 설정에 익숙한 개발자에게 편리

전역 설치의 단점

  • 버전 충돌 가능성: 프로젝트마다 TypeScript 버전이 다를 경우 문제 발생
  • 팀 협업에서 위험: 다른 개발자의 시스템에 같은 버전이 설치되어 있다고 보장할 수 없음
  • CI/CD 파이프라인에서 재현 불가

✅ 로컬 설치란?

로컬 설치는 해당 프로젝트 폴더 안에 TypeScript를 설치하는 방식입니다. 보통 개발 의존성으로 추가합니다:

npm install --save-dev typescript

설치 후에는 전역 명령 대신 npx를 사용해 실행합니다:

npx tsc
npx tsc --init

로컬 설치의 장점

  • 프로젝트별로 TypeScript 버전을 고정할 수 있어 안정성 확보
  • 모든 팀원이 동일한 환경에서 작업 가능
  • CI/CD 환경에서도 100% 재현 가능
  • package.json만 보면 어떤 버전이 쓰였는지 알 수 있다

로컬 설치의 단점

  • tsc를 직접 실행하려면 npx 또는 경로를 지정해야 한다
  • 여러 프로젝트를 오가며 전역 설치처럼 쓰고 싶으면 약간 번거로움

🔍 어떤 상황에 어떤 설치를 써야 할까?

  • 혼자 실습하거나 빠르게 테스트하는 경우
    전역 설치도 무방합니다.
  • 팀 프로젝트, 버전 관리, 협업, CI/CD 구성이 필요한 경우
    반드시 로컬 설치가 권장됩니다.

요즘 대부분의 실제 프로젝트는 typescript를 로컬로 설치하고 npx tsc 또는 tsc npm script로 실행합니다.


🧙 마무리

전역 설치는 빠르고 편리하지만, 협업과 재현성을 위해서는 로컬 설치가 훨씬 안전하고 추천되는 방식입니다.

최종적으로는 다음과 같은 전략을 추천합니다:

  • CLI 툴 실습이나 글로벌 테스트용 → 전역 설치
  • 실제 서비스, 팀 프로젝트, 오픈소스, CI/CD → 로컬 설치 (with --save-dev)

🎯 참고 명령어 요약

# 전역 설치
npm install -g typescript

# 로컬 설치
npm install --save-dev typescript

# 로컬 실행
npx tsc

 

728x90
반응형

+ Recent posts