반응형

 

2025년 산티니 충주 그란폰도 접수가 코앞으로 다가왔네요. 후반기 그란폰도는 충주그란폰도만 참가했으면 하는데 접수령을 넘을 수 있었으면 좋겠습니다.

올해 그란폰도 져지 사이즈 발표도 됐는데 작년에 비해 더 세분화 되었더라고요.

2025년 산티니 충주란폰도 져지 시이즈표 - https://chungjugf.co.kr/

 

작년에 없던 5XL, 6XL가 생겼습니다. 

2024년 산티니 충주그란폰도 져지 사이즈표 - 남자

작년에는 L 사이즈를 신청했었는데 살짝 크다는 생각을 했었고 입었을때 조금 편한 스포츠용 티셔츠를 입은 느낌이였는데요

타이트한걸 좋아하는 분은 많이 아쉬웠을 사이즈였다고 생각되네요.

새로 생긴 사이즈를 제외하면 동일한 스펙이라 M 사이즈를 신청하려고 했는데 오늘 다시 입어보니 살이 더 쪄서 그런지 적당한 느낌이 드는건 왜일런지

참고로 저는 170 / 80에 작고 뚠뚠한 사람입니다. 

신청할때 사이즈 고민이 되실까봐 참고하시라고 겸사겸사 올려보네요.

올해는 살 빼는걸로 

 

728x90
반응형
반응형

1. CA 생성 시 입력하는 패스워드

역할 및 목적
CA(Certificate Authority)를 생성할 때 입력하는 패스워드는 CA의 개인 키를 암호화하는 데 사용됩니다. 예를 들어, elasticsearch-certutil ca 명령어를 통해 CA 인증서를 만들 때, 이 패스워드는 CA의 개인 키(예: http_ca.key)를 안전하게 암호화하여 저장합니다. 이후, CA를 이용해 다른 인증서를 서명할 때도 이 암호가 필요할 수 있습니다.

사용 시점과 영향

  • 사용 시점: 주로 CA 관련 작업, 예를 들어 새로운 인증서를 서명하거나 CA 인증서를 재발급할 때 필요합니다.
  • 실행 후 영향: 이 패스워드는 CA의 개인 키를 보호하는 역할을 하며, 운영 중에는 CA 관련 작업이 발생하지 않는 한 별도의 런타임 영향은 없습니다.

2. Elasticsearch keystore의 xpack.security.http.ssl.keystore.secure_password

역할 및 목적
이 설정은 Elasticsearch가 HTTPS 통신에 사용하는 HTTP keystore(예: http.p12) 파일을 열 때 사용됩니다. keystore 파일에는 HTTP 인증서와 그에 대응하는 개인 키가 포함되어 있으며, 이를 통해 Elasticsearch는 안전한 HTTPS 연결을 설정합니다.

사용 시점과 영향

  • 사용 시점: Elasticsearch가 시작할 때 keystore 파일을 열어 HTTPS 연결을 위한 인증서와 개인 키를 읽어들일 때 이 패스워드가 사용됩니다.
  • 실행 후 영향: 만약 이 패스워드가 올바르지 않다면, Elasticsearch는 keystore를 열 수 없게 되어 HTTPS 연결을 설정하지 못합니다. 그 결과 클라이언트(예: Kibana)와의 보안 통신에 문제가 발생할 수 있습니다.

3. 두 패스워드는 서로 달라도 괜찮은가?

두 패스워드는 각각 완전히 다른 역할을 수행합니다.

  • CA 패스워드: CA의 개인 키를 암호화하여 보호하며, CA 관련 서명 작업에 사용됩니다.
  • Keystore 패스워드: Elasticsearch가 HTTPS 통신에 필요한 인증서와 개인 키가 저장된 keystore 파일을 열 때 사용됩니다.

따라서 보안 정책에 따라 두 패스워드는 반드시 동일할 필요는 없으며, 서로 독립적으로 관리하는 것이 일반적입니다.


결론

보안 설정을 보다 명확하게 구성하기 위해서는 각 패스워드의 역할과 사용 시점을 정확히 이해하는 것이 중요합니다.

  • CA 생성 시 입력하는 패스워드: CA의 개인 키 암호화 및 서명 작업에 사용.
  • xpack.security.http.ssl.keystore.secure_password: Elasticsearch가 HTTPS 통신을 위해 keystore 파일을 열 때 사용.
728x90
반응형
반응형

 

방법은 CA부터 만들고 elasticsearch-certutil http에서 생성한  CA를 선택해서 진행하는 방식과

elasticsearch-certutil http로 바로 시작해서 CA를 만들면서 시작하는 방식이 있는데 공식문서에는 첫번재 방식에 대해서 자세히 설명이 되어 있지만 저는 두번째 방식으로 진행했습니다.

 

우분투 18.04에 elasticsearch와 kibana만 설치하고 진행했습니다.

#우분투에 설치된 경로 기준
sudo /usr/share/elasticesearch/bin/elasticsearch-certutil htt

해당 명령어를 입력하면 인증서를 만들기 위해 옵션 설정 항목들이 나옵니다.

## Elasticsearch HTTP Certificate Utility

# Do you wish to generate a Certificate Signing Request (CSR)?
Generate a CSR? [y/N]n

## Do you have an existing Certificate Authority (CA) key-pair that you wish to use to sign your certificate?
Use an existing CA? [y/N]n

## CA Generation Options
Do you wish to change any of these options? [y/N]n

## CA password
CA password:  [<ENTER> for none] 패스워드입력
Repeat password to confirm: 패스워드입력

## How long should your certificates be valid?
For how long should your certificate be valid? [5y] 2y

## Do you wish to generate one certificate per node?
Generate a certificate per node? [y/N]n

## Which hostnames will be used to connect to your nodes?
localhost

Is this correct [Y/n]y

## Which IP addresses will be used to connect to your nodes?
127.0.0.1

Is this correct [Y/n]y

## Other certificate options
Do you wish to change any of these options? [y/N]n

## What password do you want for your private key(s)?
Provide a password for the "http.p12" file:  [<ENTER> for none] 패스워드입력
Repeat password to confirm: 패스워드입력

## Where should we save the generated files?
What filename should be used for the output zip file? [/usr/share/elasticsearch/elasticsearch-ssl-http.zip] 엔터

마지막 output zip file 에서 파일명 변경없이 엔터 치면 Zip file written to /usr/share/elasticsearch/elasticsearch-ssl-http.zip 메시지와 함께 제안해준 파일이 생성이 됩니다.

sudo unzip /usr/share/elasticsearch/elasticsearch-ssl-http.zip -d /etc/elasticsearch/certs/http

압축파일을 /etc/elasticsearch/certs/http 아래에 풀었는데요 기본적으로 /etc/elasticsearch/certs까지 구성되어 있기 때문에 http 디렉토리를 먼저 만들고 진행하면 됩니다.

Archive:  /usr/share/elasticsearch/elasticsearch-ssl-http.zip
   creating: /etc/elasticsearch/certs/http/elasticsearch/
  inflating: /etc/elasticsearch/certs/http/elasticsearch/README.txt  
  inflating: /etc/elasticsearch/certs/http/elasticsearch/http.p12  
  inflating: /etc/elasticsearch/certs/http/elasticsearch/sample-elasticsearch.yml  
   creating: /etc/elasticsearch/certs/http/ca/
  inflating: /etc/elasticsearch/certs/http/ca/README.txt  
  inflating: /etc/elasticsearch/certs/http/ca/ca.p12  
   creating: /etc/elasticsearch/certs/http/kibana/
  inflating: /etc/elasticsearch/certs/http/kibana/README.txt  
  inflating: /etc/elasticsearch/certs/http/kibana/elasticsearch-ca.pem  
  inflating: /etc/elasticsearch/certs/http/kibana/sample-kibana.yml

압축을 풀면 위와 같이 어떤 파일들이 압축해제 되었는지 보여줍니다. 

파일들에 대해서 요약해보자면 

  • Elasticsearch 관련 파일 (/elasticsearch/ 디렉터리)
    • http.p12: Elasticsearch HTTP 통신에 사용할 인증서와 개인 키.
    • sample-elasticsearch.yml: 해당 인증서를 사용하는 설정 예시.
  • CA 관련 파일 (/ca/ 디렉터리)
    • ca.p12: Elasticsearch HTTP 인증서를 서명한 CA 정보가 담긴 키스토어.
  • Kibana 관련 파일 (/kibana/ 디렉터리)
    • elasticsearch-ca.pem: Kibana가 Elasticsearch의 인증서를 검증할 때 사용하는 CA 인증서.
    • sample-kibana.yml: Kibana의 SSL/TLS 설정 예시 파일.
sudo vi /etc/elasticsearch/elasticsearch.yml

elasticsearch.yml  파일을 열어서 keystore.path 설정 변경을 해줍니다.

xpack.security.http.ssl:
	enabled: true
    keystore.path: certs/http/elasticsearch/http.p12

그리고 Elasticsearch의 보안 설정에 개인 키의 비밀번호를 추가합니다.

sudo /usr/share/elasticsearch/bin/elasticsearch-keystore add xpack.security.http.ssl.keystore.secure_password

기존에 생성되어 있는 키가 있기때문에 덮어씌우기하시면 됩니다.

sudo systemctl restart elasticsearch

elasticsearch를 재시작해하면 elasticsearch와 관련된 설정은 끝이고 kibana 설정을 해보겠습니다.

sudo cp /etc/elasticsearch/certs/http/kibana/elasticsearch-ca.pem /var/lib/kibana/

압축파일에 있던 인증서를 복사합니다.

sudo openssl x509 -in /var/lib/kibana/elasticsearch-ca.pem -noout -fingerprint -sha256

설정파일을 수정할때 ca_trusted_fingerprint값도 바꿔야 하기때문에 미리 출력합니다.

sudo vi /etc/kibana/kibana.yml

kibana.yml파일을 열어서 기존에 있던 인증서 설정값을 새로운 인증서로 변경합니다.

elasticsearch.ssl.certificateAuthorities: [/var/lib/kibana/elasticsearch-ca.pem]
xpack.fleet.outputs:[{......, ca_trusted_figerprint: "sha256 값"
sudo systemctl restart kibana

kibana를 재실행 하면 설정은 끝납니다.

 

 

728x90
반응형
반응형

페플의 메테오 컴팩트 실켓 반팔 티셔츠를 좋아하는데 물량부족으로 구매가 어렵게 되어 대체할 수 있는 티셔츠를 구매해 보았는데요.

구매한 제품은 샤카웨어 맥스 헤비 웨이트 반팔 티셔츠와 자바나스의 익스트림 USA코튼 티셔츠 입니다.

 

샤카웨어는 얇은 비닐에 담겨있는데 자바나스는 조금 더 두께감이 있는 지퍼백에 담겨있는데 이 부분이 맘에 드네요.

가격차이가 있긴 하지만 자바나스도 저렴한 편이라 이란 소소함이 브랜드의 가치를 높여주는 요소 중 하나이지 않을까요.

 

 

사이즈는 둘다 L 사이즈로 구매 보았습니다.

넥라인 늘어남 비교

사진으로는 늘어남의 표현이 한계가 느껴지지만 샤카웨어의 넥이 부드럽게 잘 늘어났습니다. 

저는 개인적으로 쫀쫀한걸 선호하기 때문에 샤카웨어보단 자바나스가 더 맘에 드네요.

 

박음질 비교

공부가 필요한 부분이네요. 기존에는 그리 신경쓰지 않았는데 추천 글이나 영상에 보면 이런 박음질도 중요하게 보더라고요.

두께 비교

손으로 만져봐도 느낄 수 있을만큼 자바나스가 두꺼웠습니다. 

길이비교

길이는 샤카웨어가 더 길었습니다. 입어보면 정말 길었습니다.

가슴단면 비교

스펙에 나와있는 단면 길이는 샤카웨어는 56cm 자바나스는 59.5cm

스펙처럼 자바나스 티셔츠의 폭이 조금 더 큽니다.

자바나스 쇼핑몰에선 체중이 75~80kg 사이일때 세미 오버핏을 원하면 L사이즈를 선택하면 된다고 되어 있는데 딱 그 정도 인거 같았습니다. 적당히 체형 커버 되고 길이도 적당했습니다.

샤카웨어는 가슴단면은 조금 더 작기에 단품으로 입기보단 이너용으로 더 나을거 같은 느낌이였습니다. 키가 작고 체형이 큰 사람에게는 안어울리겠구나란 생각이 들 정도로 사이즈가 언발란스한 느낌이였네요.

저는 쫀쫀하고 두께감 있는걸 선호하기에 자바나스 익스트림 USA코튼 티셔츠가 만족스러웠습니다.

기존에 페플의 메테오 컴팩트 실켓 반팔 티셔츠를 입었는데 인기가 많아서 인지 구매하는데 원하는 사이즈가 없더라고요. 그 티셔츠를 대체하기에 좋은 선택이 되겠다 싶습니다.

 

 

728x90
반응형
반응형

JavaScript에서 forEach는 일반적인 for 루프와 달리 break를 사용할 수 없습니다. 하지만 forEach를 중단해야 할 경우가 종종 발생합니다. 이번 포스팅에서는 forEach에서 반복을 중단하는 방법과 이를 대체할 수 있는 코드 패턴을 소개합니다.


🚀 forEach에서 break가 안 되는 이유

JavaScript의 forEach()는 내부적으로 콜백 함수를 실행하는 방식이기 때문에 루프를 중단할 방법이 없습니다. return을 사용해도 현재 반복만 종료할 뿐, 전체 forEach 실행은 계속됩니다.

잘못된 예제 (break 사용 불가)

const numbers = [1, 2, 3, 4, 5];

numbers.forEach((num) => {
  if (num === 3) {
    console.log('루프 중단!');
    break; // ❌ SyntaxError: Illegal break statement
  }
  console.log(num);
});

위 코드에서는 break를 사용할 수 없기 때문에 SyntaxError가 발생합니다.


✅ forEach를 중단하는 대체 방법

1️⃣ some()을 사용한 중단

some() 메서드는 특정 조건이 true가 되면 자동으로 반복을 중단합니다.

const numbers = [1, 2, 3, 4, 5];

numbers.some((num) => {
  if (num === 3) {
    console.log('루프 중단!');
    return true; // `true`를 반환하면 루프 중단
  }
  console.log(num);
  return false;
});

💡 결과

1
2
루프 중단!

some()은 특정 조건을 만족하면 루프를 중단하기 때문에 forEach 대체용으로 적합합니다.


2️⃣ every()를 사용한 중단

every()도 some()과 비슷하게 동작하지만, false를 반환하면 루프가 중단됩니다.

const numbers = [1, 2, 3, 4, 5];

numbers.every((num) => {
  if (num === 3) {
    console.log('루프 중단!');
    return false; // `false`를 반환하면 루프 중단
  }
  console.log(num);
  return true;
});

💡 결과

1
2
루프 중단!

every()는 false를 반환하면 루프를 중단하는 특징이 있습니다.


3️⃣ for...of 루프를 사용한 중단

for...of 루프는 break가 정상적으로 작동하므로 forEach를 대체할 수 있습니다.

const numbers = [1, 2, 3, 4, 5];

for (const num of numbers) {
  if (num === 3) {
    console.log('루프 중단!');
    break; // ✅ 정상 작동
  }
  console.log(num);
}

💡 결과

1
2
루프 중단!

for...of는 가독성이 좋고 break를 사용할 수 있어 forEach의 좋은 대체 방법입니다.


4️⃣ try-catch를 활용한 예외 발생 (비추천)

일부 개발자는 try-catch를 사용해 throw로 루프를 중단하는 방법을 사용하지만, 이는 성능상 좋지 않으며 예외 처리를 남용하는 방식이므로 권장하지 않습니다.

const numbers = [1, 2, 3, 4, 5];

try {
  numbers.forEach((num) => {
    if (num === 3) {
      console.log('루프 중단!');
      throw new Error('STOP_LOOP');
    }
    console.log(num);
  });
} catch (error) {
  if (error.message !== 'STOP_LOOP') throw error;
}

💡 결과

1
2
루프 중단!

이 방법은 강제적으로 forEach를 중단할 수 있지만, 예외를 활용하는 방식은 성능 저하 및 디버깅 문제를 초래할 수 있어 비추천합니다.


🎯 결론: 어떤 방법을 선택해야 할까?

방법중단 방식추천 상황

some() 사용 true 반환 시 중단 간결한 코드가 필요할 때
every() 사용 false 반환 시 중단 some()과 유사하나, 모든 요소 확인이 필요할 때
for...of 사용 break 사용 가능 가독성이 중요한 경우
try-catch 사용 throw로 강제 종료 특수한 상황에서만 사용 (비추천)

💡 가장 추천하는 방법

  • some() 또는 for...of를 활용하면 가독성이 높고 성능이 좋습니다.
  • forEach를 꼭 사용해야 하는 경우라면, some()으로 대체하는 것이 좋습니다.

🔥 최종 예제

가장 효율적인 방식인 some()과 for...of를 비교해 보겠습니다.

✅ some()을 사용한 중단:

const numbers = [1, 2, 3, 4, 5];

numbers.some((num) => {
  if (num === 3) {
    console.log('루프 중단!');
    return true;
  }
  console.log(num);
  return false;
});

 

✅ for...of를 사용한 중단:

for (const num of [1, 2, 3, 4, 5]) {
  if (num === 3) {
    console.log('루프 중단!');
    break;
  }
  console.log(num);
}

둘 다 같은 결과를 출력하지만, some()은 함수형 프로그래밍 스타일을 유지하고, for...of는 직관적이고 이해하기 쉽습니다.


✨ 마무리

  • forEach는 break를 지원하지 않음.
  • 대체 방법으로 some(), every(), for...of을 사용할 수 있음.
  • 가장 추천하는 방법은 some() (간결함) 또는 for...of (가독성).
728x90
반응형
반응형

Anaconda 설치 후 기본적으로 base 환경이 자동으로 활성화되죠. 하지만 일부 사용자들은 필요할 때만 Anaconda를 활성화하고 싶어 해요. 이번 글에서는 Anaconda의 base 환경 자동 활성화를 비활성화하고, 수동으로 관리하는 방법을 단계별로 알려드릴게요.


1️⃣ base 환경 자동 활성화란?

Anaconda를 설치하면 터미널을 열 때마다 기본적으로 base 환경이 활성화됩니다. 이는 터미널 시작 시 ~/.bashrc나 ~/.zshrc 파일에 추가된 초기화 스크립트 때문이에요.

이 기본 설정은 Anaconda를 자주 사용하는 경우 편리할 수 있지만, 다른 환경에서 작업할 때는 불편함을 줄 수 있어요.


2️⃣ base 환경 자동 활성화 비활성화 방법

2.1 conda 명령으로 비활성화하기

  • 터미널을 열고 다음 명령어를 입력하세요.
conda config --set auto_activate_base false

 

  • 이 명령은 ~/.condarc 파일에 설정을 추가하여 base 환경이 자동으로 활성화되지 않도록 해줍니다.
  • 설정이 적용되었는지 확인하려면:
conda config --show
  • auto_activate_base: false 항목이 포함되어 있어야 해요.

2.2 환경 변수 수동 수정하기

자동 활성화 설정을 수동으로 수정하려면 ~/.bashrc, ~/.zshrc, 또는 ~/.zprofile 파일을 직접 편집해야 해요.

1. 파일 열기

  • Zsh 사용자:
nano ~/.zshrc
  • Bash 사용자:
nano ~/.bashrc

 

2. 초기화 스크립트 주석 처리
아래와 같은 초기화 스크립트를 찾아 주석 처리하거나 삭제하세요.

# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/path/to/anaconda3/bin/conda' 'shell.zsh' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; then
    eval "$__conda_setup"
else
    if [ -f "/path/to/anaconda3/etc/profile.d/conda.sh" ]; then
        . "/path/to/anaconda3/etc/profile.d/conda.sh"
    else
        export PATH="/path/to/anaconda3/bin:$PATH"
    fi
fi
unset __conda_setup
# <<< conda initialize <<<

 

3. 수정 내용 저장

  • 주석 처리하거나 삭제한 후, 저장하고 나옵니다.

4. 파일 재적용
수정한 파일을 적용하려면 다음 명령어를 입력하세요.

  • Zsh 사용자:
     
source ~/.zshrc
  • Bash 사용자:
source ~/.bashrc

 


3️⃣ 수동으로 base 환경 활성화 및 비활성화

1. base 환경 활성화

  • 필요할 때만 base 환경을 활성화하려면:
conda activate base

2. base 환경 비활성화

  • 작업을 마치고 base 환경을 종료하려면:
conda deactivate

4️⃣ 설정 확인 및 테스트

1. 설정 확인

conda config --show 명령을 입력해 설정을 확인하세요.

  • auto_activate_base: false 항목이 표시되면 성공적으로 설정된 것입니다.

2. 터미널 재시작

터미널을 닫았다가 다시 열어 base 환경이 자동으로 활성화되지 않는지 확인하세요.


5️⃣ 추가 팁: Anaconda를 더 깔끔하게 관리하는 방법

  • 필요한 환경만 관리
    • 여러 가상 환경을 생성하여 프로젝트별로 관리하세요.
conda create -n my_env python=3.9
conda activate my_env
  • 가상 환경 삭제
    • 사용하지 않는 가상 환경은 삭제하여 시스템을 깔끔히 유지합니다.
conda remove -n my_env --all

 

 

결론

Anaconda의 base 환경 자동 활성화를 비활성화하면 터미널이 더 간결해지고, 다른 작업 환경과의 충돌을 방지할 수 있어요. 필요할 때만 수동으로 활성화하여 관리 효율성을 높일 수 있지 않을까요?

 

728x90
반응형
반응형

 

**주식매수선택권(Stock Option)**은 기업이 임직원이나 기타 대상자에게 회사의 주식을 일정 가격에 매수할 수 있는 권리를 부여하는 제도입니다.
주로 임직원의 동기부여와 회사의 장기 성과를 독려하기 위해 사용되며, 주식 가격이 상승하면 큰 이익을 얻을 수 있는 매력적인 보상 수단이에요.

이번 글에서는 주식매수선택권 행사와 관련된 정의, 절차, 조건, 장단점, 세금, 주의점을 상세히 정리해보겠습니다.


1️⃣ 주식매수선택권의 정의

**주식매수선택권(Stock Option)**은 회사가 사전에 정한 가격(행사가격, Exercise Price)으로 일정 수량의 주식을 매수할 수 있는 권리를 부여하는 제도입니다.
주식의 시장 가격이 행사가격보다 높을 경우, 행사자는 이익을 얻을 수 있어요.


2️⃣ 주식매수선택권의 주요 개념

1. 행사가격 (Exercise Price)

  • 선택권을 행사할 때 지불해야 하는 주식 1주의 가격입니다.
  • 일반적으로 선택권이 부여된 시점의 시장 가격으로 설정됩니다.

2. 행사 기간 (Exercise Period)

  • 주식매수선택권을 행사할 수 있는 기간으로, 보통 부여일로부터 몇 년 후부터 시작됩니다.

3. 취득 조건 (Vesting)

  • 선택권이 발효되는 조건으로, 일정 기간 근무나 특정 성과 달성 등이 포함됩니다.

4. 행사 이익 (Exercise Profit)

  • 행사자의 실질적인 이익으로, 시장 가격과 행사가격 간의 차액을 의미합니다.
    • 행사 이익 = (시장 가격 - 행사가격) × 행사 주식 수량

5. 소멸 시효

  • 선택권의 행사 기간이 종료되면 해당 권리는 소멸합니다.

3️⃣ 주식매수선택권 행사 절차

1. 선택권 부여

  • 회사는 특정 임직원 또는 대상자에게 주식매수선택권을 부여합니다.
  • 부여 시 행사가격, 행사 기간, 취득 조건 등이 명시됩니다.

2. 조건 충족

  • 행사자가 회사에서 일정 기간 근무하거나, 특정 성과를 달성하면 선택권이 발효됩니다.

3. 권리 행사

  • 행사자가 선택권을 행사하여 회사에 행사가격을 지급하고, 주식을 매수합니다.

4. 주식 매도 또는 보유

  • 행사자는 매수한 주식을 시장에서 매도하거나, 장기적으로 보유할 수 있습니다.

4️⃣ 주식매수선택권의 장단점

장점

  1. 임직원의 동기부여
    • 주식 가격 상승이 임직원의 이익으로 연결되기 때문에 성과를 높이는 동기가 됩니다.
  2. 기업 비용 절감
    • 현금 보상 대신 주식매수선택권을 부여함으로써 현금 유출을 줄일 수 있어요.
  3. 장기적인 성과 독려
    • 임직원이 회사와 장기적으로 함께 성장하도록 유도할 수 있습니다.
  4. 세제 혜택
    • 특정 조건을 충족할 경우 세금이 경감될 수 있습니다.

단점

  1. 시장 변동성
    • 주식 가격이 행사가격보다 낮아질 경우 선택권의 가치가 없어질 수 있습니다.
  2. 희석 효과
    • 새로운 주식이 발행되면 기존 주주의 지분이 희석될 수 있습니다.
  3. 복잡한 세금 처리
    • 행사 이익에 대한 세금 처리가 복잡할 수 있어요.

5️⃣ 주식매수선택권과 세금

1. 행사 시 세금

  • 행사 이익은 근로소득으로 간주되어 소득세가 부과됩니다.
    • 근로소득세 = 행사 이익 × 세율

2. 주식 매도 시 세금

  • 주식을 매도하면 자본이득에 대해 양도소득세가 부과됩니다.
    • 양도소득세 = (매도 가격 - 취득 가격) × 세율

3. 세제 혜택

  • 벤처기업의 경우, 주식매수선택권 행사 이익에 대해 일정 금액까지 소득세가 면제될 수 있습니다.
  • 각국의 세제 정책에 따라 혜택이 달라지므로 세무 전문가의 도움을 받는 것이 좋아요.

6️⃣ 주식매수선택권의 주의점

  1. 주식 가격 하락 위험
    • 선택권 행사 이후 주식 가격이 하락하면 손실을 입을 수 있어요.
  2. 행사 기간 제한
    • 선택권을 행사하지 않고 기간이 지나면 권리가 소멸됩니다.
  3. 희석 가능성
    • 주식 발행량 증가로 인해 기존 주주의 지분 가치가 희석될 수 있습니다.
  4. 정확한 세금 계산 필요
    • 행사 이익과 매도 이익에 따른 세금을 정확히 계산해야 합니다.

7️⃣ 주식매수선택권의 실제 사례

1. 스타트업의 스톡옵션 부여

  • 많은 스타트업은 현금 보상이 어려운 대신 임직원들에게 스톡옵션을 부여합니다.
  • 예: 초기 직원들이 낮은 연봉을 받는 대신 스톡옵션으로 큰 이익을 얻은 사례가 많습니다.

2. IT 기업의 장기 보상 정책

  • 구글, 애플 같은 IT 대기업은 스톡옵션을 통해 우수 인재를 유치하고 장기적으로 함께 성장하고 있어요.

결론: 주식매수선택권은 장기적 성공의 열쇠!

주식매수선택권은 기업과 임직원이 함께 성장할 수 있는 강력한 도구입니다.
행사가격, 시장 가격, 세금 등을 꼼꼼히 고려해 현명하게 활용한다면, 경제적 보상뿐만 아니라 기업의 성과에도 기여할 수 있습니다.

728x90
반응형
반응형

QLAlchemy는 Python에서 데이터베이스와 상호작용하기 위한 강력한 ORM(Object Relational Mapping) 및 Core API를 제공합니다. 특히, 대량 데이터를 삽입할 때는 성능과 효율성이 중요한데, 이를 위한 대표적인 두 가지 방법이 있습니다:

  1. sqlalchemy.orm.bulk_insert_mappings
  2. connection.execute(target_table.insert(), insert_data)

이번 글에서는 이 두 방법의 차이점과 성능을 비교하고, 각각의 사용 사례와 최적의 활용 방안을 알아보겠습니다.


bulk_insert_mappings와 connection.execute 개요

특징 bulk_insert_mappings connection.execute(target_table.insert())
레벨 ORM (객체 관계 매핑) Core (저수준 SQL 실행)
사용 방법 ORM 매핑된 클래스와 데이터 사용 Core 테이블 객체와 데이터 사용
속도 상대적으로 빠름 (ORM 세션에서 최적화된 방식으로 일괄 삽입) 상대적으로 느림 (하나씩 매핑하여 실행)
트랜잭션 관리 ORM 세션이 관리 engine.begin()에서 수동 관리 가능
데이터 확인 및 검증 ORM 매핑된 객체의 검증 및 추가 작업 가능 데이터는 그대로 전달되며 검증은 직접 처리
메모리 효율성 대규모 데이터 처리 시 상대적으로 효율적 데이터 크기에 따라 메모리 소비 증가

1. bulk_insert_mappings

bulk_insert_mappings는 SQLAlchemy ORM에서 제공하는 대량 데이터 삽입을 위한 고성능 메서드입니다. Python 딕셔너리와 ORM 매핑된 클래스를 사용해 데이터를 삽입하며, ORM 유효성 검사를 지원합니다.

장점

  • 한 번의 호출로 다수의 데이터를 삽입.
  • ORM 기반의 데이터 유효성 검증 가능.
  • 대량 데이터 삽입 시 빠른 속도와 메모리 효율성을 제공.
  • ORM 메타데이터 활용 가능.

단점

  • ORM 매핑된 클래스가 필요하여 간단한 작업에는 설정이 과도할 수 있음.
  • 데이터베이스의 하위 레벨에서 작업이 필요한 경우 유연성이 떨어짐.

사용법

from sqlalchemy.orm import Session

# 데이터 예시
data_to_insert = [
    {"column1": "value1", "column2": "value2"},
    {"column1": "value3", "column2": "value4"}
]

# ORM 세션 생성
with Session(engine) as session:
    session.bulk_insert_mappings(MyORMClass, data_to_insert)
    session.commit()

 


2. connection.execute

connection.execute는 SQLAlchemy Core API를 사용하여 SQL문을 직접 실행하는 방식입니다. 이 방법은 ORM을 사용하지 않고, 테이블 객체와 데이터를 직접 전달하여 작업을 수행합니다.

장점

  • ORM에 의존하지 않으므로 간단한 데이터 삽입 작업에 적합.
  • Core API를 사용해 SQL문을 세밀히 제어 가능.
  • ORM 매핑이 필요 없는 환경에서도 사용 가능.

단점

  • 데이터 유효성 검사를 제공하지 않음.
  • 대량 데이터 처리 시 성능이 떨어질 수 있음.
  • 트랜잭션 관리를 명시적으로 처리해야 함.

사용법

from sqlalchemy import insert

# 데이터 예시
insert_data = [
    {"column1": "value1", "column2": "value2"},
    {"column1": "value3", "column2": "value4"}
]

# 트랜잭션 실행
with engine.begin() as connection:
    connection.execute(target_table.insert(), insert_data)

3. 성능 비교

 

벤치마크 테스트

  • 데이터 삽입량: 10만 건 기준.
  • 테스트 환경: PostgreSQL 13, SQLAlchemy 최신 버전.
방법 소요 시간 설명
bulk_insert_mappings 약 1~2초 소요 내부적으로 최적화된 일괄 삽입 방식.
connection.execute 약 5~7초 소요 데이터 크기에 따라 성능 저하 발생.

대량 데이터 처리 성능

  • bulk_insert_mappings: 대량 데이터 처리에 최적화되어 있어 삽입 속도가 빠르고, 메모리 효율적입니다.
  • connection.execute: 데이터가 적은 경우 간단한 삽입 작업에 적합하지만, 대량 데이터에서는 성능이 저하될 수 있습니다.

4. 사용 사례 비교

bulk_insert_mappings 사용에 적합한 경우

  • ORM을 사용하는 프로젝트에서 대량 데이터 삽입이 필요한 경우.
  • 데이터 유효성 검사를 ORM 레벨에서 수행하고자 할 때.
  • 다수의 ORM 매핑된 객체를 한 번에 삽입하고자 할 때.

connection.execute 사용에 적합한 경우

  • 간단한 삽입 작업에 적합.
  • 데이터 크기가 작고, ORM 설정이 불필요한 환경.
  • Core API로 SQL 제어가 필요한 경우.

5. 효율적인 대량 데이터 삽입 전략

데이터를 청크 단위로 처리

대량 데이터 처리 시, 데이터베이스의 제한이나 메모리 부족 문제를 방지하기 위해 데이터를 청크 단위로 삽입합니다.

코드 예시

CHUNK_SIZE = 1000  # 한 번에 처리할 데이터 크기
for i in range(0, len(data_to_insert), CHUNK_SIZE):
    chunk = data_to_insert[i:i + CHUNK_SIZE]
    with engine.begin() as connection:
        connection.execute(target_table.insert(), chunk)

결론

기준 bulk_insert_mappings connection.execute
대량 데이터 처리 효율적 느림 (데이터 크기에 따라 성능 저하)
데이터 유효성 ORM 유효성 검사 제공 직접 검증 필요
유연성 ORM 매핑된 클래스 필요 SQL 제어 가능
사용 사례 대량 데이터 삽입, ORM 프로젝트에 적합 간단한 삽입, Core SQL 작업에 적합
  • **bulk_insert_mappings**는 ORM을 사용하는 대규모 프로젝트에서 대량 데이터를 삽입할 때 가장 적합한 방법입니다.
  • **connection.execute**는 단순하고 유연한 SQL 삽입 작업에 적합하며, 소규모 데이터 처리에 효율적입니다.
 
728x90
반응형

+ Recent posts