728x90
반응형

Elasticsearch를 사용할 때 문서의 title 필드에서 특정 단어가 포함된 문서를 찾으려고 matchmatch_phrase 쿼리를 사용했는데, 기대한 결과가 나오지 않는 경우가 있습니다. 본 글에서는 그 이유를 정리하고, Elasticsearch에 적합한 문서 제목 명명 규칙에 대해 안내합니다.


🔍 문제 상황: title 검색이 안 되는 이유

예를 들어 문서에 다음과 같은 title 값이 있다고 가정합니다.

"title": "Title_Including_Word"

이 문서에서 "Shaft" 라는 단어가 포함된 문서를 찾기 위해 아래와 같은 쿼리를 사용했지만 결과가 0이 나왔습니다.

{
  "query": {
    "match": {
      "title": "Word"
    }
  }
}

혹은 아래와 같은 match_phrase 쿼리를 사용했을 때도 결과가 나오지 않았습니다.

{
  "query": {
    "match_phrase": {
      "title": "Word"
    }
  }
}

✅ 이유는?

  • title 필드가 text 타입이며 기본 standard analyzer를 사용하고 있는 상태에서,
  • "Title_Including_Word"은 하나의 토큰(단어) 으로 분석됨
    (_ 언더스코어는 기본 analyzer에서 단어 구분자가 아님)
  • 따라서 "Word"와 같은 개별 단어는 존재하지 않는 것으로 인식되어 검색되지 않음

✅ 해결 방법

1. regexp 쿼리 사용

text 타입 필드에서 특정 단어가 포함된 문서를 찾고 싶다면 regexp 쿼리를 사용할 수 있습니다.

{
  "query": {
    "regexp": {
      "title": ".*[Ww]ord.*"
    }
  }
}
  • 대소문자 구분을 피하고 싶다면 정규식 안에 [Ss]와 같이 처리
  • 단점: regexp 쿼리는 느릴 수 있고, 복잡한 검색에는 부적합할 수 있음

2. wildcard 쿼리 사용 (단, keyword 필드가 있을 경우에만)

{
  "query": {
    "wildcard": {
      "title.keyword": {
        "value": "*word*",
        "case_insensitive": true
      }
    }
  }
}
  • 단, title.keyword 필드가 존재해야 동작함 (text 필드의 서브 필드로 keyword 타입이 있어야 함)
  • 현재 인덱스 매핑에 keyword 서브 필드가 없다면 사용 불가

📘 문서 제목(title) 명명 방식 가이드

검색 효율성과 정밀도를 높이기 위해 title 필드의 값을 어떻게 구성하는 것이 좋은지에 대한 가이드입니다.

명명 방식 예시 검색 친화도 비고
띄어쓰기 기반 "Title Including Word" ✅ 매우 좋음 analyzer가 자연스럽게 토큰화
kebab-case (-) "title-including-word" ✅ 좋음 - 는 토큰 구분자로 인식됨
snake_case (_) "title_including_word" ❌ 안 좋음 _ 는 기본 analyzer가 분리 못함
camelCase "titleIncludingWord" ❌ 안 좋음 전체가 한 단어로 인식됨

✅ 추천

  • 사람에게 보여질 title, content, summary 같은 필드는 띄어쓰기 기반 자연어 문장 사용
  • 시스템에서 사용하는 id, slug, key 등은 snake_case 또는 kebab-case + keyword 타입 필드로 구성

🧠 팁: 매핑 설정 시 title에 .keyword 필드 추가하기

"title": {
  "type": "text",
  "fields": {
    "keyword": {
      "type": "keyword"
    }
  }
}

이렇게 하면 full-text 검색(text)과 exact match / wildcard 검색(keyword)을 모두 지원할 수 있어 유연성이 높아집니다.


✨ 결론

  • 기본 analyzer는 _를 단어 구분자로 인식하지 않기 때문에 match나 match_phrase로 검색되지 않는 문제가 생길 수 있음
  • 가능하다면 제목은 띄어쓰기 기반으로 작성하거나, 검색 목적에 맞는 필드(keyword)를 함께 설정하는 것이 좋음
  • 정규식이나 wildcard 검색을 사용할 수는 있지만 성능을 고려해 선택적으로 사용하자
반응형
728x90
반응형

이 글에서는 Ubuntu 서버에 Jira를 설치하기 위한 과정을 다룹니다. JDK(Java Development Kit) 설치부터, Jira에서 사용할 PostgreSQL 데이터베이스 설치 및 설정, 마지막으로 Jira 설치까지 순차적으로 안내합니다.


1. JDK(Java Development Kit) 설치

Jira는 Java 기반 애플리케이션이므로 Java 11 이상이 필요합니다. OpenJDK를 설치하는 방법은 다음과 같습니다.

1.1. 저장소 업데이트 및 Java 설치

sudo apt update
sudo apt install openjdk-11-jdk

1.2. 설치 확인

Java가 제대로 설치되었는지 확인합니다.

java -version

2. PostgreSQL 설치 및 설정

Jira는 다양한 데이터베이스를 지원하지만, PostgreSQL이 권장됩니다. 이제 PostgreSQL을 설치하고, Jira에서 사용할 데이터베이스를 생성합니다.

2.1. PostgreSQL 설치

sudo apt install postgresql postgresql-contrib

2.2. PostgreSQL 서비스 상태 확인

설치 후 PostgreSQL이 실행 중인지 확인합니다.

sudo systemctl status postgresql

2.3. PostgreSQL 데이터베이스 및 사용자 생성

postgres 사용자로 전환하여 PostgreSQL에 접속합니다.

sudo -i -u postgres
psql

이후, Jira에서 사용할 데이터베이스와 사용자를 생성합니다.

CREATE DATABASE jiradb WITH ENCODING 'UTF8' LC_COLLATE='en_US.UTF-8' LC_CTYPE='en_US.UTF-8' TEMPLATE=template0;
CREATE USER jirauser WITH PASSWORD 'your_password';
GRANT ALL PRIVILEGES ON DATABASE jiradb TO jirauser;

3. Jira 설치

이제 Jira를 설치합니다. 먼저 Atlassian에서 제공하는 .bin 파일을 다운로드하고, 설치를 진행합니다.

3.1. Jira 설치 파일 다운로드

wget https://www.atlassian.com/software/jira/downloads/binary/atlassian-jira-software-9.12.0-x64.bin

3.2. 파일 실행 권한 부여 및 설치

chmod +x atlassian-jira-software-9.12.0-x64.bin
sudo ./atlassian-jira-software-9.12.0-x64.bin

설치 중, 몇 가지 질문에 대한 답을 설정하면 기본적으로 Jira가 설치됩니다.


4. 추가 설정 및 유지보수

4.1. Jira 로그 확인

만약 Jira가 제대로 시작되지 않으면, 로그 파일을 확인하여 문제를 진단할 수 있습니다.

cat /opt/atlassian/jira/logs/catalina.out

4.2. Jira 시작, 중지, 재시작 상태 확인

Jira를 제어하기 위한 명령어입니다.

sudo service jira start
sudo service jira stop
sudo service jira restart
sudo service jira status
반응형
728x90
반응형

Python 프로젝트를 시작할 때, 의존성 관리와 가상환경 설정을 효율적으로 처리하려면 Poetry를 사용하는 것이 좋습니다. 이 글에서는 Poetry를 이용해 Python 패키지를 초기화하는 과정을 단계별로 설명합니다.


1. Poetry란?

Poetry는 Python 프로젝트의 의존성 관리, 가상환경 설정, 그리고 패키징을 쉽게 해주는 도구입니다. 기존의 piprequirements.txt를 사용하는 방식보다 더 현대적이고 강력한 기능을 제공합니다.

주요 기능:

  • 의존성 추가 및 관리 (dependencies, dev-dependencies 분리)
  • 가상환경 자동 생성 및 관리
  • 프로젝트 설정 파일 (pyproject.toml) 생성
  • 배포 준비 (패키징 및 배포 기능 포함)

2. Poetry 설치

Poetry는 Python 패키지로 설치할 수 있습니다. 아래 명령어를 실행해 설치하세요:

pip install poetry

설치 확인:

poetry --version

3. 프로젝트 디렉토리 생성

먼저 프로젝트 디렉토리를 생성합니다:

mkdir my_project && cd my_project

여기서 my_project는 프로젝트 이름입니다.


4. Poetry로 프로젝트 초기화

Poetry를 이용해 프로젝트를 초기화합니다:

poetry init

이 명령어를 실행하면 대화형 프롬프트가 나타납니다. 아래는 입력 예시입니다:

This command will guide you through creating your pyproject.toml config.

Package name [my_project]:  
Version [0.1.0]:  
Description []: A sample Python project using Poetry
Author []: Your Name <your.email@example.com>
License []: MIT
Compatible Python versions [^3.8]: ^3.8
Would you like to define your main dependencies interactively? (yes/no) [yes]: no
Would you like to define your development dependencies interactively? (yes/no) [yes]: no

입력이 끝나면 프로젝트의 기본 설정이 pyproject.toml 파일에 저장됩니다.


5. 의존성 추가

Poetry를 사용해 프로젝트의 의존성을 추가합니다.

런타임 의존성 추가

예를 들어, Flask와 Requests 라이브러리를 추가하려면:

poetry add flask requests

개발 의존성 추가

테스트와 코드 품질 관리를 위해 pytestblack을 개발 의존성으로 추가:

poetry add --dev pytest black

6. 가상환경 관리

Poetry는 기본적으로 프로젝트 디렉토리 외부에 가상환경을 생성합니다. 가상환경을 활성화하려면:

poetry shell

가상환경을 종료하려면:

exit

가상환경이 어디에 생성되었는지 확인하려면:

poetry env info

7. 디렉토리 구조 설정

아래와 같은 기본 디렉토리 구조를 생성합니다:

mkdir src tests
mkdir src/my_project

src/my_project/__init__.py 파일을 생성하여 패키지로 인식되도록 설정:

touch src/my_project/__init__.py

테스트 디렉토리에도 기본 테스트 파일을 추가합니다:

touch tests/test_basic.py

8. 파일 생성

README 파일

프로젝트 설명을 위한 README.md 파일을 생성합니다:

echo "# My Project\nA sample Python project using Poetry." > README.md

.gitignore 파일

Git에 추가되지 않아야 할 파일을 정의하는 .gitignore 파일을 생성합니다:

curl https://raw.githubusercontent.com/github/gitignore/main/Python.gitignore -o .gitignore

9. 스크립트 실행

가상환경에서 스크립트를 실행하려면:

poetry run python src/my_project/__init__.py

10. 최종 디렉토리 구조

설정을 완료한 뒤, 최종 디렉토리 구조는 아래와 같습니다:

my_project/
├── src/
│   └── my_project/
│       └── __init__.py
├── tests/
│   └── test_basic.py
├── README.md
├── .gitignore
├── pyproject.toml
├── poetry.lock

11. Poetry의 추가 기능

의존성 설치

pyproject.toml 파일에 정의된 의존성을 설치하려면:

poetry install

패키지 빌드

프로젝트를 패키징하려면:

poetry build

패키지 배포

PyPI에 패키지를 배포하려면:

poetry publish

결론

Poetry를 사용하면 Python 프로젝트의 초기화부터 의존성 관리, 패키징까지 모든 과정을 간단하고 체계적으로 관리할 수 있습니다. 위 과정을 따라가며 프로젝트를 시작해 보세요!

반응형
728x90
반응형

1. Elasticsearch란?

Elasticsearch분산 검색 및 분석 엔진입니다. 대량의 데이터를 실시간으로 검색하고 분석할 수 있으며, Apache Lucene을 기반으로 만들어졌습니다. 흔히 ELK 스택 (Elasticsearch, Logstash, Kibana)의 핵심 구성 요소로 사용됩니다.

주요 특징

  • 실시간 검색: 대규모 데이터에서도 빠른 검색 성능을 제공합니다.
  • 분산 시스템: 클러스터를 구성해 데이터를 수평 확장할 수 있습니다.
  • RESTful API: HTTP를 통한 JSON 기반의 인터페이스 제공.
  • 데이터 저장: JSON 형식으로 문서를 저장하고 관리합니다.
  • 강력한 분석: 검색된 데이터를 분석하고 시각화할 수 있습니다.

2. Elasticsearch의 기본 구성

Elasticsearch는 크게 다음과 같은 요소로 구성됩니다.

2.1. 노드(Node)

  • 노드는 Elasticsearch의 실행 인스턴스입니다.
  • 각 노드는 데이터를 저장하고 검색, 색인 작업을 처리합니다.

2.2. 클러스터(Cluster)

  • 여러 노드가 모여 하나의 클러스터를 구성합니다.
  • 데이터를 분산 저장하고 확장성, 고가용성을 제공합니다.

2.3. 인덱스(Index)

  • 인덱스는 Elasticsearch에서 데이터를 저장하는 논리적 단위입니다.
  • 하나의 인덱스는 여러 개의 샤드(Shard)로 나뉩니다.

2.4. 샤드(Shard)와 레플리카(Replica)

  • 샤드(Shard): 데이터를 나누어 저장하는 단위로, 데이터의 수평 확장을 돕습니다.
  • 레플리카(Replica): 샤드의 복제본으로, 고가용성과 장애 복구를 지원합니다.

3. Elasticsearch 설치 및 실행

3.1. 개발 환경 버전 (단일 노드, 보안 비활성화)

개발 환경에서는 간단한 단일 노드 설정으로 시작할 수 있습니다.

Docker 명령어:

docker run -d \
  --name elasticsearch \
  -p 9200:9200 \
  -p 9300:9300 \
  -e "discovery.type=single-node" \
  -e "xpack.security.enabled=false" \
  -v ~/elasticsearch/data:/usr/share/elasticsearch/data \
  elasticsearch:8.5.0

설정 요약

  • 단일 노드: discovery.type=single-node
  • 보안 비활성화: xpack.security.enabled=false
  • 데이터 저장: ~/elasticsearch/data에 영구 저장.

실행 확인

Elasticsearch가 정상 실행되었는지 확인합니다:

curl -X GET "http://localhost:9200"

3.2. 운영 환경 버전 (리소스 제한 및 보안 활성화)

운영 환경에서는 보안과 리소스 관리를 철저히 해야 합니다.

Docker 명령어:

docker run -d \
  --name elasticsearch \
  -p 9200:9200 \
  -p 9300:9300 \
  --memory="2g" \
  --cpus="2" \
  -e "discovery.type=single-node" \
  -e "xpack.security.enabled=true" \
  -v ~/elasticsearch/data:/usr/share/elasticsearch/data \
  elasticsearch:8.5.0

설정 요약

  • 리소스 제한: 메모리 2GB, CPU 2 코어
  • 보안 활성화: xpack.security.enabled=true
  • 데이터 영구 저장: ~/elasticsearch/data

보안 설정

보안을 활성화하면 Elasticsearch는 사용자 인증을 요구합니다.

  1. 기본 사용자 비밀번호 설정:

    docker exec -it elasticsearch /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic

    이 명령어로 elastic 사용자 비밀번호를 설정할 수 있습니다.

  2. 비밀번호를 사용해 접속:

    curl -X GET -u "elastic:<비밀번호>" "http://localhost:9200"

4. Elasticsearch 확인 및 테스트

4.1. 인덱스 생성

curl -X PUT "http://localhost:9200/my_index"

4.2. 인덱스 삭제

curl -X DELETE "http://localhost:9200/my_index"

4.3. 데이터 삽입

curl -X POST "http://localhost:9200/my_index/_doc/1" -H 'Content-Type: application/json' -d'{
  "name": "example document",
  "content": "Elasticsearch 테스트 문서입니다."
}'

4.4. 데이터 검색

curl -X GET "http://localhost:9200/my_index/_search?q=content:테스트&pretty"

5. 결론

Elasticsearch는 빠른 검색, 확장성, 실시간 분석이 필요한 환경에서 유용하게 사용됩니다. 개발 환경과 운영 환경에 따라 설정을 최적화하고, 보안 및 리소스 관리를 철저히 수행하면 안정적인 검색 엔진을 운영할 수 있습니다.

추가 권장 사항

  • Kibana 설치: Elasticsearch 데이터를 시각화하려면 Kibana를 함께 사용하세요.
  • 모니터링: Elastic 제공 모니터링 도구를 활용해 성능 및 상태를 체크하세요.
  • 백업 및 복구: 운영 환경에서는 정기적으로 데이터 백업을 수행하세요.
반응형
728x90
반응형

텍스트 데이터를 다룰 때 청크(chunk)토큰(token)이라는 용어를 자주 접하게 됩니다. 특히 Elasticsearch나 OpenAI의 API를 사용하여 데이터를 처리할 때 청크와 토큰 단위가 어떻게 다르게 동작하는지 이해하는 것은 매우 중요합니다.


1. 청크(Chunk)

정의

청크는 데이터를 일정한 크기로 나누는 단위입니다. 보통 텍스트 데이터를 글자 수바이트 수를 기준으로 나누어 생성합니다.

특징

  • 글자 수 기준: 예를 들어, 글자 수를 1000자로 설정하면 텍스트를 1000자 단위로 나눕니다.
  • 단순한 나누기: 텍스트의 의미와 상관없이 크기만을 기준으로 나눕니다.

예시

function chunkText(text, chunkSize) {
  const chunks = [];
  let start = 0;
  while (start < text.length) {
    chunks.push(text.slice(start, start + chunkSize));
    start += chunkSize;
  }
  return chunks;
}

위 함수는 1000자 단위로 텍스트를 나누는 간단한 예제입니다.

문서 예시:

  • 원본 텍스트: "안녕하세요. 이 텍스트는 청크 단위로 나눠질 것입니다."
  • 청크 크기: 5자
  • 결과:
    • "안녕하세요."
    • " 이 텍스"
    • "트는 청크"
    • " 단위로 나"
    • "눠질 것입"
    • "니다."

2. 토큰(Token)

정의

토큰은 텍스트를 언어 모델이 이해할 수 있는 작은 단위로 나눈 것입니다. 단어 단위와 비슷해 보이지만, 실제로는 Byte Pair Encoding (BPE)이라는 알고리즘을 기반으로 나뉘어집니다.

특징

  • 단어 기준 아님: 단어를 그대로 나누는 것이 아니라, 의미를 유지하면서 작은 단위로 나눕니다.
  • 언어 모델 의존: 사용하는 언어 모델에 따라 토큰화 방식이 다를 수 있습니다.
  • 한글, 영어 처리 차이: 한글은 한 글자가 여러 토큰으로 나눠질 수 있지만, 영어는 상대적으로 더 효율적으로 토큰화됩니다.

토큰화 예시

다음은 OpenAI의 text-embedding-ada-002 모델 기준 토큰화 예시입니다:

텍스트 토큰 개수
"Hello world!" 3
"안녕하세요" 1 ~ 2
"supercalifragilisticexpialidocious" 5 ~ 6

토큰 개수 확인 코드

const { encode } = require('gpt-3-encoder');

const text = "안녕하세요. Hello world!";
const tokens = encode(text);

console.log(`토큰 개수: ${tokens.length}`);

3. 청크와 토큰의 차이점 요약

구분 청크(Chunk) 토큰(Token)
기준 글자 수, 바이트 수 BPE(Byte Pair Encoding) 알고리즘
의미 단위 의미와 관계없이 단순 나누기 의미를 유지하며 나눔
사용처 데이터 저장, 단순 문서 나누기 NLP 모델 입력, 임베딩 처리
예시 1000자 단위로 나누기 단어, 접두사, 접미사 단위로 나누기

4. 청크와 토큰을 함께 사용하기

텍스트를 청크 단위로 나눈 후 각 청크를 토큰화해서 처리하는 경우가 많습니다.

  1. 청크 단위 나누기: 텍스트를 1000자씩 나눕니다.
  2. 토큰화: 각 청크를 토큰화해서 언어 모델에 전달합니다.
  3. 임베딩 및 저장: 토큰화된 데이터를 임베딩하여 Elasticsearch나 데이터베이스에 저장합니다.

마치며

청크토큰의 개념을 명확히 이해하면 텍스트 데이터를 효과적으로 처리할 수 있습니다. 텍스트를 나눌 때 청크는 크기 단위이고, 토큰은 언어 모델이 이해하는 의미 단위라는 점을 기억하세요.

이제 Elasticsearch나 OpenAI API를 사용할 때 더 효율적으로 데이터를 저장하고 검색할 수 있습니다!

반응형
728x90
반응형

프로그래밍 언어마다 각기 다른 방식으로 실행 환경을 관리합니다. 이번 글에서는 Java의 JVM, Node.js의 전역/로컬 환경, Python의 가상환경에 대해 알아보고, 각각의 환경 관리 방식이 어떤 점에서 비슷하고, 어떤 점에서 다른지 정리해 보겠습니다.

1. Java의 JVM (Java Virtual Machine)

1.1 JVM이란?

JVM (Java Virtual Machine)은 Java 프로그램이 실행될 수 있도록 만들어진 가상 컴퓨터입니다. Java 코드는 바이트코드(bytecode)로 컴파일된 후, JVM이 이를 실행합니다. JVM 덕분에 Java 프로그램은 플랫폼 독립성을 가지며, 다양한 운영체제에서 동일하게 실행될 수 있습니다.

1.2 JVM의 역할

  • 플랫폼 독립성 제공: Java 코드가 어느 운영체제에서든 동일하게 실행될 수 있도록 해줍니다. JVM은 운영체제와 상관없이 바이트코드를 해석하고 실행합니다.

  • 런타임 환경 제공: JVM은 Java 프로그램이 실행될 수 있는 런타임 환경을 제공합니다. 이를 통해 메모리 관리, 쓰레드 관리 등 다양한 실행 환경을 관리합니다.

1.3 라이브러리 관리 (lib 폴더)

  • Java 개발에서는 보통 프로젝트에 필요한 외부 라이브러리를 프로젝트의 lib 폴더에 추가하여 관리합니다. 이는 Node.js와 Python의 패키지 개념과 비슷하며, 프로젝트가 필요로 하는 모든 종속성을 한 곳에 모아 관리하는 방식입니다.

1.4 특징

  • JVM은 Java 프로그램이 운영체제 위에서 실행될 수 있는 가상화된 환경을 제공합니다. 이를 통해 Java는 한 번 작성된 코드가 어디서나 실행될 수 있다는 철학을 지킬 수 있습니다.

2. Node.js의 환경 관리 방식

2.1 Node.js 패키지 관리 (npm, npx)

Node.js에서는 패키지를 전역(global) 또는 로컬(local)로 설치할 수 있습니다. 각 프로젝트에 필요한 패키지를 격리하여 관리하기 때문에 Python과 같은 가상환경을 따로 사용하지 않아도 패키지 충돌을 방지할 수 있습니다.

  • 로컬 설치 (npm install package): 패키지를 프로젝트 내의 node_modules 폴더에 설치합니다. 각 프로젝트는 독립적인 node_modules를 가지므로, 프로젝트 간 패키지 충돌을 방지할 수 있습니다.

  • 전역 설치 (npm install -g package): CLI 도구와 같이 시스템 전체에서 사용할 수 있는 패키지를 설치할 때 사용합니다.

2.2 패키지 격리 구조

Node.js는 프로젝트마다 **node_modules** 폴더를 사용하여 패키지를 관리합니다. 이 구조 덕분에 패키지 버전이 다르더라도 각 프로젝트는 독립적인 환경을 유지할 수 있습니다.

2.3 Node Version Manager (nvm)

Node.js에서는 nvm(Node Version Manager)을 사용하여 Node.js 버전을 관리합니다. 프로젝트별로 다른 Node.js 버전을 필요로 할 때, nvm을 통해 쉽게 버전을 변경하고 관리할 수 있습니다. 이는 JVM이 Java 프로그램을 운영체제와 무관하게 실행할 수 있게 하는 것과 비슷한 역할을 합니다.

3. Python의 가상환경 (Virtual Environment)

3.1 가상환경이란?

Python의 가상환경 (virtual environment)은 각 프로젝트에 독립적인 Python 패키지 환경을 제공하는 도구입니다. 가상환경을 사용하면 시스템 전역 Python 환경과는 별개로 프로젝트별로 필요한 패키지를 설치하고 관리할 수 있습니다.

3.2 가상환경의 필요성

  • 패키지 충돌 방지: 여러 프로젝트에서 같은 패키지의 다른 버전을 사용할 경우, 전역 설치는 패키지 충돌 문제를 야기할 수 있습니다. 가상환경은 각 프로젝트가 독립된 패키지 환경을 가지게 하여 이러한 문제를 해결합니다.

  • 시스템 Python 보호: 전역 환경에 패키지를 설치하면 시스템의 Python 환경에 문제가 생길 수 있으므로, 가상환경을 통해 각 프로젝트의 패키지를 격리하는 것이 좋습니다.

3.3 가상환경 사용 방법

  • venv: Python 내장 모듈로 가상환경을 생성할 수 있습니다. python3 -m venv myenv 명령어를 사용하여 가상환경을 만들고, 이를 활성화(source myenv/bin/activate)하여 패키지를 설치합니다.

  • Poetry: Python의 패키지 및 가상환경 관리를 위한 도구로, npm과 유사하게 종속성을 관리하며, 각 프로젝트의 가상환경을 자동으로 설정해 줍니다.

4. 세 가지 환경 관리 방식 비교

측면 JVM (Java Virtual Machine) Node.js (npm, nvm) Python (Virtual Environment)
역할 Java 프로그램의 런타임 환경 제공 패키지 관리 및 버전 관리 프로젝트별 패키지 환경 격리
목적 플랫폼 독립성 제공, 바이트코드 실행 패키지 충돌 방지, Node.js 버전 관리 패키지 충돌 방지, 시스템 Python 보호
환경 격리 운영체제 위에서 Java 프로그램 실행 각 프로젝트의 node_modules 각 프로젝트의 가상환경 (venv, Poetry)
의존성 관리 프로젝트의 lib 폴더에 외부 라이브러리 추가 node_modules 폴더에 패키지 설치 가상환경 내에 패키지 설치
유사점 가상 컴퓨터 제공, 플랫폼 독립성 패키지 격리 (node_modules) 패키지 격리 (가상환경)
차이점 런타임을 위한 가상 컴퓨터 패키지 관리, CLI 도구 전역 설치 패키지 및 Python 인터프리터 격리

결론

Java, Node.js, Python 모두 각자의 방식으로 환경 관리를 하고 있습니다. 각 언어의 생태계와 철학에 맞게 설계된 이 환경 관리 방식들은 모두 독립적인 실행 환경을 제공한다는 공통점이 있지만, 그 목적과 사용 방식에는 차이가 있습니다.

  • Java의 JVM은 운영체제와 무관하게 Java 프로그램을 실행하기 위한 런타임 환경을 제공하여 플랫폼 독립성을 보장합니다.

  • Node.js는 각 프로젝트별 node_modules 폴더를 통해 패키지를 격리하고, 필요시 전역 설치를 통해 CLI 도구를 제공합니다. nvm을 통해 Node.js 버전을 관리할 수도 있습니다.

  • Python은 프로젝트별로 가상환경을 사용하여 각기 다른 패키지 종속성을 관리하고, 시스템 전역 Python 환경을 보호합니다.

이러한 차이를 이해하면 각 언어의 개발 환경을 설정하고 관리하는 데 큰 도움이 됩니다. 각 언어의 특성에 맞는 환경 관리 방식을 잘 활용하여 안정적이고 효율적인 개발 환경을 구축해 보세요.

반응형
728x90
반응형

프로그래밍 언어는 대부분 상표권과 관련이 있더라도 자유롭게 사용할 수 있습니다. 그러나 몇몇 언어는 상표권이 특정 기업이나 단체에 속해 있을 수 있으며, 상업적 사용에 제한을 받을 수 있습니다. 아래는 몇 가지 대표적인 언어들의 상표권 상태와 사용 제한 여부에 대한 간단한 설명입니다.

상표권이 없거나 자유롭게 사용 가능한 언어

C, C++

  • 상표권 소유: 없음.
  • 상표 사용: 상표권이 없으며, 자유롭게 사용 가능.
  • 누구나 자유롭게 사용 가능한 언어.

Python

  • 상표권 소유: Python Software Foundation(PSF)
  • 상표 사용: 상표는 등록되어 있지만, 자유롭게 사용 가능. 상업적 사용에 큰 제약 없음.
  • 사실상 "free"에 가까운 언어.

Rust

  • 상표권 소유: Rust Foundation
  • 상표 사용: 상표는 등록되어 있지만, 커뮤니티가 자유롭게 사용할 수 있음.
  • 자유롭게 사용 가능한 오픈 소스 언어.

Ruby

  • 상표권 소유: 특정 기업이나 단체 없음.
  • 상표 사용: 자유롭게 사용 가능.
  • 상표권에 대한 제약 없이 사용 가능.

Go (Golang)

  • 상표권 소유: Google
  • 상표 사용: Google이 상표를 소유하지만 자유롭게 사용할 수 있음.
  • 상업적 사용에도 제약이 거의 없음.

상표권이 존재하는 언어

Java

  • 상표권 소유: Oracle
  • 상표 사용: 상업적 사용에 제한이 있을 수 있음. Oracle JDK 사용 시 라이선스 비용 발생 가능.
  • 언어 자체는 자유롭게 사용할 수 있지만, 상업적 사용 시 Oracle의 라이선스 정책에 유의해야 함.

JavaScript

  • 상표권 소유: Oracle
  • 상표 사용: 표준 명칭으로 ECMAScript를 사용. 상표권은 있지만 상업적 제한은 사실상 없음.
  • 자유롭게 사용 가능하나, 명칭 사용에 주의 필요.

C#

  • 상표권 소유: Microsoft
  • 상표 사용: 상표는 등록되어 있지만, 언어 사용 자체에 제약 없음. .NET 플랫폼 관련 라이선스에 주의.
  • C# 언어 자체는 자유롭게 사용할 수 있으나, 상업적 제품에서 Microsoft의 기술 사용 시 라이선스 검토 필요.

기타 유명 언어

Swift

  • 상표권 소유: Apple
  • 상표 사용: Apple이 상표를 소유하지만, Swift는 오픈 소스이며 자유롭게 사용 가능.
  • 상업적 제품에서도 자유롭게 사용 가능.

Kotlin

  • 상표권 소유: JetBrains
  • 상표 사용: JetBrains가 상표를 소유하고 있으나, 언어 사용에는 제약 없음.
  • 자유롭게 사용 가능.

결론

대부분의 프로그래밍 언어는 상표권이 있더라도, 언어 자체의 사용에 제약을 받지 않습니다. 그러나 상업적 사용을 고려할 때는 상표권을 소유한 기업의 라이선스 정책을 확인하는 것이 좋습니다. 특히, Java나 C# 같은 언어는 상표권과 라이선스 정책을 잘 살펴야 하며, Go, Python, Rust와 같은 언어는 거의 자유롭게 사용할 수 있습니다.

반응형
728x90
반응형

제가 사용하고 있는 vi 편집기 설정입니다. 편집파일은 ~/.vimrc 입니다.

" --------- 기본 설정 --------- "
set number               " 줄 번호 표시 "
set cursorline           " 현재 커서가 위치한 줄 하이라이트 "
set wrap                 " 긴 줄을 자동으로 화면에 맞게 줄바꿈 "
set encoding=utf-8       " 파일 인코딩을 UTF-8로 설정 "
set fileencoding=utf-8   " 저장 시 파일 인코딩을 UTF-8로 설정 "
set showcmd              " 명령어 입력 시 화면 하단에 입력 내용 표시 "
set ruler                " 상태줄에 현재 커서 위치 표시 "
set hlsearch             " 검색어 하이라이트 "
set incsearch            " 검색어 입력 중 실시간으로 검색 "
set ignorecase           " 검색 시 대소문자 구분하지 않음 "
set smartcase            " 대소문자 혼용 시 대소문자 구분 "
set clipboard=unnamedplus " 시스템 클립보드 사용 "

" --------- 탭 및 들여쓰기 --------- "
set tabstop=4            " 탭을 4칸으로 설정 "
set shiftwidth=4         " 들여쓰기 시 4칸 사용 "
set expandtab            " 탭을 스페이스로 변환 "
set autoindent           " 자동 들여쓰기 "
set smartindent          " 스마트 들여쓰기 "

" --------- 편집 관련 --------- "
set backspace=indent,eol,start " backspace 키로 줄넘김 및 들여쓰기 삭제 허용 "
set wildmenu             " 명령어 자동 완성 시 화면 하단에 옵션 목록 표시 "
set scrolloff=3          " 커서가 화면 위/아래로 이동할 때 3줄의 여백 확보 "
set lazyredraw           " 화면 업데이트를 지연시켜 성능 향상 "

" --------- 외관 --------- "
set background=dark      " 배경을 어두운 색으로 설정 (색상 테마에 따라 다를 수 있음) "
syntax on                " 구문 강조 표시 활성화 "
colorscheme desert       " 기본 색상 테마를 desert로 설정 (다른 테마 사용 가능) "

" --------- 기타 --------- "
set mouse=               " 마우스 사용 설정 (비활성화 시 'set mouse=') "
set wildignore=*.o,*.obj,*.bak,*.exe,*.pyc,*.pyo " 파일 탐색 시 무시할 파일 형식 "
set undofile             " 파일 수정 내역 기록 및 저장 "
반응형
728x90
반응형

1. Electron

Electron웹 기술(HTML, CSS, JavaScript)을 사용하여 크로스 플랫폼 데스크톱 애플리케이션을 개발할 수 있게 해주는 프레임워크입니다. Electron은 ChromiumNode.js를 결합하여, 웹 애플리케이션을 데스크톱 환경에서 네이티브 애플리케이션처럼 실행되게 해줍니다.

주요 기능:

  • 크로스 플랫폼: Windows, macOS, Linux에서 동일한 코드로 애플리케이션을 실행할 수 있습니다.
  • Node.js 통합: Node.js 기능을 활용해 파일 시스템과 네이티브 API를 직접 제어할 수 있습니다.
  • 웹 기술 사용: HTML, CSS, JavaScript로 사용자 인터페이스를 개발하여 웹과 동일한 개발 경험을 제공합니다.

대표적인 Electron 애플리케이션:

  • VSCode
  • Slack
  • Discord

2. Vue 3

Vue 3컴포넌트 기반프론트엔드 프레임워크로, 가볍고 유연한 개발 경험을 제공합니다. Composition API를 통해 상태 관리와 코드 재사용이 더 쉬워졌고, 성능도 향상되었습니다. 특히 Electron의 렌더러 프로세스에서 Vue를 사용하면, 웹 개발 기술로 데스크톱 애플리케이션의 UI를 손쉽게 구축할 수 있습니다.

주요 기능:

  • Composition API: 컴포넌트 로직을 더 모듈화하고 유연하게 작성할 수 있습니다.
  • 반응성: Vue의 반응형 데이터 시스템을 통해 효율적인 UI 상태 관리를 할 수 있습니다.
  • 경량화: Vue 3는 더욱 가벼운 런타임을 제공하여 성능을 향상시킵니다.

3. Vite

Vite는 웹 개발을 위한 빠르고 경량화된 빌드 도구입니다. Vite는 ES 모듈(ESM) 기반으로 개발 서버를 실행하며, 핫 모듈 리플레이스먼트(HMR) 기능을 통해 빠른 피드백을 제공합니다. 또한, ESBuild를 사용하여 매우 빠른 번들링 성능을 자랑합니다.

주요 기능:

  • 빠른 개발 서버: ESM을 기반으로 필요한 모듈만 즉시 로드하여 빠른 개발 환경을 제공합니다.
  • ESBuild 기반 빌드: ESBuild로 빠른 트랜스파일링과 번들링을 수행하여 개발과 빌드 성능을 최적화합니다.
  • 간편한 설정: Vue, React 등 다양한 프레임워크와의 통합이 용이하며, 설정이 매우 간단합니다.

4. Electron + Vue 3 + Vite 조합의 강점

  • 빠른 개발 환경: Vite의 빠른 개발 서버와 HMR 덕분에 Electron 애플리케이션 개발이 더 빠르고 효율적입니다.
  • Vue 3의 컴포넌트 기반 구조: Vue 3의 컴포넌트 시스템을 통해 복잡한 UI를 관리하기 용이합니다.
  • 크로스 플랫폼 지원: Electron을 통해 한 번 작성한 코드로 다양한 운영체제에서 동작하는 애플리케이션을 개발할 수 있습니다.
  • 최적화된 빌드: Vite는 ESBuild와 Rollup을 사용하여 최적화된 빌드 출력을 제공하며, 대규모 애플리케이션에서도 성능을 극대화합니다.

이 조합은 특히 웹 기술을 잘 아는 개발자가 데스크톱 애플리케이션을 개발할 때, 성능과 효율성을 극대화하는 강력한 개발 스택입니다.

반응형
728x90
반응형

서버 관리 시 프로덕션(Production)과 스테이징(Staging) 서버를 명확히 구분하는 것은 매우 중요합니다. 실수로 잘못된 서버에서 명령어를 실행하는 것을 방지하기 위해 프롬프트를 시각적으로 구분하는 방법을 알아보겠습니다.

단계 1: 로컬 머신의 SSH 설정

로컬 머신에서 SSH 접속 시 환경 변수를 전송하도록 설정합니다. ~/.ssh/config 파일을 열고 다음 내용을 추가합니다:

Host production
    HostName <PRODUCTION_IP_ADDRESS>
    User bitnami
    IdentityFile <your-key-file-path>
    SetEnv SSH_ENV=production
    SendEnv SSH_ENV

Host staging
    HostName <STAGING_IP_ADDRESS>
    User bitnami
    IdentityFile <your-key-file-path>
    SetEnv SSH_ENV=staging
    SendEnv SSH_ENV

여기서 <PRODUCTION_IP_ADDRESS><STAGING_IP_ADDRESS>는 각각 프로덕션과 스테이징 서버의 IP 주소로 바꿔야 합니다.

단계 2: 원격 서버의 SSH 설정

원격 서버에서 SSH 데몬이 환경 변수를 수락하도록 설정합니다. 원격 서버의 /etc/ssh/sshd_config 파일을 열고 AcceptEnv 설정을 추가합니다:

AcceptEnv SSH_ENV

설정 파일을 수정한 후 SSH 데몬을 재시작합니다:

sudo systemctl restart sshd

단계 3: 원격 서버의 프롬프트 설정

원격 서버의 ~/.bashrc 파일을 열고 프롬프트를 시각적으로 구분하는 코드를 추가합니다:

# 기존 설정 유지

# Save the original PS1
if [ "$color_prompt" = yes ]; then
    original_ps1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
    original_ps1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi

# Customize PS1 if in production or staging
if [[ "$SSH_ENV" == "production" ]]; then
    export PS1="\[\e[41m\e[97m\] PRODUCTION \[\e[m\] $original_ps1"
elif [[ "$SSH_ENV" == "staging" ]]; then
    export PS1="\[\e[44m\e[97m\] STAGING \[\e[m\] $original_ps1"
else
    PS1="$original_ps1"
fi

unset color_prompt force_color_prompt

# 기존 설정 유지

요약

이제 프로덕션 및 스테이징 서버에 SSH로 접속할 때 프롬프트가 시각적으로 구분됩니다. 프로덕션 서버는 빨간색 배경으로 "PRODUCTION" 텍스트를 표시하고, 스테이징 서버는 파란색 배경으로 "STAGING" 텍스트를 표시합니다. 이를 통해 실수로 잘못된 서버에서 작업하는 것을 방지할 수 있습니다.

이 방법은 다양한 환경 변수와 프롬프트 설정을 활용하여 서버 환경을 명확히 구분하는 데 도움이 됩니다. 서버 관리 시 실수를 줄이고 안전하게 작업할 수 있습니다.

반응형