728x90

코드 리뷰 하기 좋은 Pull Request(PR) 만들기

좋은 Pull Request(PR)는 코드 기반 협업 프로세스를 개선하는 데 중요한 요소입니다.
Pull Request 템플릿을 활용하여 리뷰어(Reviewer)가 코드의 변경 사항을 명화하게 이해하고, 주의깊게 검토해야 할 부분들을 표시하여 코드의 안정성을 높이고, 원활한 커뮤니케이션하는데 도움이 될 수 있습니다.

  1. 목적이 명확합니다: 좋은 PR은 하나의 구체적인 목적을 가지고 있어야 합니다. 이는 버그 수정, 새 기능 추가, 리팩토링, 성능 향상 등 일 수 있습니다.
  2. 변경 범위가 제한적 입니다: PR은 가능한 한 작고 관리가능한 범위로 제한되어야 합니다. 이는 리뷰어가 더 쉽게 이해하고 더 빨리 리뷰를 완료할 수 있게 합니다.
  3. 잘 문서화되어 있습니다: PR에는 충분한 설명이 포함되어야 하며, 필요한 모든 문맥 정보와 변경된 이유를 제공해야 합니다. 이는 리뷰어가 변경의 의도와 영향을 이해하는 데 도움이 됩니다.
  4. 품질이 유지됩니다: PR은 코드의 품질을 유지하거나 개선해야 합니다. 이는 테스트 케이스의 추가, 기존 테스트의 통과, 코딩 표준의 준수 등을 포함할 수 있습니다.
  5. 커뮤니케이션이 원활합니다: PR의 작성자는 리뷰 과정에서 발생하는 피드백에 적극적으로 응답하고, 필요한 수정을 신속하게 처리해야 합니다.
  6. 리뷰가 용이합니다: 좋은 PR은 리뷰하기 쉽게 구성되어 있어야 합니다. 이는 코드의 변경 사항이 명확하고, 리뷰어가 주의 깊게 검토해야 할 부분이 잘 표시되어 있는 경우입니다.

이러한 특성을 갖춘 PR은 코드 리뷰 프로세스를 개선하고, 팀 내의 협업을 촉진하며 소프트웨어의 전반적인 품질을 향상시키는 데 중요한 역할을 합니다.

Pull Request Template 만들기

  • 템플릿은 프로젝트와 리포지토리 구조에 따라 여러 유형으로 만들 수 있습니다.
  • 템플릿은 다음 위치 중 한 곳에 넣으면 인식합니다.
    • 루트 디렉토리 : pull_request_template.md
    • docs 디렉토리 : docs/pull_request_template.md
    • .github 디렉토리 : .github/pull_request_template.md

예) 템플릿 형식

# Pull Request (PR)
PR 유형을 선택합니다.
- [ ] 새로운 기능 추가
- [ ] 버그 수정
- [ ] UI 디자인 변경
- [ ] 코드에 영향을 주지 않는 변경사항(오타 수정, 탭 사이즈 변경, 변수명 변경)
- [ ] 코드 리팩토링
- [ ] 주석 추가 및 수정
- [ ] 문서 수정
- [ ] 테스트 추가, 테스트 리팩토링
- [ ] 빌드 부분 혹은 패키지 매니저 수정
- [ ] 파일 혹은 폴더명 수정
- [ ] 파일 혹은 폴더 삭제

## 변경 사항
- 간단하게 이 PR에서 진행한 주요 작업을 요약하고,
- 변경된 주요 기능 및 수정 사항에 대한 자세한 설명을 적으세요.

## 관련 이슈 또는 문서
- 이 PR과 관련된 이슈, JIRA 티켓 및 참고 문서가 있다면 링크를 추가하세요.

## 특별히 봐줬으면 하는 부분
- 리뷰어가 집중해서 봐야 할 코드 섹션 또는 로직을 지정하세요.

## 테스트 가이드
- 이 변경 사항을 어떻게 테스트했는지 설명하세요.
- 자동화된 테스트를 추가했다면, 어떤 테스트 케이스를 추가했는지 설명하세요.

## 스크린샷 (UI 변경 사항이 있는 경우)
- UI가 변경되었다면, 변경된 UI의 스크린샷을 첨부하세요.

## 기타
- 이 PR을 병합하는데 주의해야 할 사항이 있다면 적으세요.

## 체크리스트 (PR시 필수 체크해야 할 사항을 기입하세요)
- [ ] 변경 사항과 관련 문서를 모두 업데이트 했습니다.
- [ ] 모든 종속 변경사항이 병합되었습니다.
- [ ] 코드 리뷰어를 지정했습니다.

Reference

728x90
반응형

'GitHub' 카테고리의 다른 글

GitHub 멀티 Account 설정하기  (0) 2022.07.21
728x90

Terraform Backend

Terraform Backend는 Terraform State 파일의 저장하는 위치를 정의합니다.
State는 Terraform에서 프로비저닝 결과를 추적하고 이후 프로비저닝 수행 시 비교하는 과정에 사용되므로, Terraform 사용 빈도와 대상의 규모가 커질수록 계획적인 관리가 요구 됩니다.

Backend 구성 목적

State Backend는 관리 / 공유 / 격리의 목적으로 사용됩니다

목적 내용
관리 State는 local 구성이 기본으로 현재 State인 terraform.tfstate와 이전 상태인 terraform.tfstate.backup만이 보관되므로 지속적인 State 백업을 위해서 Remote 저장소 필요 Remote 저장소에 state 파일을 관리하는 경우, 여러 사용자가 동시에 state 파일을 변경하는 경우 문제가 발생할 수 있으므로 동시에 같은 state 파일을 접근하는 것을 막아 의도치 않는 변경을 방지
공유 다수의 작업자가 동일한 State로 접근하여 프로비저닝하기 위한 공유 스토리지 필요
격리 State 파일에 저장될 수 있는 민감 데이터에 접근 권한을 환경별로 접근권한을 격리

사용 가능한 Backend

기본적으로 Terraform은 local상태를 디스크에 local 파일로 저장하는 Backend를 사용합니다.
AWS 리소스를 프로비저닝하는 경우 S3, Google Cloud의 경우 GCS가 적합 할 수 있습니다. HashiCorp는 Terraform Cloud를 통해 State 백엔드 기능을 제공합니다.

(기타)

  • Consul
  • Postgres Database (pg)

Terraform Workspace

Terraform Workspace는 State를 관리하는 단위입니다. 기본적으로 default Workspace가 생성됩니다.
terraform plan 을 새로운 Workspace에서 수행하면, Terraform은 다른 Workspace에 있는 리소스에 접근하지 않습니다.
기존에 있던 리소스를 관리하려면 Workspace를 전환한 후에 변경해야 합니다.

Terraform Backend 구현(AWS)

Terraform을 사용하여 인프라스트럭처를 관리할 때, Terraform의 상태 파일(backend)을 보관하는 AWS 계정과 실제 리소스가 프로비저닝되는 AWS 계정을 분리하는 것은 일반적인 보안 및 관리 방법입니다.
이러한 접근 방식은 Terraform 상태 파일의 보안을 강화하고, 팀 간의 접근 권한을 분리 하며, 여러 프로젝트 또는 환경 간의 충돌을 방지하는 데 도움이 됩니다.

AWS 인프라 관리 시, Multi-Account 관리를 통해 독립적인 환경을 구현하고 보안 및 관리 용이성을 가질 수 있도록 권고되고 있습니다.
Terraform Backend 환경은 공유 자원을 관리하는 Shared AWS Account에 관리 되며, 각 환경 및 Workspace별로 state를 저장 관리합니다.

+------------------+----------------+
| AWS Account Name | AWS Account ID |
+------------------+----------------+
| Shared           |  111111111111  |
| Dev              |  222222222222  |
| Qa               |  333333333333  |
| Prod             |  444444444444  |
| Test             |  555555555555  |
+------------------+----------------+

S3, DynamoDB 생성

상태를 Amazon S3의 버킷에 저장하고, Dynamo DB를 활용하여 Apply 시 State Locking을 통해 State의 일관성을 확보합니다.
실수로 삭제하거나 사람의 실수가 발생한 경우 상태를 복구할 수 있도록 버킷(Bucket)의 버전 관리를 활성화 합니다.

# Create S3 Bucket for Terraform State
resource "aws_s3_bucket" "terraform_state" {

    bucket = "tf-state-bucket" 


    tags = {
        Name        = "tf-state-bucket"
        Environment = ""    # Global, Shared, Dev, QA, Prod??
    }
}

# Provides a resource for controlling versioning on an S3 bucket
resource "aws_s3_bucket_versioning" "this" {
    bucket = aws_s3_bucket.terraform_state.id
    versioning_configuration {
      status = "Enabled"
    }
}


# Provides a S3 bucket server-side encryption.
resource "aws_s3_bucket_server_side_encryption_configuration" "this" {
  bucket = aws_s3_bucket.terraform_state.id

  rule {
    apply_server_side_encryption_by_default {
      sse_algorithm     = "AES256"      # (SSE-S3)
    }
  }
}


# Provision DynamoDB Table for state locking
resource "aws_dynamodb_table" "this" {
    name = "terraform-state-lock"
    hash_key = "LockID"
    billing_mode = "PAY_PER_REQUEST"

    attribute {
      name = "LockID"
      type = "S"
    }
}

State Configuration

State는 <workspace_key_prefix>/<workspace_name>/<key> 형식으로 저장됩니다.
Terraform Backend 환경은 공유 자원을 관리하는 shared-layer 에 관리되며, 각 환경 및 Workspace별로 state를 저장 관리합니다.

Terraform Backend Configuration S3 Backend Configuration

terraform{
    backend "s3" {
            bucket               = {S3 Bucket Name}                    # S3 Bucket Name
            key                  = "terraform.tfstate"                 # Path to tfstate in S3 Bucket (workspace/terraform.tfstate)
            region               = "ap-northeast-2"                    # Region Name
            dynamodb_table       = {DynamoDB Table Name}               # DynamoDB Table for state locking
            encrypt              = true                                # Enable Encyrtion state file
            workspace_key_prefix = {layer 이름}                         # default(env:)
            profile              = {backend-account-profile}           # backend가 위치한 AWS Profile
        }
}

# Configure the AWS Provider
provider "aws" {
    region = "ap-northeast-2"
    profile = {resource-account-profile}                               # 환경(Dev/Qa/Prod/Test)의 AWS Account Profile
}

Backend를 변경하고, terraform init 으로 초기화합니다.

yes 를 입력하면 local의 state가 지워지고, S3 로 Backend가 변경 되었음을 확인 할 수 있습니다.

728x90
반응형
728x90

Streamlit App Dockerize

Streamlit App은 다양한 클라우드 플랫폼(AWS, GCP, Google 등)에 배포가 가능하며, 앱을 컨테이너화 하여 여러 클라우드 플랫폼에 배포할 수 있다.

Prerequisites

실행할 App을 다운로드 합니다.
소스는 Streamlit에서 제공하는 샘플 Repository를 활용합니다.

git clone https://github.com/streamlit/streamlit-example.git .

Dockerfile 만들기

# Base 이미지
FROM python:3.12-slim

# 2. 작업 디렉토리를 /app으로 설정
WORKDIR /app

# 3. 현재 디렉토리의 requirements.txt 파일을 컨테이너의 /app으로 복사
COPY requirements.txt /app/

# 4. requirements.txt에 명시된 패키지 설치
RUN pip3 install -r requirements.txt

# 5. 실행할 streamlit_app.py를 컨테이너 /app으로 복사
COPY streamlit_app.py /app/

# 6. 컨테이너가 수신할 포트 오픈
EXPOSE 8501

# 7. 컨테이너 헬스 체크
HEALTHCHECK CMD curl --fail http://localhost:8501/_stcore/health

#8. 실행될 컨테이너 구성
ENTRYPOINT [ "streamlit", "run", "streamlit_app.py", "--server.port=8501", "--server.address=0.0.0.0" ]

Streamlit 버전 1.10.0 이상에서는 Streamlit 앱을 Linux 배포판의 루트 디렉터리에서 실행할 수 없습니다. 따라서 WORKDIR은 루트가 아닌 별도 디렉토리를지정해야 합니다. (예. /app)
(참고) github Issue:5239

Docker image 빌드

생성한 Dockerfilestreamlit 이미지 이름으로 빌드합니다.

docker build -t streamlit .

docker images 로 생성된 이미지 를 확인합니다.

REPOSITORY  TAG       IMAGE ID       CREATED         SIZE
streamlit   latest    bb9ac485406e   2 minutes ago   634MB

Docker 컨테이너 실행

컨테이너의 포트 8501을 서버의 8501 포트에 게시합니다.

docker run -p 8501:8501 streamlit

출력된 URL로 접속합니다.

Collecting usage statistics. To deactivate, set browser.gatherUsageStats to False.

  You can now view your Streamlit app in your browser.

  URL: http://0.0.0.0:8501

(결과)


Reference

728x90
반응형
728x90

Streamlit

Streamlit은 데이터 애플리케이션을 빠르고 쉽게 만들 수 있도록 설계된 파이썬 기반의 오픈 소스 라이브러리입니다. 이 도구는 데이터 시각화와 머신 러닝 모델의 프로토타이핑 및 배포를 단순화하여 사용자가 복잡한 데이터 작업을 쉽게 수행할 수 있게 합니다.

Streamlit의 특징

  1. 코드 중심의 접근 방식: Streamlit 애플리케이션은 순수 파이썬 코드로 작성되므로 별도의 웹 프론트엔드 기술 없이도 데이터 앱을 만들 수 있습니다.
  2. 간편한 사용법: 몇 줄의 코드만으로도 인터랙티브한 요소(슬라이더, 버튼, 차트 등)를 추가할 수 있으며, 앱의 업데이트와 실행이 매우 빠릅니다.
  3. 빠른 프로토타이핑: 데이터 과학 프로젝트의 초기 아이디어를 빠르게 시각화하고 공유할 수 있어 프로토타이핑과 반복 개발 과정이 용이합니다.
  4. 확장성: Streamlit 앱은 컨테이너화하여 쉽게 배포할 수 있고, 다양한 데이터 소스와 라이브러리를 지원합니다.

장점

  1. 빠른 개발 속도: 복잡한 웹 앱을 빠르게 개발할 수 있으며, 데이터 과학자가 웹 개발에 대한 깊은 지식 없이도 사용할 수 있습니다.
  2. 쉬운 배포: Streamlit Sharing을 통해 GitHub에서 직접 앱을 호스팅하고 공유할 수 있습니다.
  3. 강력한 커뮤니티 지원: 오픈 소스 프로젝트로서 활발한 커뮤니티 지원과 지속적인 업데이트가 이루어집니다.
  4. 인터랙티비티: 사용자 입력에 반응하는 동적인 데이터 애플리케이션을 쉽게 만들 수 있습니다.

단점

  1. 고급 사용자 정의 제한: Streamlit은 사용의 용이성에 중점을 두기 때문에, 복잡한 사용자 인터페이스나 고도로 맞춤화된 앱 디자인을 구현하기 어려울 수 있습니다.
  2. 성능 문제: 대규모 데이터셋이나 복잡한 연산을 처리하는 앱의 경우, 성능 저하가 발생할 수 있습니다.
  3. 웹 개발 기능의 제한: 전통적인 웹 개발 툴셋에 비해 제공하는 웹 개발 기능이 제한적일 수 있습니다. 복잡한 웹 애플리케이션을 구축하려는 경우 다른 프레임워크를 고려해야 할 수도 있습니다.

Streamlit App 실행하기

# streamlit 라이브러리설치
pip install streamlit

# Streamlit으로 실행
streamlit run your_script.py

# Python 모듈로 실행 → Python으로 실행하는 경우, PyCharm과 같은 IDE를 구성할 때 유용할 수 있습니다.
python -m streamlit run your_script.py 

Data 표시방법

Streamlit에서 Data (tables, arrays, data frames 등)를 표시하는 방법은 magic CLI 와 st.write() 를 활용하는 방법이 있다.
st.write()는 텍스트에서 테이블까지 다 작성이 가능하다.

① magic command line

Streamlit은 변수나 데이터가 선언되어 있으면 자동으로 st.write()를 사용하여 앱을 빌드 합니다.

###
# first app
# DataFrame 으로 테이블을 생성
###

import streamlit as st
import pandas as pd

df = pd.DataFrame({
    'first column': [1, 2, 3, 4],
    'second column': [10, 20,30, 40]
})

df

② st.write()

st.write()는 텍스트, 데이터, 차트 등 arguments 에 따라 작성 할 수 있다.

import streamlit as st
import pandas as pd

st.write("Here's our first attempt at using data to create a table:")
st.write(pd.DataFrame({
    'first column': [1, 2, 3, 4],
    'second column': [10, 20,30, 40]
}))

데이터를 표시하는 데 사용할 수 있는 st.dataframe() 및 st.table()과 같은 함수를 사용하여 다양한 style을 적용 할 수 있다.

DataFrame에 Style 적용하기

① DataFrame에 Highligt 적용

import streamlit as st
import pandas as pd
import numpy as np

df = pd.DataFrame(
    np.random.randn(10, 20),    # 표준 정규분포 확률을 따르는 난수를 생성
    columns = ('col %d' % i for i in range(20))
)

# 열의 최대값에 하이라이트 표시
st.dataframe(df.style.highlight_max(axis=0))

(결과)

② 정적 테이블 생성 : st.table()

import streamlit as st
import pandas as pd
import numpy as np

df = pd.DataFrame(
    np.random.randn(10, 20),    # 표준 정규분포 확률을 따르는 난수를 생성
    columns = ('col %d' % i for i in range(20))
)

st.table(df)

③ 라인 차트 그리기 : st.line_chart()

import streamlit as st
import pandas as pd
import numpy as np

df = pd.DataFrame(
    np.random.randn(20, 3),    # 표준 정규분포 확률을 따르는 난수를 생성
    columns = ['a', 'b', 'c']
)

st.line_chart(df)

(결과)

⓸ 지도 그리기 : st.map()

Numpy를 사용하여 샘플 데이터를 생성하고 샌프란시스코 지도에 그려보겠습니다.

import streamlit as st
import pandas as pd
import numpy as np

df = pd.DataFrame(
    np.random.randn(1000, 2) / [50, 50] + [37.76, -122.4],
    columns=['lat', 'lon']
)

st.map(df)

(결과)

⑤ Widgets

st.slider(), st.button() , st.selectbox() 와 같이 위젯을 추가하여 표현할 수있다.

import streamlit as st
import pandas as pd
import numpy as np

st.markdown("### 1. slider widget")
x = st.slider('x')
st.write(x, '제곱은', x * x)


st.markdown("### 2. text input widget")
st.text_input("Your name", key="name")

# You can access the value at any point with:
st.session_state.name

st.markdown("### 3. checkbox widget")
if st.checkbox('Once you checked, dataframe is displyed'):
    chart_data = pd.DataFrame(
       np.random.randn(20, 3),
       columns=['a', 'b', 'c'])

    chart_data

st.markdown("### 4. selectbox widget")
df = pd.DataFrame({
    'first column': [1, 2, 3, 4],
    'second column': [10, 20, 30, 40]
    })

option = st.selectbox(
    'Which number do you like best?',
     df['first column'])

'You selected: ', option

⓺ Layout

import streamlit as st
import time

# 사이드바에 selctbox 구성하기
add_selectbox = st.sidebar.selectbox(
    'How would you like to be contacted?',
    ('Email', 'Home phone', 'Mobile phone')
)

# 사이드바에 slide 구성하기
add_slider = st.sidebar.slider(
    'Select a range of values',
    0.0, 100.0, (25.0, 75.0)
)

# 위젯을 나란히 배치하기
left_column, right_column = st.columns(2)
left_column.title('Left Column')
left_column.button('Press me')

right_column.title('Right Column')
with right_column:
    chosen = st.radio(
        'Sorting hat',
        ("Gryffindor", "Ravenclaw", "Hufflepuff", "Slytherin")
    )
    st.write(f"You are in {chosen} house!")

# Progress Bar
st.title('Progress Bar')
'Starting a long computation...'
latest_iteration = st.empty()
bar = st.progress(0)

for i in range(100):
    latest_iteration.text(f'Iteration {i+1}')
    bar.progress(i+1)
    time.sleep(0.1)

'...and now we\'re done!'

멀티페이지 App 만들기

Streamlit 1.10 이상 부터는 멀티 페이지를 구성할 수 있습니다.

서브페이지 구성 제약

  • Sub 페이지의 기본 구성은 pages 디렉토리에 위치해야 합니다.
  • 각 Streamlit 앱의 이름은 파일 이름에 따라 결정되므로 앱 이름을 변경하려면 파일 이름을 변경해야 합니다. (이모티콘 추가도 가능)
  • 각 Python 파일의 시작 부분에 숫자를 추가하여 페이지 순서를 지정할 수 있습니다. 파일 이름 앞에 1을 추가하면 Streamlit은 해당 파일을 목록의 첫 번째로 배치합니다.
  • 각 페이지에는 파일 이름으로 정의된 고유한 URL이 있습니다.

멀티페이지 구성

멀티페이지는 메인이 되는 Home.py 와 내부의 1_page_one.py, 2_Page_two.py, 3_🥉_three.py 3개의 서브페이지로 이동 되도록 구성합니다.

페이스 구성 소스트리

Home.py     # "streamlit run"으로 실행할 메인 파일
└─── pages/
    └─── 1_page_one.py 
    └─── 2_Page_two.py 
    └─── 3_🥉_three.py

① 기본 사이드바 탐색 숨기기

파일명을 기준으로 사이드바 메뉴를 별도 이름으로 지정할 수 있도록 변경합니다.
사용자 정의 탐색 메뉴를 생성할 때 를 사용하여 기본 사이드바 탐색을 숨겨야 합니다. 소스코드 루트 .streamlit/config.toml작업 디렉터리에 다음 파일을 추가합니다 .

[client]
showSidebarNavigation = false

② 사이드 바 메뉴 구성하기

메뉴트리 구성을 위해서는 각 Page 별로 메뉴를 동일하게 구성합니다.

# 공통 사이드바
st.sidebar.page_link("home.py", label="Home")
st.sidebar.page_link("pages/1_page_one.py", label="🥇 Page One")
st.sidebar.page_link("pages/2_Page_two.py", label="🥈 Page Two")
st.sidebar.page_link("pages/3_🥉_three.py", label="🥉 Page Three")
st.sidebar.markdown("---")

(결과)


Reference

728x90
반응형
728x90

minikube

minikube는 쿠버네티스를 로컬에서 실행할 수 있는 도구로 개인용 컴퓨터(윈도우, macOS 및 리눅스 PC 포함)에 설치할 수 있고, 단일 노드 Kubernetes 클러스터를 만들 수 있다.

필요 사항

  • 2 CPUs 이상
  • 2GB 메모리
  • 20GB 디스크
  • Docker

1. 설치하기

설치는 MacOS 기준으로 설치를 진행합니다.

# minikube 설치
brew install minikube

# minikube version
minikube version

# cluster 실행
minikube start

설치결과

Docker Desktop이 설치되어 있으면, 자동으로 Docker 드라이버를 선택합니다.

2. minikube 대시보드배포

minikube는 Kubernetes 대시보드를 번들로 제공 하므로 minikube dashboard로 K8S 대시보드를 배포하여, 정상적으로 실행 되는지 확인합니다.

3. 샘플 앱 배포

Sample APP을 배포하고, 8080 포트에 노출합니다.

kubectl create deployment hello-minikube --image=kicbase/echo-server:1.0
kubectl expose deployment hello-minikube --type=NodePort --port=8080

kubectl을 사용하여 포트를 전달하고, http://localhost:7080 으로 접속하여 결과를 확인 합니다.

kubectl port-forward service/hello-minikube 7080:8080

4. 클러스터관리

배포된 애플리케이션에 영향을 주지 않고 Kubernetes를 일시 중지

minikube pause

일시 중지된 인스턴스를 일시 중지 해제

minikube unpause

클러스터를 중지

minikube stop

기본 메모리 제한을 변경(다시 시작해야 함).

minikube config set memory 9001

설치 가능한 K8S add-on 조회

minikube addons list

모든 Minikube 클러스터를 삭제

minikube delete --all

Reference

728x90
반응형
728x90

깔끔한 데스크 공간을 마련하고, 외부 모니터를 활용하여 깔끔한 데스크 환경을 만들어보자.

1. 전원 설정

노트북 덮개를 덮어도 전원이 꺼지지 않도록 설정합니다.

  • 윈도우 설정 (단축키 : Win + i)에서 덮개를 닫을 때의 작동설정 메뉴로 이동합니다.
  • 덮개를 닫을 때 의 옵션을 [아무 것도 안 함] 설정으로 변경합니다.

2. 디스플레이 설정

노트북 모니터의 주 모니터 설정을 외부 디스플레이로 주 모니터를 변경합니다.

이상입니다. 😊

728x90
반응형

'사무(OA)' 카테고리의 다른 글

[MAC] Mac에서 docker 설치하기  (0) 2022.11.05
맥(Mac)에서 소스트리 출력하기  (0) 2022.07.21
[카카오 메일]Windows10 메일 연결  (0) 2021.08.13
728x90

파이썬에서 PDF 파일을 읽어와서 엑셀 파일로 변환하기 위해서는 몇 가지 라이브러리를 사용해야 합니다.
주로 PyPDF2 또는 pdfplumber를 사용하여 PDF 파일을 읽고, pandas를 사용하여 데이터를 가공하여 엑셀 파일로 저장할 수 있습니다.

pdfplumber 는 PDF 파일의 각 문자, 사각형, 선에 대한 상세한 정보를 제공하고 텍스트와 표를 쉽게 추출할 수 있는 라이브러리로, 데이터 분석 및 자동화 작업에 유용한 도구입니다.

https://github.com/jsvine/pdfplumber

1. 라이브러리 설치

먼저 pdfplumber 라이브러리를 설치합니다.(pip, anaconda, pipenv 환경 구성에 따라 설치 합니다.)

1. pip
pip install pdfplumber

2. anaconda
conda install -c conda-forge pdfplumber

3. pipenv
pipenv install pdfplumber

2. 테이블 추출하기

pdf 를 추출하기 위해 pdfplumber.open(file) 함수를 이용하여 pdf를 추출합니다.

import os  
import pdfplumber  
import pandas as pd  


file_path = os.getcwd()+"/contents/"  
pdf_name = "file.pdf"  
pdf_file_path = file_path + pdf_name  

# PDF 파일 열기  
pdf = pdfplumber.open(pdf_file_path)  

pages = pdf.pages  
print("총 페이지 수 : ", len(pages))  

tables = []  

# 1. 페이지에서 표 데이터 추출하기  
for each in pages:  
    table = each.extract_tables()  
    tables.extend(table)

3. 데이터 프레임으로 변환

# 2. 데이터 프레임으로 변환  
df = pd.DataFrame(tables[1:], columns=[tables[0]])  

# 3. 데이터프레임을 엑셀 파일로 저장  
excel_file_path = file_path + "file.xlsx"  
df.to_excel(excel_file_path, index=False, engine='openpyxl')

print(f'DataFrame이 {excel_file_path}에 저장 되었습니다.')

openpyxl 라이브러리가 설치되어 있지 않은 경우, 설치 하여 주세요.

728x90
반응형
728x90

개인투자용국채

2024년 상반기 개인 '직접 투자'가능한 국채 출시 

 

국채란? 쉽게말해 나라에 돈을 빌려주고 이자를 받는 상품.

 

가입 방법은?

개인투자용 국채는 전용계좌만 개설하면 누구나 판매대행기관 창구 방문이나 온라인 신청을 통해 청약,구매할 수 있습니다. (현재 판매대행기관 선정 후 시스템 구축을 거쳐 상반기 중 출시될 예정)

 

원리금 보장 상품 인데다가 가산금리분리과세 혜택까지 있는 상품

 

 

개인투자용국채<개요>

 

매입자격 : 전용계좌를 보유한 개인 (1인 1계좌)

한도 : 최소 10만원, 연간 한도 1인당 총 1억원

종목 : 10년물, 20년물

상환조건 : 만기일에 원금 및 이자 일괄 수령

적용금리 : 만기 보유 시 표면금리 + 가산금리(연복리 적용)

세제혜택: 매입액 총 2억원까지 이자소득 14%분리과세

 

( 1인당 연 1억 한도를 채워서 2년간 2억을 납입을 하면 20년 후에 이자만 2억가까이 나옵니다. 이게 종합과세로 잡히면 세금이 절반정도 나가지만 개인용 국채는 분리과세가 가능하기때문에 15.4%(지방세 포함) 만 내게됩니다. 절세를 고민하시는 분들에게 좋은 대책이 될거라 봅니다.)

 

표면금리는 전월 발행한 동일 연물 국고채 낙찰 금리를 적용합니다. 가령 1월 국고 10년 낙찰금리가 3.5%일 경우 2월 발행될 개인 투자용 국채 10년의 표면금리도 3.5%입니다. 가산금리는 시장상황 등을 고려해 매월 결정·공표될 예정입니다.

 

만약 월간 발행한 국채수요를 초과한다면 소액으로 청약한 대상에게 우선 배정합니다.

 

 

개인투자용 국채수익률 <10년물>

표면
금리
세전 세후
만기 연평균 만기 연평균
2.0% 22% 2.2% 19% 1.9%
2.5% 28% 2.8% 24% 2.4%
3.0% 34% 3.4% 29% 2.9%
3.5% 41% 4.1% 35% 3.5%
4.0% 48% 4.8% 41% 4.1%

 

개인투자용 국채 수익률<20년물>

표면금리 세전 세후
만기 연평균 만기 연평균
2.0% 49 2.4 41 2.1
2.5% 64 3.2 54 2.7
3.0% 81 4.0 68 3.4
3.5% 99 4.9 84 4.2
4.0% 119 6.0 101 5.9

이자소득 세율 14%(지방세 포함시 15.4%, 분리과세 한도 내) 가정

                                                           <자료: 기획재정부>

개인투자용국채발행 원금보장개인투자용국채발행 절세효과

 

중도 환매 가능할까?

 

10년, 20년동안 기다리면서 투자를 한다는 게 보통 쉬운 일은 아닙니다.

중도 환매를 하더라도 원금 손실은 없을까요?

--없습니다!

하지만, 중도 환매를 하면 표면금리의 단리 이자는 받을 수 있지만 분리과세혜택은 받을 수 없습니다.

 

재가입은 중도 환매 매입 시점 1년 후부터 가능합니다.

 

※ 개인투자용 국채 투자 예상 사례 ※

1인당 연 1억 한도를 채워서 2년간 2억을 납입을 하면 20년 후에 이자만 2억가까이 나온다. 이게 종합과세로 잡히면 세금이 절반정도 나가지만 개인용 국채는 분리과세가 가능하기때문에 15.4%만 내게된다. 절세를 고민하시는 분들에게 좋은 대책이 될거라 본다.   

 

①  노후대비 연금식 투자 : 40~59세에 20년 동안 달마다 20년물 50만원을 매입하면, 60세~79세 20년 동안 달마다 100만원 받을 수 있습니다. 

② 노후대비 일시 수령 방식 : 원금 손실 부담 없이 목돈의 안정적 투자를 위해 10년물 1억 원을 매입하면 10년 뒤 1억 4100만 원을 받을 수 있고, 20년 물 1억 원을 매입하면 20년 뒤 2억원을 수령할 수 있습니다. 

③  50세에 20년물 5000만 원을 일시에 매입하면 70세에 1억 원을 수령하며 만기 전 사망 땐 배우자,자녀 등에게 상속 가능하다.

④ 자녀 학자금 마련 : 자녀 나이 0세~4세에 해마다 20년물 500만 원을 매입하면 자녀 나이 20세~24세에 해마다 1000만 원을 받을 수 있습니다. 자녀 나이 10세 때 10년물 3000만 원을 일시 매입하면 자녀 나이 20세 될 때 4200만원을 수령할 수 있습니다. 

 

 

 

728x90
반응형
728x90

배당락(Ex-Dividend)

배당기준일을 지나 더이상 주식을 매수해도 배당금을 받을 권리가 없는 것을 말합니다.
배당락일은 배당기준일 다음날을 의미합니다. 따라서 배당락일에는 12월 결산법인의 주식을 매수해도 현금배당을 받을 수 없습니다.

보통 현금배당의 경우는 배당락으로 인한 주가의 하락이 없고, 주식배당의 경우에만 주가의 하락이 발생합니다.

728x90
반응형

+ Recent posts