반응형

사전 설치

1. Java 설치

Java Development Kit (JDK)를 설치하세요.

NOTE: Your local environment must have Java 8+ installed.
$ sudo apt update

$ sudo apt install default-jre
$ sudo apt install default-jdk

 

설치 확인

$ java -version
openjdk version "17.0.11" 2024-04-16
OpenJDK Runtime Environment (build 17.0.11+9-Debian-1deb12u1)
OpenJDK 64-Bit Server VM (build 17.0.11+9-Debian-1deb12u1, mixed mode, sharing)

 

 

설치

1. Kafka 다운로드

- 파일 다운로드 경로

https://dlcdn.apache.org/kafka/3.7.1/kafka_2.13-3.7.1.tgz

$ wget https://dlcdn.apache.org/kafka/3.7.1/kafka_2.13-3.7.1.tgz

$ tar -xzf kafka_2.13-3.7.1.tgz
$ cd kafka_2.13-3.7.1

 

 

2. Zookeeper 시작하기

Kafka는 Zookeeper를 필요로하기 때문에 먼저 시작시켜 줍니다.

$ bin/zookeeper-server-start.sh config/server.properties

 

(Option) 필요한 경우 서비스로 등록시켜 관리합니다.

- 재시작시 자동으로 실행이 필요한 경우 등

$ sudo vi /etc/systemd/system/zookeeper-server.service

 

zookeeper-server.service 파일 내용

[Unit]
Description=zookeeper-server
After=network.target

[Service]
Type=forking
User=${your-user}
Group=${your-group}
SyslogIdentifier=zookeeper-server
WorkingDirectory=${your-directory}
Restart=always
RestartSec=0s
ExecStart=${your-directory}/bin/zookeeper-server-start.sh config/zookeeper.properties
ExecStop=${your-directory}/bin/zookeeper-server-stop.sh

 

 

 

3. Kafka 시작하기

Kafka를 실행시킵니다.

# Start the Kafka broker service
$ bin/kafka-server-start.sh config/server.properties

 

(Option) 필요한 경우 서비스로 등록시켜 관리합니다.

- 재시작시 자동으로 실행이 필요한 경우 등

$ sudo vi /etc/systemd/system/kafka-server.service

 

kafka-server.service 파일 내용

[Unit]
Description=kafka-server
After=network.target

[Service]
Type=forking
User=${your-user}
Group=${your-group}
SyslogIdentifier=kafka-server
WorkingDirectory=${your-directory}
Restart=always
RestartSec=0s
ExecStart=${your-directory}/bin/zookeeper-server-start.sh config/server.properties
ExecStop=${your-directory}/bin/zookeeper-server-stop.sh

 

 

4. 동작 확인

- Topic을 생성하여 정상적으로 동작하는지 확인한다.

 

$ bin/kafka-topics.sh --create --topic quickstart-events --bootstrap-server localhost:9092

 

- 생성 된 Topic 정보를 확인한다. 

$ bin/kafka-topics.sh --describe --topic quickstart-events --bootstrap-server localhost:9092
Topic: quickstart-events        TopicId: Dqx24JbaTeK_Asr90184Lg PartitionCount: 1       ReplicationFactor: 1    Configs:
        Topic: quickstart-events        Partition: 0    Leader: 0       Replicas: 0     Isr: 0

 

 

Trouble Shooting

- 외부의 다른 서버에서 해당 Kafka 서비스에서 사용이 안되는 경우가 발생하였습니다.

- 기본 설정으로는 localhost 또는 127.0.0.1이라는 주소로 Kafka에 접근하게 됩니다.

- IP로 접근하려는 외부 서비스들이 있을 경우 아래 파일에 해당 서버의 IP 주소를 advertised.listeners 에 등록합니다.

 

/config/server.properties

############################# Socket Server Settings #############################

# The address the socket server listens on. If not configured, the host name will be equal to the value of
# java.net.InetAddress.getCanonicalHostName(), with PLAINTEXT listener name, and port 9092.
#   FORMAT:
#     listeners = listener_name://host_name:port
#   EXAMPLE:
#     listeners = PLAINTEXT://your.host.name:9092
#listeners=PLAINTEXT://:9092

# Listener name, hostname and port the broker will advertise to clients.
# If not set, it uses the value for "listeners".
advertised.listeners=PLAINTEXT://your.host.name:9092

 

참고 사이트

- https://kafka.apache.org/quickstart

반응형
반응형

 

파이썬 개발 환경 구성

파이썬 개발 환경 구성

Poetry

  • Poetry : dependency management and packaging in Python

requires

  • Python 3.8+

지원 OS

  • Linux, macOS, Windows 지원

윈도우 설치 방법

  1. Poetry 설치
    1. WSL 사용하는 경우
      curl -sSL https://install.python-poetry.org | python3 -
    1. Powershell 사용하는 경우
      (Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | py -
  1. Poetry 환경 변수 등록
    1. 시스템 속성 > 환경 변수 >시스템 변수 > 아래 path 추가
      %APPDATA%\Python\Scripts 
    1. `APPDATA`가 정의되어 있지 않다면 아래 Path 추가
      C:\Users\사용자_윈도우_계정\AppData\Roaming\Python\Scripts\Python\Scripts
  1. 설치 확인
    1. 버전 확인
      >poetry --version
      Poetry (version 1.8.2)

  1. 업데이트
    1. self update
      >poetry self update
      Updating Poetry version ...
      
      Using version ^1.8.2 for poetry
      
      Updating dependencies
      Resolving dependencies... (7.9s)
      
      No dependencies to install or update
      
      Writing lock file
  1. 실습
    1. 실습할 폴더 생성 후 초기 세팅 진행
      mkdir test
      cd test
      poetry init
    1. 초기 세팅 내용
      >poetry init
      
      This command will guide you through creating your pyproject.toml config.
      
      Package name [2404_langchain]:
      Version [0.1.0]:
      Description []:
      Author [frontmulti <frontmulti@gmail.com>, n to skip]:
      License []:
      Compatible Python versions [^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
      Generated file
      
      [tool.poetry]
      name = "2404-langchain"
      version = "0.1.0"
      description = ""
      authors = ["frontmulti <frontmulti@gmail.com>"]
      readme = "README.md"
      
      [tool.poetry.dependencies]
      python = "^3.8"
      
      
      [build-system]
      requires = ["poetry-core"]
      build-backend = "poetry.core.masonry.api"
      
      
      Do you confirm generation? (yes/no) [yes]
    1. 생성 파일 확인
      1. `pyproject.toml`
      [tool.poetry]
      name = "2404-langchain"
      version = "0.1.0"
      description = ""
      authors = ["frontmulti <frontmulti@gmail.com>"]
      readme = "README.md"
      
      [tool.poetry.dependencies]
      python = "^3.8"
      
      
      [build-system]
      requires = ["poetry-core"]
      build-backend = "poetry.core.masonry.api"
      




      반응형
      반응형

      윈도우10에서 helm 설치하기

       

      아래 사이트에 '헬름 설치하기' 항목 중 'Chocolatey'을 사용하여 설치하였습니다.

      https://helm.sh/ko/docs/intro/install/

       

      헬름 설치하기

      헬름 설치하고 작동하는 방법 배우기.

      helm.sh

       

      윈도우 터미널 실행 (cmd)

       

      설치하기

      >choco install kubernetes-helm
      Chocolatey v0.10.15
      Chocolatey detected you are not running from an elevated command shell
       (cmd/powershell).
      
       You may experience errors - many functions/packages
       require admin rights. Only advanced users should run choco w/out an
       elevated shell. When you open the command shell, you should ensure
       that you do so with "Run as Administrator" selected. If you are
       attempting to use Chocolatey in a non-administrator setting, you
       must select a different location other than the default install
       location. See
       https://chocolatey.org/install#non-administrative-install for details.
      
      
       Do you want to continue?([Y]es/[N]o): Y
      
      Installing the following packages:
      kubernetes-helm
      By installing you accept licenses for the packages.
      kubernetes-helm v3.7.1 already installed.
       Use --force to reinstall, specify a version to install, or try upgrade.
      
      Chocolatey installed 0/1 packages.
       See the log for details (C:\ProgramData\chocolatey\logs\chocolatey.log).
      
      Warnings:
       - kubernetes-helm - kubernetes-helm v3.7.1 already installed.
       Use --force to reinstall, specify a version to install, or try upgrade.

       

      설치 후 버전 확인

      >helm version
      version.BuildInfo{Version:"v3.7.1", GitCommit:"1d11fcb5d3f3bf00dbe6fe31b8412839a96b3dc4", GitTreeState:"clean", GoVersion:"go1.16.9"}
      반응형
      반응형

      Kubernetes를 활용하다보니 경량화 리눅스를 기반으로 만든 이미지를 사용할 일이 많아서 

      일반적인 명령어로 대상 서버의 포트가 열려있는지 확인이 어려울 때 아래 명령어를 통해 

      포트가 열려있는지를 확인할 수 있습니다.

      # 대상 서버 포트 열려있는 상태
      echo > /dev/tcp/{ip}/{port}
      echo $?
      0
      
      # 대상 서버 포트가 열려있지 않은 상태
      echo > /dev/tcp/{ip}/{port}
      echo $?
      1

       

       

       

      반응형
      반응형

      새로 장만한 노트북에 WSL2 세팅을 진행한 내용을 기록합니다.

       

      운영체제 : Windows11 Pro

       

      Windows PowerShell을 '관리자로 실행'

       

      `wsl --install` 커맨드 입력

      이전과는 다르게 필요한 내용들을 한번에 설정 & 설치까지 진행해줍니다.

      커널도 설치해주고 GUI 앱 지원도 다운로드 하네요.

       

      Ubuntu도 알아서 다운받습니다..

       

      완료되면 시스템을 다시 시작합니다.

      다시 시작하고 나면 아래 화면이 나타나고 

      잠시 뒤에 Ubuntu가 실행됩니다.

       

       UNIX username, New password를 지정해주면 Ubuntu를 사용하실 수 있습니다.

       

      wsl의 상태가 궁금하다면, `wsl --status` 커맨드를 입력하세요.

       

      윈도우11에서 WSL2를 설치하여 Ubuntu를 사용할 수 있도록 설정해봤습니다.

      예전에 비하면 설치하기가 정말 간편해졌네요. 

      별도로 진행해야했던 커널 설정 및 Ubuntu 다운로드 등 이러한 과정을 설치 명렁어 한 번으로 모두 실행해주니 

      정말 쉽게 설치할 수 있었습니다.

      (업데이트 만세! 😁👍)

      반응형
      반응형

      What is Interactive Rebase [Advanced Tutorial]

      https://youtu.be/JkpYvXdbnfQ

      Interactive Rebase란?

      병합하기 위한 방법 중 하나. (다른 하나는 Merge)

      • git rebase
      • git rebase -i
        • -i : interactive 옵션
      • rebase는 자동으로 작업을 해주는데 -i 옵션을 사용하면 편집이 가능하다.

      Interactive Rebase 의 종류

      • Pick
        • 대상 커밋 선택 (Default)
      • Reword
        • 커밋 메시지를 변경할 수 있다.
      • Squash
        • 이전 커밋에 병합
      • Drop
        • Rebase를 수행하고자 하는 커밋들 중에 선택한 커밋을 삭제할 수 있다.
      • Reorder
        • Pick하고자 하는 커밋의 순서를 변경할 수 있다.

      실습

      • 목표 : 여러개로 나눠져 있는 커밋을 합치고자 함.
        • 환전 기록 Page UI 및 동작 추가
        • 환전 기록 firestore CRUD 구현
        • 환율, 날짜 Item 컴포넌트 추가

      • 대상 커밋 선택 > Interactive Rebase 버튼 클릭
      • 최종적으로 합치고 싶은
        커밋 이전의 커밋을 선택하여 Interactive Base 버튼을 선택해야 함.
        '환전 기록 Page UI 및 동작 추가'에 이후 커밋들을 squash하고 싶은 경우,
        이전 커밋인 '환전 내역 Firestore에서 가져오도록 수정' 커밋 선택 후 Interactive Rebase 버튼 선택.
      • 원하는 Interactive Rebase 동작을 선택하여 수행
        • 처음 화면
        • 커밋을 합치고 싶기에 Squash 선택
        • GitKraken에서 자동으로 병합되는 마지막 커밋 메시지를 정리해 줌.(Reword)
          • 원래 커밋 메시지 (Reword 전)
          • squash and 자동 reword 후 커밋 메시지
        • 'Start Rebase' 버튼 선택

      그림은 없지만, 이후로 '환전 기록 Summary UI 및 동작 추가' 커밋을 '환전 기록 Page UI 및 동작 추가' 커밋으로 squash 한번 더 수행 함.

      • Rebase 완료 후 커밋 내역

      실습 (Advanced)

      한번에 squash 작업을 수행

      Interactive Rebase 결과물 Remote에 반영

      remote git에 이전 커밋 내용들이 들어가 있고 local에서 Interactive Rebase한 후의 결과물을 반영하고 싶은 경우

      • 이미 remote repository에 push 해버린 commit들 하나로 합치기
      • 사실 권장하는 방법은 아닌걸로 보인다.
        • Rebase 설명(git-scm.com) 중 Rebase의 위험성이라는 항목이 있고 그 내용은 아래와 같다.
        Rebase가 장점이 많은 기능이지만 단점이 없는 것은 아니니 조심해야 한다. 그 주의사항은 아래 한 문장으로 표현할 수 있다.이 지침만 지키면 Rebase를 하는 데 문제 될 게 없다. 하지만, 이 주의사항을 지키지 않으면 사람들에게 욕을 먹을 것이다.
      • Rebase는 기존의 커밋을 그대로 사용하는 것이 아니라 내용은 같지만 다른 커밋을 새로 만든다. 새 커밋을 서버에 Push 하고 동료 중 누군가가 그 커밋을 Pull 해서 작업을 한다고 하자. 그런데 그 커밋을 git rebase 로 바꿔서 Push 해버리면 동료가 다시 Push 했을 때 동료는 다시 Merge 해야 한다. 그리고 동료가 다시 Merge 한 내용을 Pull 하면 내 코드는 정말 엉망이 된다.
      • 이미 공개 저장소에 Push 한 커밋을 Rebase 하지 마라

      Remote 브랜치 Git 내역

      Local 브랜치 Git 내역 (Rebase 작업 결과)

      Local 브랜치 'Push'

      Local 브랜치는 Remote 브랜치 뒤에 있으니 Pull을 실행하여 Local 브랜치를 업데이트하라고 함.

      • Pull (fast-forward if possible)
      • Force Push
      • Cancel

      이런 경우, 'Force Push'를 통해 해당 내용을 업데이트 해줘야 하는데 주의할 점이 있음.

      블로그 내용 발췌 (https://json.postype.com/post/209499)

      블로그 내용이 오타같음.
      아무도 squash '하기 전' commit 들을 pull 하지 않았다는 가정하에 이 작업이 수행되어야 한다.
      로 적혀 있어야 할 것 같은데... (이해한게 맞는지 확인이 필요하구먼)

      'Force Push 선택' > 경고 문구 표시 (※ 정말 주의해야 함!)

      Force push is a destructive action and cannot be undone. Are you sure?

      궁금증)

      이전 커밋들 내용으로 PR을 요청한 상태인데,
      이런 경우 force push를 하고 나면 PR 내용은 어떻게 표시될까?

      → 결론은 PR도 유지되고 변경된 내용도 잘 반영되어 보인다.

      Rebase 이전 PR

      Rebase 'Force Push' 이후 PR

      반응형
      반응형

      목표

      React 자체 기능만을 사용하여 글로벌 상태를 사용해보자.

       

      도입

      보통 React 프로젝트를 진행하면서 글로벌 상태를 사용하고 관리하기 위해 Redux 라이브러리를 많이 사용합니다만, 소규모 애플리케이션에서는 Redux를 도입하는게 공수적인 측면에서 손해일 수도 있겠다는 생각이 들어 다른 방법을 찾아보게 되었습니다.

       

      React Context 공식 설명

      context를 이용하면 단계마다 일일이 props를 넘겨주지 않고도 컴포넌트 트리 전체에 데이터를 제공할 수 있습니다.

       

      API

      1. React.createContext

      const MyContext = React.createContext(defaultValue);

      2. Context.Provider

      <MyContext.Provider value={/* 어떤 값 */}>

       

      3. Class.contextType

      class MyClass extends React.Component {
        componentDidMount() {
          let value = this.context;
          /* MyContext의 값을 이용한 코드 */
        }
        componentDidUpdate() {
          let value = this.context;
          /* ... */
        }
        componentWillUnmount() {
          let value = this.context;
          /* ... */
        }
        render() {
          let value = this.context;
          /* ... */
        }
      }
      MyClass.contextType = MyContext;

       

      4. Context.Consumer

      <MyContext.Consumer>
        {value => /* context 값을 이용한 렌더링 */}
      </MyContext.Consumer>

       

      실제 사용해보기

      Context를 생성합니다.

      생성한 Context를 다른 컴포넌트에서 가져올 수 있게 export해 줍니다.

      //App.js
      export const UserContext = React.createContext(null);

       

      Provider컴포넌트를 사용합니다.

      //App.js
      render() {
      	return (
      		<UserContext.Provider value="contextValue">
      			// Context를 구독하는 컴포넌트들을 이 안에서 불러줍니다.
      			// 이 안의 컴포넌트들은 이제 context의 변화를 알 수 있습니다.
      			// Provider가 context의 변화를 알리는 역할을 합니다.
      		</UserContext.Provider>
      	)
      }

       

      하위 컴포넌트에서 Context Consumer를 통해 context에 value를 사용할 수 있습니다.

      import { UserContext } from '../../../../../App'; // export한 UserContext를 불러옵니다.
      
      
      class FooComponent extends React.Component {
      	render() {    
      		return (
      			<UserContext.Consumer>
      				{value =>
      					<Text>value</Text>
      				}
      			</UserContext.Consumer>
      		)
      	}
      }

       

       

      참고 : https://ko.reactjs.org/docs/context.html

      반응형
      반응형

      개발 중에 PropTypes이 적용되지 않는 경우가 있어서

      PropTypes 사용 방법을 찾아서 정리하였습니다.

       

      `prop-types` 라이브러리가 설치되어 있어야 합니다.

      prop-types 라이브러리 설치 방법 

      npm install prop-types

       

       

      동작하지 않던 코드 (Babel Transform 미사용 시)

      → 정확히 얘기하면 Babel Transform(transform-class-properties 등)을 사용하고 있는 경우에만 React 컴포넌트 클래스 내의 정적프로퍼티로 선언 가능 (React 공식 문서 참고)

       

       

      동작하는 코드 

      Class Component, Function Component 별로 PropTypes 및 DefaultProps 를 지정하는 샘플 코드를 작성하였습니다.

       

      1. Class Component 사용 시

      2. Function Component 사용 시

       

       

      공식 문서 : https://ko.reactjs.org/docs/typechecking-with-proptypes.html#default-prop-values

      반응형

      + Recent posts