728x90
반응형

개발이나 테스트 환경에서 오라클 데이터베이스를 구축할 때, 무거운 설치 파일을 다운로드하고 세팅하느라 고생하신 적 있으신가요? 이제는 컨테이너 기술을 활용해 단 몇 분 만에 데이터베이스를 띄울 수 있습니다.

오라클은 기존의 XE (Express Edition) 버전을 단종시키고, 더욱 강력해진 기능(AI Vector Search, JSON Relational Duality 등)을 포함한 Oracle Database 23ai Free 버전을 무료로 제공하고 있습니다.

오늘은 Docker 대신 보안이 뛰어나고 가벼운 PodmanPodman Compose를 활용하여 Oracle 23ai Free 환경을 구축하는 방법을 알아보겠습니다.

 

사전 준비 (Prerequisites)

  • OS: Rocky Linux, CentOS, RHEL 8/9 등 (또는 Ubuntu)
  • 필수 패키지: podman, podman-compose 설치 완료
  • 여유 메모리(RAM) 최소 2GB 이상 권장

Step 1. 작업 디렉터리 및 볼륨 폴더 생성

컨테이너가 삭제되더라도 데이터베이스의 데이터가 날아가지 않도록(영구 보존), 호스트 PC에 데이터를 저장할 폴더를 만들어야 합니다.

원하는 작업 공간으로 이동 후 아래 명령어를 실행하세요.

 

# oracle23 ai 를 설치할 계정생성 
adduser -d /mnt/hdd/ora23ai ora23ai

su - ora23ai 
# 데이터가 영구 저장될 볼륨 폴더 생성
mkdir data_ora23ai
#쓰기권한 설정 
chmod 777 data_ora23ai

 

 

Step 2. docker-compose.yml 파일 작성

podman-compose는 기존의 docker-compose.yml 파일 포맷을 그대로 지원합니다. 방금 만든 oracle23ai 폴더 안에 파일을 생성합니다.

  • vi docker-compose.yml
services:
  oracle23ai:
    image: container-registry.oracle.com/database/free:latest
    container_name: oracle-23ai
    ports:
      - "1523:1521"
    environment:
      # SYS, SYSTEM, PDBADMIN 계정의 공통 비밀번호로 설정됩니다.
      ORACLE_PWD: "Oracle23ai"
    volumes:
      # :z 옵션은 RHEL/Rocky Linux의 SELinux 환경에서 권한 오류를 방지하는 필수 설정입니다.
      - ./data_ora23ai:/opt/oracle/oradata:z
    healthcheck:
      test: ["CMD", "/opt/oracle/checkDBStatus.sh"]
      interval: 30s
      timeout: 10s
      retries: 5
      start_period: 2m

💡 주요 설정 설명

  • image: 오라클 공식 컨테이너 레지스트리에서 제공하는 최신 23ai Free 이미지를 사용합니다.
  • ORACLE_PWD: 관리자 계정의 비밀번호입니다. (보안상 복잡하게 설정하시는 것을 권장합니다.)
  • :z 옵션: Podman을 사용할 때 호스트의 폴더를 마운트하면 Permission Denied 에러가 자주 발생합니다. 끝에 :z를 붙이면 Podman이 알아서 SELinux 레이블을 조정하여 권한 문제를 해결해 줍니다.

Step 3. 컨테이너 실행하기

#컨테이너를 백그라운드(-d)에서 실행
podman compose up -d

# 실시간 로그 확인
podman logs -f oracle-23ai

로그 마지막 부분에 DATABASE IS READY TO USE! 라는 메시지가 출력되면 정상적으로 구축이 완료된 것입니다. (Ctrl+C를 눌러 로그 화면에서 빠져나옵니다.)

 

  • 컨테이너 실행중 아래와 같은 에러가 발생 할 경우 해결 방법에 따라 진행 합니다.
  • 첫번 째 아래 에러는 일반 사용자(Rootless) 권한으로 Podman을 실행할 때, 사용자 DBUS 세션을 찾지 못해 발생하는 경고 내용입니다. 해결 책은 간단합니다. 출력 메시내용을  콘솔창에서 수행 하면 됩니다. 
WARN[0000] Alternatively, you can enable lingering with: `loginctl enable-linger 54327` (possibly as root)
[ora23ai@rocky9:~]$ loginctl enable-linger 54327
  • 두번째 에러는 docker-compose.yml  을 한글 파일로 변환 하면 됩니다. 
[ora23ai@rocky9:~]$ iconv -f euc-kr -t utf-8 docker-compose.yml > docker-compose.yml.utf8
[ora23ai@rocky9:~]$ mv docker-compose.yml docker-compose.yml.bak
[ora23ai@rocky9:~]$ mv docker-compose.yml.utf8 docker-compose.yml

정상 설치가 되면 오라클 컨테이너가 기동되어 있는것을 확인 할수 있습니다. 

 

정상 설치시 아래와 같이 설치 된다. 

  • DATABASE IS READY TO USE! 출력확인

Step 4. 데이터베이스 접속 테스트

구축이 완료되었으니 DBeaver, SQL Developer 또는 터미널을 통해 접속해 봅니다.

접속 정보 요약 (중요)

Oracle 23ai Free 버전은 기존 XE와 달리 서비스명(Service Name)이 다릅니다.

  • Host: localhost (또는 서버의 IP)
  • Port: 1523
  • Service Name (PDB): FREEPDB1 (기존 XE처럼 XE를 입력하면 접속 안 됩니다!)
  • User: SYS (권한: SYSDBA) 또는 SYSTEM
  • Password: docker-compose.yml에서 설정한 ORACLE_PWD 값

💻 터미널에서 직접 접속해 보기 (SQL*Plus)

컨테이너 내부에 내장된 SQL*Plus를 이용해 바로 쿼리를 날려볼 수도 있습니다.

# SYS 계정으로 접속
podman exec -it oracle-23ai sqlplus sys/Oracle23ai@FREEPDB1 as sysdba

# or 컨테이너에 접속후 sqlplus 수행 
#podman exec -it oracle-23ai bash
#sqlplus sys/Oracle23ai@FREEPDB1 as sysdba

# 버전 확인 쿼리 실행
SQL> SELECT banner FROM v$version;


정상적으로 Oracle Database 23ai Free 관련 정보가 출력된다면 성공입니다!

🧹 (참고) 컨테이너 중지 및 삭제

사용을 마치고 컨테이너를 내리고 싶을 때는 아래 명령어를 사용합니다.

# 중지 및 컨테이너 삭제 (oradata 폴더의 데이터는 그대로 유지됨)
podman compose down
728x90
반응형
728x90
반응형

Ollama란 무엇일까? 

  • Ollama는 대규모 언어 모델(LLM)을 로컬 환경에서 쉽게 실행·관리할 수 있도록 해주는 오픈소스 플랫폼이다. 
  • 본글에서는 Ollama를 설치 하고 실제 활용하는 방법에 대해 글을 정리해 보고자 한다. 

Ollama 설치 하기 

  • 설치하는 서비스 아키텍쳐 구성은 아래 그림과 같다. 
  • Ollama라는 LLM(대규모 언어 모델) 실행 엔진과, 이 Ollama를 웹 브라우저에서 편리하게 사용할 수 있도록 해주는 웹 인터페이스인 Open WebUI를 도커 컨테이너로 실행하여 서로 연결하는 구조를 설명 한 그림이다. 

상세 구성 요소 설명

  • ollama 서비스 (백엔드 AI 엔진)
    • 역할: 실제로 LLM 모델(예: Llama 3, Mistral 등)을 다운로드하고 관리하며, 추론(inference)을 실행하는 핵심 엔진으로 API 서버 역할을 담당한다.
    • 이미지: docker.io/ollama/ollama:latest (공식 Ollama 최신 이미지 사용)
    • 포트:
      • 컨테이너 내부 포트 11434를 호스트의 11434 포트와 연결합니다.
      • 이 포트를 통해 외부(또는 다른 컨테이너)에서 Ollama API에 접근할 수 있습니다.
    • 볼륨 (저장소):
      • 호스트의 ./data/ollama 디렉토리를 컨테이너의 /root/.ollama에 마운트합니다.
      • 목적: 다운로드한 거대한 LLM 모델 파일들을 컨테이너가 삭제되어도 호스트에 영구적으로 보관하기 위함입니다.
    • 기타:
      • # devices: - nvidia.com/gpu=all: 주석 처리되어 있지만, NVIDIA GPU를 사용하여 성능을 가속화하려면 이 부분의 주석을 해제하고 관련 설정(NVIDIA Container Toolkit 등)을 해야 합니다.
      • security_opt: - label=disable: SELinux 등의 보안 레이블링을 비활성화하여 권한 문제를 방지합니다.
      • restart: always: 컨테이너가 죽으면 자동으로 재시작합니다.
  • open-webui 서비스 (프론트엔드 웹 인터페이스)
    • 역할: 사용자가 웹 브라우저를 통해 Ollama와 쉽게 상호작용(채팅, 모델 관리 등)할 수 있도록 돕는 웹 애플리케이션입니다. ChatGPT와 유사한 UI를 서비스를 제공 합니다. 
    • 이미지: ghcr.io/open-webui/open-webui:main (Open WebUI 공식 메인 브랜치 이미지 사용)
    • 포트:
      • 컨테이너 내부의 웹 서버 포트 8080을 호스트의 3000 포트와 연결합니다.
      • 사용자는 브라우저에서 http://localhost:3000으로 접속하게 됩니다.
    • 환경 변수:
      • OLLAMA_BASE_URL=http://ollama:11434: 가장 중요한 연결 고리입니다. Open WebUI가 API 요청을 보낼 Ollama 서버의 주소를 지정합니다. 여기서 http://ollama는 도커 네트워크 내부에서 ollama 컨테이너를 가리키는 호스트 이름(서비스 이름)입니다.
    • 볼륨 (저장소):
      • 호스트의 ./data/webui를 컨테이너의 /app/backend/data에 마운트합니다.
      • 목적: 사용자의 채팅 기록, 설정, 로그인 정보 등을 영구적으로 저장합니다.
    • 의존성:
      • depends_on: - ollama: ollama 컨테이너가 먼저 실행된 후에 open-webui 컨테이너가 실행되도록 순서를 보장합니다.
  • Llama 3 
    • Llama 3는 메타(Meta)에서 개발한 최신 오픈소스 대규모 언어 모델(LLM) 이다. 
    • 이전 모델인 Llama 2보다 성능이 크게 향상되었으며, 다양한 크기의 모델로 제공되어 활용 범위가 넓다. 
    • 활용 분야 
      • 챗봇: 고객 서비스, 교육, 엔터테인먼트 등 다양한 분야에서 자연스러운 대화가 가능한 챗봇 개발에 활용될 수 있습니다.
      • 콘텐츠 생성: 기사 작성, 소설 창작, 코드 생성, 번역 등 다양한 종류의 콘텐츠를 생성하는 데 사용될 수 있습니다.
      • 검색 및 요약: 방대한 정보에서 필요한 정보를 빠르게 찾고 요약하는 데 활용될 수 있습니다.

Podman Compose로 Ollama 설치 하기 

사전 준비 사항 

  • podman 과 podman compose 가 설치 되어 있지 않다면 별도로 설치 한다. 
  • Rocky 에서는 기본 설치가 되어있다. 
  • 설치 환경 구성 

 

[root@rocky9:~]$ podman --version
podman version 5.4.0
[root@rocky9:~]$ podman compose --version
>>>> Executing external compose provider "/usr/local/bin/podman-compose". Please see podman-compose(1) for how to disable this message. <<<<
 
podman-compose version 1.5.0
podman version 5.4.0
[root@rocky9:~]$ cat /etc/redhat-release
Rocky Linux release 9.6 (Blue Onyx)

 

 

Ollama 설치 계정 생성 및 docker-compose.yml 작성 

  • 설치할 계정 및 디렉토리 생성 
adduser -d /nvme/ollama ollama
su - ollama 
mkdir ai-ollama
cd ai-ollama/

 

[root@rocky9:~]$ adduser -d /nvme/ollama-docker ollama
[root@rocky9:~]$ passwd ollama
Changing password for user ollama.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
[root@rocky9:~]$ su - ollama
[ollama@rocky9:~]$ mkdir ai-ollama
[ollama@rocky9:~]$ cd ai-ollama/
[ollama@rocky9:~/ai-ollama]$

 

  • docker-compose.yml 
version: '3.8'

services:
  # [Backend] Ollama 서비스
  ollama:
    image: docker.io/ollama/ollama:latest
    container_name: ollama
    ports:
      - "11434:11434"
    volumes:
      - ./data/ollama:/root/.ollama  # 모델 데이터 영구 저장
    # GPU 사용 시 아래 devices 주석 해제 (CDI 설정 필수)
    # devices:
    #   - nvidia.com/gpu=all
    security_opt:
      - label=disable  # SELinux 권한 문제 방지
    restart: always

  # [Frontend] Open WebUI (ChatGPT 유사 화면)
  open-webui:
    image: ghcr.io/open-webui/open-webui:main
    container_name: open-webui
    ports:
      - "3000:8080"  # 3000번 포트로 접속
    environment:
      - OLLAMA_BASE_URL=http://ollama:11434
    volumes:
      - ./data/webui:/app/backend/data
    depends_on:
      - ollama
    security_opt:
      - label=disable
    restart: always

 

Ollama 설치 

  • podman 으로 설치 하기 
podman compose up -d
  • Open WebUI 접속 
  • http://IP:3000/
    • 접속 해서 관리자 계정을 생성한다. 

 

 

  • 설치 하고 웹에 접속 하면 바로 사용을 할수가 없다 . 
  • llama3 모델을 설치 해야 비로소 사용이 가능 하다. 
# ollama 컨테이너 안에 명령을 내려서 'llama3' 모델을 다운로드
podman exec -it ollama ollama run llama3
  • llama3 를 설치 하고 난후 설치한 모델을 선택하면 GPT 처럼 채팅이 가능 하다
  • 테스트로  BTS 에 대해 질문을 해보았다... 

  • 한글로 번역해달라고 해봤습니다... ㅎ

 

다른 모델도 사용 할수 있다고하니... 이것도 해봐야 겠습니다. 

 

  • Google Gemma (젬마): 구글이 만든 오픈 모델 (Apache 2.0)
  • Mistral (미스트랄): 프랑스 기업이 만든 고성능 모델 (Apache 2.0)

 

728x90
반응형
728x90
반응형

0.소프트웨어 라이선스 등급 총정리

구분 1. 퍼미시브 (Permissive) 2. 약한 카피레프트 (Weak) 3. 강한 카피레프트 (Strong) 4. 상용/개인무료 (Proprietary)
대표 라이선스 MIT, Apache 2.0, BSD, ISC LGPL, MPL, EPL, MS-PL GPL (v2, v3), AGPL Freeware(Personal), Shareware
안전 등급 🟢 매우 안전 🟢 안전 (주의 필요) 🟡 내부 사용만 안전  기업 사용 금지
대표 SW VS Code, React, Tabby, Kafka Firefox, Chrome, ScreenToGif Linux, Git, mRemoteNG, Wireshark 알집/알약, TeamViewer, AnyDesk
단순 설치/사용  가능  가능  가능  불법 (구매 필수)
사내 업무용 (아무 제약 없음) (아무 제약 없음) (내부 사용은 공개 의무 X) (적발 시 합의금/구매 청구)
수정 후 배포  가능 ⚠️ 조건부 가능  매우 위험  불가
(제품 납품) (소스 공개 의무 없음) (수정한 파일만 소스 공개) (전체 소스 공개 의무 발생) (재배포 계약 없으면 불가)
핵심 요약 "출처만 적고 맘대로 쓰세요" "사용은 OK, 고친 파일만 공개해요" "혼자 쓰면 OK, 남 주면 다 공개" "개인은 무료, 기업은 돈 내세요"

1. 들어가며

매년 돌아오는 소프트웨어 라이선스 감사(Audit)와 보안 점검. "무료 다운로드"라고 적혀 있어서 설치했다가 회사에 수백만 원의 청구서가 날아오거나, 보안 위규로 지적받는 일이 빈번합니다.

최근 라이선스 정책이 바뀐 주요 소프트웨어(VMware 등)와 기업에서 안전하게 사용할 수 있는 대체재들을 정리했습니다. 이 글 하나로 팀원들의 PC를 깔끔하게 세팅해 보세요.

 

2. 가상화 (Virtualization) & 컨테이너

🔴 VMware Workstation / Fusion

  • 상태: 무료 (조건부)
  • 핵심 변경(2024.11.11): 상업용(Commercial Use)도 전면 무료화되었습니다.
  • 주의사항:
    • 구버전(v15 등) 삭제 필수: 보안 취약점 및 라이선스 키 입력 방식인 구버전은 불법/보안 위규입니다.
    • 최신 버전(v17 이상/25h) 설치: 최신 버전만 무료 라이선스(Free for Commercial Use)가 적용됩니다.
    • 기술 지원 없음: 무료인 대신 공식 기술 지원은 제공되지 않습니다.

🔴 VirtualBox

  • 상태: 부분 무료 (함정 주의)
  • 본체: 무료 (GPL v2).
  • 확장팩(Extension Pack): 유료 (매우 비쌈). 설치 시 기업은 라이선스 위반입니다.
  • 가이드: 설치 시 확장팩은 절대 설치하지 말고, 기본 패키지만 사용하세요. (기본 기능으로도 리눅스 설치 충분함)

🔴 Docker Desktop

  • 상태: 유료 (대기업 기준)
  • 기준: 직원 250명 이상 or 매출 1,000만 달러 이상 기업은 유료 구독 필수.
  • 대안 (추천): WSL2 + Docker Engine (Ubuntu)
    • 윈도우의 WSL2에 우분투를 설치하고, 그 안에 도커 엔진을 직접 깔면 100% 무료입니다. (성능도 더 빠름)

3. 터미널 접속 (SSH Client)

🔴 SecureCRT / Xshell

  • 상태: 유료
  • 가이드: 회사에서 라이선스를 사주지 않는다면 삭제해야 합니다.

✅ 추천 대체재 (무료)

  1. Tabby (1순위 추천): UI가 세련되고 SFTP(파일 전송) 기능이 내장되어 있습니다. SecureCRT의 훌륭한 대체재입니다.
  2. mRemoteNG: 수십 대의 서버를 폴더 트리 구조로 관리해야 한다면 가장 좋습니다. (GPL v2 완전 무료)
  3. Windows Terminal: MS 공식 오픈소스. 가장 가볍고 안전합니다. (단, 기능은 심플함)
  4. Tera Term: UI는 투박하지만, 'Broadcast Command'(동시 입력) 기능이 필요하다면 추천합니다.
  • 주의: Termius는 클라우드 동기화 보안 이슈로 기업 사용 비추천.

4. API 테스트 & 개발 도구

🔴 Postman

  • 상태: 라이선스 무료 / 보안 위험
  • 이슈: 라이선스 비용 문제는 없으나, 최신 버전이 클라우드 강제 동기화를 요구하여 사내 데이터 유출 우려로 금지하는 기업이 많습니다.

✅ 추천 대체재

  1. Insomnia: 'Scratch Pad' 모드를 통해 로컬 저장만 하도록 설정 가능합니다. Postman과 사용법이 가장 유사합니다.
  2. Thunder Client: VS Code 확장 프로그램입니다. 별도 설치 없이 가볍게 쓰기 좋습니다.

5. 유틸리티 (압축, 편집기)

🔴 알툴즈 (알집, 알약 등)

  • 상태: 유료 (기업 절대 사용 금지)
  • 가이드: 기업에서는 무조건 유료입니다. 감사 적발 1순위이므로 즉시 삭제하세요.

✅ 추천 대체재

  • 반디집 (Standard): 기업 무료입니다. 광고가 한 줄 뜨지만 성능과 라이선스 모두 안전합니다.
  • 7-Zip: UI는 예쁘지 않지만 완전 무료 오픈소스입니다.

🔴 편집기 (EditPlus, UltraEdit, AcroEdit)

  • 상태: 대부분 유료이거나 업데이트 중단.
  • 대안: VS Code (Visual Studio Code) 하나면 충분합니다. (Notepad++ 도 안전)
728x90
반응형
728x90
반응형

[Podman] MariaDB Docker Compose 설치 방법

최근 리눅스 환경(특히 RHEL, Rocky, 최신 Ubuntu 등)에서 Docker 대신 Podman을 사용하여 컨테이너를 관리하는 경우가 많아졌습니다. Podman은 데몬 없이 작동하고 Rootless(관리자 권한 없이 실행) 모드를 지원하여 보안상 이점이 크지만, Docker와 미세하게 다른 설정 때문에 당황스러운 에러를 겪기도 합니다.

오늘은 docker-compose.yml을 이용해 MariaDB를 설치하는 과정에 대해 공유 합니다. 

1. docker-compose.yml 작성

먼저 MariaDB 11.3 버전을 설치하기 위해 구성 파일을 작성합니다. Podman 환경이라도 파일명은 docker-compose.yml을 그대로 사용하면 podman-compose 명령어가 자동으로 인식합니다.

 

파일명: docker-compose.yml

version: "3.8"

services:
  mariadb:
    image: docker.io/library/mariadb:11.3
    container_name: mariadb
    restart: always
    ports:
      - "3306:3306"
    environment:
      MARIADB_ROOT_PASSWORD: rootpassword
      MARIADB_DATABASE: mydb
      MARIADB_USER: myuser
      MARIADB_PASSWORD: mypassword
    volumes:
      - mariadb_data:/var/lib/mysql
    command:
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci

volumes:
  mariadb_data:

 

Mariadb 실행 

#설치 및 기동 
podman  compose up 

#background 실행 
podman  compose up -d 

#Mariadb 기동 상태 확인 
podman  compose ps 

#종료
podman  compose down​

 

[mig-db@rocky9:~/mariadb]$ podman  compose up
>>>> Executing external compose provider "/usr/local/bin/podman-compose". Please see podman-compose(1) for how to disable this message. <<<<

0432514b156c83332ceef9385ce6cfbe7c0192c9cbdb5e9f5dd22fe9cc1b252f
ffe11f79561b93175d00b04ecb5f3d762143a75a1a723b88d92de704fbe1a0e2
[mariadb] | 2026-01-23 02:22:56+00:00 [Note] [Entrypoint]: Entrypoint script for MariaDB Server 1:11.3.2+maria~ubu2204 started.
[mariadb] | 2026-01-23 02:22:56+00:00 [Warn] [Entrypoint]: /sys/fs/cgroup///memory.pressure not writable, functionality unavailable to MariaDB
[mariadb] | 2026-01-23 02:22:56+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
[mariadb] | 2026-01-23 02:22:56+00:00 [Note] [Entrypoint]: Entrypoint script for MariaDB Server 1:11.3.2+maria~ubu2204 started.
[mariadb] | 2026-01-23 02:22:56+00:00 [Note] [Entrypoint]: MariaDB upgrade not required
[mariadb] | 2026-01-23  2:22:56 0 [Note] Starting MariaDB 11.3.2-MariaDB-1:11.3.2+maria~ubu2204 source revision 068a6819eb63bcb01fdfa037c9bf3bf63c33ee42 as process 1
[mariadb] | 2026-01-23  2:22:56 0 [Note] InnoDB: Compressed tables use zlib 1.2.11
[mariadb] | 2026-01-23  2:22:56 0 [Note] InnoDB: Number of transaction pools: 1
[mariadb] | 2026-01-23  2:22:56 0 [Note] InnoDB: Using crc32 + pclmulqdq instructions
[mariadb] | 2026-01-23  2:22:56 0 [Note] mariadbd: O_TMPFILE is not supported on /tmp (disabling future attempts)
[mariadb] | 2026-01-23  2:22:56 0 [Note] InnoDB: Initializing buffer pool, total size = 128.000MiB, chunk size = 2.000MiB
[mariadb] | 2026-01-23  2:22:56 0 [Note] InnoDB: Completed initialization of buffer pool
[mariadb] | 2026-01-23  2:22:56 0 [Note] InnoDB: File system buffers for log disabled (block size=4096 bytes)
[mariadb] | 2026-01-23  2:22:56 0 [Note] InnoDB: End of log at LSN=47661
[mariadb] | 2026-01-23  2:22:57 0 [Note] InnoDB: Opened 3 undo tablespaces
[mariadb] | 2026-01-23  2:22:57 0 [Note] InnoDB: 128 rollback segments in 3 undo tablespaces are active.
[mariadb] | 2026-01-23  2:22:57 0 [Note] InnoDB: Setting file './ibtmp1' size to 12.000MiB. Physically writing the file full; Please wait ...
[mariadb] | 2026-01-23  2:22:57 0 [Note] InnoDB: File './ibtmp1' size is now 12.000MiB.
[mariadb] | 2026-01-23  2:22:57 0 [Note] InnoDB: log sequence number 47661; transaction id 14
[mariadb] | 2026-01-23  2:22:57 0 [Note] Plugin 'FEEDBACK' is disabled.
[mariadb] | 2026-01-23  2:22:57 0 [Note] Plugin 'wsrep-provider' is disabled.
[mariadb] | 2026-01-23  2:22:57 0 [Note] InnoDB: Loading buffer pool(s) from /var/lib/mysql/ib_buffer_pool
[mariadb] | 2026-01-23  2:22:57 0 [Note] Server socket created on IP: '0.0.0.0'.
[mariadb] | 2026-01-23  2:22:57 0 [Note] Server socket created on IP: '::'.
[mariadb] | 2026-01-23  2:22:57 0 [Note] mariadbd: Event Scheduler: Loaded 0 events
[mariadb] | 2026-01-23  2:22:57 0 [Note] InnoDB: Buffer pool(s) load completed at 260123  2:22:57
[mariadb] | 2026-01-23  2:22:57 0 [Note] mariadbd: ready for connections.
[mariadb] | Version: '11.3.2-MariaDB-1:11.3.2+maria~ubu2204'  socket: '/run/mysqld/mysqld.sock'  port: 3306  mariadb.org binary distribution
^C[mig-db@rocky9:~/mariadb]$ [mariadb] | 2026-01-23  2:23:28 0 [Note] mariadbd (initiated by: unknown): Normal shutdown
[mariadb] | 2026-01-23  2:23:28 0 [Note] InnoDB: FTS optimize thread exiting.
[mariadb] | 2026-01-23  2:23:28 0 [Note] InnoDB: Starting shutdown...
[mariadb] | 2026-01-23  2:23:28 0 [Note] InnoDB: Dumping buffer pool(s) to /var/lib/mysql/ib_buffer_pool
[mariadb] | 2026-01-23  2:23:28 0 [Note] InnoDB: Buffer pool(s) dump completed at 260123  2:23:28
[mariadb] | 2026-01-23  2:23:28 0 [Note] InnoDB: Removed temporary tablespace data file: "./ibtmp1"
[mariadb] | 2026-01-23  2:23:28 0 [Note] InnoDB: Shutdown completed; log sequence number 47661; transaction id 15
[mariadb] | 2026-01-23  2:23:28 0 [Note] mariadbd: Shutdown complete
[mariadb] | 
mariadb
0432514b156c83332ceef9385ce6cfbe7c0192c9cbdb5e9f5dd22fe9cc1b252f
mariadb_default

Mariadb 접속 

podman exec -it mariadb mariadb -u root -p
# Password 입력 프롬프트가 뜨면 설정한 비밀번호(rootpassword) 입력
# docker-compose.yml 에 작성된 비밀번호를 입력한다.

 

실습

# 1.'mariadb'는 접속 :  docker-compose에서 정한 컨테이너 이름입니다.
podman exec -it mariadb mariadb -u root -p

# 2. docker-compose 설정 파일에서 만든 mydb 데이터베이스로 이동
USE mydb;

#3. 테이블 생성 
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100)
);

#4. 데이터 입력 (한글 테스트)
INSERT INTO users (username, email) VALUES ('홍길동', 'hong@test.com');
INSERT INTO users (username, email) VALUES ('Alice', 'alice@test.com');

#5. 데이터 조회
SELECT * FROM users;

 

 

DBeaver 연결 설정 방법 

 

문제발생 해결 방법

작성한 파일을 실행하기 위해 터미널에 podman-compose up -d를 입력했는데, 컨테이너가 뜨지 않고 아래와 같은 에러 로그가 출력이 됨.

[에러 메시지] Error: unable to start container ... : did not receive systemd slice as cgroup parent when using systemd to manage cgroups: invalid argument

 

원인 분석

이 에러는 Podman(Rootless 모드)이 시스템의 systemd와 상호작용할 때 Cgroup(리소스 관리) 설정이 충돌하여 발생하는 문제로 , 일반 사용자 권한으로 실행 중인데 시스템 관리 영역인 systemd cgroup에 접근하려다 거절당한 것입니다.

이때 sudo를 붙여서 실행하면 해결되긴 하지만, 그렇게 되면 생성되는 DB 파일들의 소유권이 root가 되어버립니다. 나중에 파일 이동이나 백업 시 Permission Denied로 고생할 수 있으므로 권장하지 않습니다.

해결 방법: containers.conf 설정 (권장)

  • 가장 깔끔한 해결책은 Podman이 시스템의 systemd 대신 자체적인 cgroupfs를 사용하도록 설정을 변경하는 것입니다. 이 설정은 현재 로그인한 사용자 계정에만 적용된다. 
mkdir -p ~/.config/containers
vi ~/.config/containers/containers.conf

 

  • ~/.config/containers/containers.conf 파일에 아래 내용 작성 
[engine]
cgroup_manager = "cgroupfs"
events_logger = "file"

 

 

잠깐! 상식

MariaDB는 MySQL의 소스 코드를 기반으로 만들어진(Fork된) 파생 버전입니다. 그래서 명령어, 포트, 파일 구조가 거의 똑같습니다.

사용자 입장에서 중요한 3가지 핵심 관계를 정리해 드릴게요.

왜 갈라졌나요? (탄생 비화)

  • MySQL의 창시자: 몬티 와이드니어스(Monty Widenius)라는 개발자가 만들었습니다. (딸 이름이 'My'라서 MySQL입니다.)
  • 오라클 인수: MySQL이 썬 마이크로시스템즈를 거쳐 거대 기업인 오라클(Oracle) 로 넘어가게 되었습니다.
  • MariaDB 탄생: 몬티는 오라클이 MySQL을 상업적으로 폐쇄할까 봐 걱정하여, "영원히 무료인 오픈소스"를 지키기 위해 MySQL 소스 코드를 들고 나와서 MariaDB를 새로 만들었습니다. (둘째 딸 이름이 'Maria'라서 MariaDB입니다.)

 

 

728x90
반응형

'05.DB > Mysql' 카테고리의 다른 글

Mysql 실행 SQL 확인 방법  (0) 2023.03.07
[Mysql] 유저 생성 /DB생성/권한부여  (0) 2022.05.24
[Mysql] DBeaver Mysql 접속  (0) 2022.04.19
728x90
반응형

Jenkins Docker 설치 가이드 (Rocky9, jen 계정 기준)

1. 사전 준비

1-1. jen 계정 확인

sudo useradd -m jen
sudo passwd jen
sudo usermod -aG docker jen
  • Docker 명령어를 비루트 계정(jen)에서 실행 가능하도록 docker 그룹에 추가합니다.

1-2. 디렉토리 생성

sudo mkdir -p /hdd/jen/home
sudo chown -R jen:jen /hdd/jen
sudo chmod -R 750 /hdd/jen/home
  • /hdd/jen/home : Jenkins 홈 디렉토리 (데이터 영속화)
  • SELinux 환경에서는 :Z 옵션 사용

2. Docker / Docker Compose 설치 확인

docker --version
docker compose version
  • 설치되지 않았다면:
sudo dnf install -y dnf-plugins-core
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
sudo systemctl enable --now docker

3. Docker Compose 파일 생성

cd /hdd/jen
vi docker-compose.yml
version: '3.8'
services:
  jenkins:
    image: jenkins/jenkins:lts
    container_name: jenkins
    restart: always
    user: root                    # 일부 플러그인 설치를 위해 root 필요
    ports:
      - "8080:8080"               # 웹 UI
      - "50000:50000"             # agent 연결
    volumes:
      - /hdd/jen/home:/var/jenkins_home:Z
    shm_size: '512m'

설명

  • :Z → SELinux 컨텍스트 적용
  • 8080 → 브라우저 접속용
  • 50000 → Jenkins agent 연결용
  • shm_size → 빌드 시 메모리 공유 공간 확보

4. Jenkins 실행

cd /hdd/jen
docker compose up -d
  • 컨테이너 정상 실행 확인:
docker ps

5. 초기 설정

  1. 브라우저에서 접속:
http://서버IP:8080
  1. 초기 관리자 비밀번호 확인
docker exec -it jenkins cat /var/jenkins_home/secrets/initialAdminPassword
  1. Jenkins 웹 UI에서 초기 비밀번호 입력 후

    • 추천 플러그인 설치
    • 관리자 계정 생성

6. 권한 및 SELinux 확인

sudo chown -R jen:jen /hdd/jen/home
sudo chmod -R 750 /hdd/jen/home
  • SELinux 활성화 시 :Z 옵션 필요

7. GitLab 연동 (선택 사항)

  1. Jenkins 플러그인 설치

    • GitLab Plugin
    • Git Plugin
  2. Jenkins에서 GitLab 서버 등록

    • URL: http://<GitLab 서버IP>:<포트>
    • Access Token 생성 → Jenkins Credential 등록
  3. Job 생성 → GitLab 프로젝트 빌드 가능


8. 컨테이너 관리

  • Jenkins 재시작
docker compose restart
  • 컨테이너 중지
docker compose down
  • 로그 확인
docker compose logs -f

참고 사항

  • /hdd/jen/home 경로는 Jenkins 데이터 전용. 컨테이너 삭제해도 데이터 보존됨
  • 호스트 방화벽에서 8080/50000 포트 열어야 외부 접근 가능
  • 운영 환경이면 SSL/HTTPS 적용 가능 (리버스 프록시 추천)
728x90
반응형

'04.DevTools' 카테고리의 다른 글

[SVN] SVN 사용법  (0) 2024.11.14
[IntelliJ] Intellij Gitlab 연동  (0) 2024.08.16
[Nexus]Centos7 nexus 설치 및 이클립스 연동  (0) 2022.04.21
728x90
반응형

이 문서는 Rocky Linux 9 환경에서 Harbor를 설치하고 설정하는 과정을 단계별로 정리한 가이드입니다. Docker 기반 설치 환경을 기준으로 합니다.


1. 사전 준비

1.1 서버 환경

  • OS: Rocky Linux 9
  • 최소 사양: CPU 2코어, RAM 4GB 이상, 디스크 40GB 이상

1.2 필수 패키지 설치

sudo dnf -y update
sudo dnf -y install curl wget tar dnf-plugins-core

1.3 Docker 설치

# 기존 Podman 또는 Docker 패키지 제거
sudo dnf remove podman-docker podman

# Docker CE 레포 추가
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# Docker CE 설치
sudo dnf -y install docker-ce docker-ce-cli containerd.io

# Docker 서비스 활성화
sudo systemctl enable --now docker

# 버전 확인
docker --version
docker-compose version

참고: Podman 환경에서는 Harbor install.sh가 Docker 버전 체크로 실패할 수 있으므로, 운영 환경에서는 Docker CE 설치를 권장합니다.

1.4 Docker Compose 설치

sudo curl -L "https://github.com/docker/compose/releases/download/2.29.2/docker-compose-linux-x86_64" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

2. Harbor 전용 계정 및 디렉토리 설정

2.1 Harbor 전용 계정 생성

sudo useradd -m -s /bin/bash harbor
sudo passwd harbor

2.2 Harbor 디렉토리 이름 변경 및 권한 설정

cd /opt
sudo mv harbor myharbor
sudo chown -R harbor:harbor myharbor

3. Harbor 다운로드 및 설정

3.1 Harbor 다운로드

wget https://github.com/goharbor/harbor/releases/download/v2.11.0/harbor-online-installer-v2.11.0.tgz
tar xvf harbor-online-installer-v2.11.0.tgz
cd harbor

3.2 설정 파일 준비

cp harbor.yml.tmpl harbor.yml
nano harbor.yml

harbor.yml 예시

hostname: harbor.example.com
http:
  port: 8080
harbor_admin_password: Harbor12345
data_volume: /home/harbor/data
  • hostname: Harbor 접속할 도메인 또는 IP
  • port: HTTP 포트 (운영 환경에서는 HTTPS 권장)
  • data_volume: Harbor 이미지 저장 위치, harbor 계정이 접근 가능해야 함

4. Harbor 설치

sudo ./install.sh
  • 설치 완료 후 컨테이너 확인:
docker ps
  • 주요 컨테이너: harbor-core, harbor-db, harbor-portal, harbor-registry

5. 웹 UI 접속

  • 브라우저 접속: http://harbor.example.com:8080
  • 기본 계정:
    • ID: admin
    • PW: Harbor12345

6. Docker 클라이언트에서 Harbor 로그인

docker login harbor.example.com:8080

7. 운영 환경 권장 설정

  • HTTPS 적용: 운영 환경에서는 Let’s Encrypt 등 SSL 인증서 적용 필수
  • 방화벽 설정:
sudo firewall-cmd --add-port=8080/tcp --permanent
sudo firewall-cmd --reload
  • 데이터 저장소 용량 충분히 확보(/home/harbor/data)

8. 참고 사항

  • 테스트/개발 환경: HTTP, Docker CE 또는 Podman + Podman Compose 가능
  • 운영 환경: HTTPS 필수, Docker CE 설치 권장
  • 설치 시 Harbor install.sh에서 Docker 버전 체크 실패 시 Podman 사용 환경에서는 install.sh 수동 실행 또는 우회 필요
728x90
반응형
728x90
반응형

파이썬 테스트  Frame Work 종류와 장단점 및 간단한 사용 방법에 대해 설명 합니다. 

 

파이썬 테스트 프레임워크 (Python Test FrameWork)

  • 파이썬 에서 테스트 자동화를 위해 사용하는 테스트 Frame work 는 아래 리스트와 같다 
  • 일반적으로 가장 널리 사용 하는 pytestUnittest 기능과 간단한 동작을 할수 있는 예제를 다루겠습니다. 
프레임워크 주요 특징 사용 대상
Pytest 간결한 assert, 강력한 Fixture, 풍부한 플러그인 생태계
모든 파이썬 프로젝트 (가장 강력히 추천)
Unittest 파이썬 표준 라이브러리, 별도 설치 불필요, 객체지향 구조
외부 라이브러리 의존성을 최소화해야 하는 경우, 레거시 프로젝트
robot framework 키워드 기반 테스트
비개발자 친화적, GUI 자동화 + API 테스트 통합 가능
Doctest 문서 내 예제 코드를 테스트로 활용
라이브러리 문서의 예제 코드 검증
Behave BDD(행위 주도 개발) 스타일, 자연어 시나리오
기획자/비개발자와 테스트 시나리오를 공유해야 하는 프로젝트

 

pytest 

 

  • 간결한 문법: assert만 써도 검증 가능
  • 다양한 플러그인: HTML 리포트, 병렬 실행 등
  • pytest.mark로 범위/조건 제어 가능
  • 공식 문서는 아래 사이트에서 확인 할 수 있다.

pytest 프레임워크 구조 

Pytest는 전통적인 단위 테스트 프레임워크와 달리, 명시적인 TestCase 클래스 상속 없이도 테스트를 작성할 수 있게 해줍니다. 핵심 구조는 다음과 같습니다.

  • 테스트 함수 (Test Functions): Pytest는 test_*로 시작하는 모든 함수를 테스트로 인식합니다. 가장 기본적인 테스트 단위이며, 별도의 클래스나 상속 없이도 작동합니다.
  • 테스트 모듈 (Test Modules): test_*로 시작하는 파일(test_example.py, my_module_test.py 등) 내에 있는 테스트 함수들을 자동으로 찾아서 실행합니다.
  • 테스트 클래스 (Test Classes): 선택 사항이지만, 여러 테스트 함수를 그룹화하고 싶을 때 Test로 시작하는 클래스 안에 test_로 시작하는 메서드를 정의할 수 있습니다. 다만, unittest.TestCase를 상속받을 필요는 없습니다.
  • 픽스처 (Fixtures): 테스트를 실행하기 전후에 필요한 설정(setup) 및 해제(teardown) 작업을 수행하는 함수입니다. @pytest.fixture 데코레이터를 사용하여 정의하며, 테스트 함수에서 인자로 요청하면 자동으로 주입됩니다. unittest의 setUp/tearDown보다 훨씬 유연하고 강력한 기능을 제공합니다.
  • conftest.py 파일: 여러 테스트 파일에서 공유되는 픽스처나 훅(hook) 함수를 정의하는 데 사용됩니다. 이 파일은 pytest가 테스트를 찾을 때 자동으로 인식하며, 해당 디렉토리 및 하위 디렉토리의 모든 테스트에서 픽스처를 사용할 수 있게 합니다.
  • 플러그인 (Plugins): Pytest는 풍부한 플러그인 생태계를 가지고 있습니다. 코드 커버리지, HTML 리포트 생성, 분산 테스트 실행 등 다양한 기능을 플러그인을 통해 확장할 수 있습니다.

 

pytest 클래스 및 함수 호출 관계 및 순서

  • 함수 기반 테스트 흐름
test_파일.py
   │
   ├── def test_func():
   │       ├── pytest fixture 실행 (선택)
   │       ├── 테스트 실행
   │       └── cleanup 수행

 

  • 클래스 기반 테스트 흐름
TestClass:
    ├── @pytest.fixture(scope="class") → 클래스 전후
    ├── setup_method() → 각 test 함수 전
    ├── test_xxx() → 테스트 함수
    ├── teardown_method() → 각 test 함수 후

 

  • Pytest는 테스트를 발견하고 실행하는 과정에서 unittest와는 다른 접근 방식을 취합니다. setUp/tearDown 대신 픽스처를 통해 초기화 및 정리 작업을 관리하며, 이는 훨씬 유연한 제어를 가능하게 합니다.
  • 테스트 발견 (Test Discovery)
    • Pytest는 기본적으로 다음 규칙에 따라 테스트를 자동으로 찾아냅니다.
      • test_*.py 또는 *_test.py 패턴을 따르는 파일.
      • 이러한 파일 내에서 test_로 시작하는 함수.
      • Test로 시작하는 클래스 내에서 test_로 시작하는 메서드 (상속 불필요).
  • 실행 순서 및 픽스처 호출
  • Pytest는 테스트를 실행할 때, 각 테스트 함수가 필요로 하는 픽스처를 자동으로 감지하고 주입합니다. 픽스처는 정의된 스코프(scope) 에 따라 호출 시점과 정리 시점이 달라집니다.
  • 픽스처의 스코프는 다음과 같습니다
    • function (기본값): 각 테스트 함수가 실행될 때마다 픽스처가 호출되고, 테스트 함수가 끝난 후에 정리됩니다. (가장 일반적인 setUp/tearDown과 유사)
    • class: 해당 클래스 내의 모든 테스트 메서드가 실행되기 전에 한 번 호출되고, 클래스 내 모든 테스트가 끝난 후에 정리됩니다.
    • module: 해당 모듈 내의 모든 테스트가 실행되기 전에 한 번 호출되고, 모듈 내 모든 테스트가 끝난 후에 정리됩니다.
    • session: 전체 테스트 세션이 시작되기 전에 한 번 호출되고, 모든 테스트가 끝난 후에 정리됩니다. (가장 넓은 스코프)

호출 관계 및 순서 (픽스처 포함):

  1. 테스트 세션 시작: pytest 명령 실행
  2. session 스코프 픽스처 호출: 정의되어 있다면 가장 먼저 호출됩니다.
  3. 각 테스트 모듈 진입:
    • module 스코프 픽스처 호출: 해당 모듈의 테스트가 시작되기 전에 호출됩니다.
    • 각 테스트 클래스 진입 (선택 사항):
      • class 스코프 픽스처 호출: 해당 클래스의 테스트가 시작되기 전에 호출됩니다.
      • 각 test_ 메서드 실행:
        • function 스코프 픽스처 호출: 각 test_ 메서드가 실행되기 전에 호출됩니다.
        • 실제 test_ 메서드 실행: 테스트 로직이 수행됩니다.
        • function 스코프 픽스처 정리: test_ 메서드가 끝난 후에 정리됩니다.
      • class 스코프 픽스처 정리: 해당 클래스의 모든 테스트가 끝난 후에 정리됩니다.
    • module 스코프 픽스처 정리: 해당 모듈의 모든 테스트가 끝난 후에 정리됩니다.
  4. session 스코프 픽스처 정리: 모든 테스트 세션이 끝난 후에 정리됩니다.

이러한 픽스처 메커니즘은 테스트 간의 의존성을 줄이고, 재사용 가능한 설정/해제 코드를 작성하는 데 매우 효과적입니다.

pytest 테스트 사용 예제 

  • pytest test FrameWork 는 파이썬에서 기본 제공 하는 모듈이 아님니다. 
  • pip install pytest 를 통해 pytest 를 설치 합니다. 
pip install pytest
  • pytest_example.py 
import pytest

@pytest.fixture
def sample_data():
    print("\n[SETUP] Fixture 실행")
    return {"a": 1, "b": 2}

def setup_module(module):
    print("\n[SETUP_MODULE] 모듈 레벨 초기화")

def teardown_module(module):
    print("\n[TEARDOWN_MODULE] 모듈 종료 처리")

def setup_function(function):
    print(f"[SETUP_FUNCTION] 함수 {function.__name__} 시작")

def teardown_function(function):
    print(f"[TEARDOWN_FUNCTION] 함수 {function.__name__} 종료")

def test_add(sample_data):
    print("→ 실행: test_add")
    assert sample_data["a"] + sample_data["b"] == 3

def test_sub(sample_data):
    print("→ 실행: test_sub")
    assert sample_data["b"] - sample_data["a"] == 1

 

  • 테스트 결과 
  • -v , -s , --html=report.html 옵션을 통해 테스트 사용법을 익혀 보길 바랍니다. 
    • -v: verbose
    • -s: 표준 출력 표시
    • --html=report.html: HTML 리포트 생성 (pytest-html 필요):
      • pip install pytest-html 

  • pytest pytest_example.py -v -s --html=report.html 실행하면 프로젝트 에 report.html 파일이 생성 된다. 

 

 

pytest 테스트 사용 (conftest.py 적용)

  • conftest.py 설정을 통해 여러 테스트에서 공통으로 사용하는 fixture 를 공유 할수 있도록 케이스를 조금 변경 하겠습니다.
    • conftest.py (샘플데이터를 설정)
import pytest

@pytest.fixture
def sample_data():
    print("\n[SETUP] Fixture 실행")
    return {"a": 1, "b": 2}
  • pytest_example_conftest_test.py (테스트 용 예제)
import pytest

def setup_module(module):
    print("\n[SETUP_MODULE] 모듈 레벨 초기화")

def teardown_module(module):
    print("\n[TEARDOWN_MODULE] 모듈 종료 처리")

def setup_function(function):
    print(f"[SETUP_FUNCTION] 함수 {function.__name__} 시작")

def teardown_function(function):
    print(f"[TEARDOWN_FUNCTION] 함수 {function.__name__} 종료")
    
def test_add(sample_data):
    print("→ 실행: test_add")
    assert sample_data["a"] + sample_data["b"] == 3

def test_sub(sample_data):
    print("→ 실행: test_sub")
    assert sample_data["b"] - sample_data["a"] == 2

 

  • 실행결과
    • conftest.py  에 정의된 샘플데이터를 불러와서 pytest_example_conftest_test.py 에서 테스트슬 수행 하게 된다.
    • 테스트 결과 1건 성공 , 1건 실패로 테스트 출력 결과를 확인 할수 있으며
    • html 옵션을 사용할 경우 html 로 테스트 수행 결과를 보다 가시성 있게 확인이 가능 하다. 
    •  

unittest

 

  • Python 내장 테스트 프레임웍으로 별도 설치는 필요가 없고 파이썬만 설치되어 있으면 바로 사용할 수 있다. 
  • Java의 JUnit과 유사한 구조를 가진다.
  • xUnit 스타일: TestCase 클래스를 상속받아 테스트를 작성하며, assertEqual(), assertTrue() 등 다양한 assert 메서드를 제공합니다.
  • 전통적인 구조: 객체지향 프로그래밍에 익숙한 개발자에게 친숙한 구조를 가집니다.
  • 파이썬 unittest 모듈 공식 문서는 아래 사이트에서 확인 할수 있다. 
 

unittest — Unit testing framework

Source code: Lib/unittest/__init__.py(If you are already familiar with the basic concepts of testing, you might want to skip to the list of assert methods.) The unittest unit testing framework was ...

docs.python.org

Unittest 프레임워크 구조

  • Unittest 에서 주요하게 사용되는 클래스는 다음과 같다. 
    • unittest.TestCase: 테스트의 기본 단위입니다. 각 테스트 케이스는 하나 이상의 테스트 메서드를 포함하며, 이 메서드들은 test_로 시작합니다.
    • unittest.TestSuite: 여러 개의 TestCase나 TestSuite를 묶어서 한꺼번에 실행할 수 있게 해주는 클래스입니다.
    • unittest.TestLoader: TestCase 클래스에서 테스트 메서드를 자동으로 찾아서 TestSuite 객체로 만들어 주는 역할을 합니다.
    • unittest.TestRunner: TestSuite를 실행하고 결과를 보여주는 클래스입니다. 일반적으로 unittest.main() 함수가 이 역할을 대신 수행합니다.

Unittest 클래스 및 함수 호출 관계 및 순서

  • 호출 되는 흐름은 아래 그림과 같다.

 

  • 클래스 단위: TestSuite가 테스트를 시작하면, 각 TestCase 클래스에 대해 다음 메서드가 호출됩니다.
    • setUpClass(): 테스트 클래스 내의 모든 테스트 메서드가 실행되기 전에 단 한 번만 호출됩니다. 클래스 전체에 필요한 초기화 작업을 수행합니다.
    • tearDownClass(): 테스트 클래스 내의 모든 테스트 메서드가 실행된 후에 단 한 번만 호출됩니다. 클래스 단위의 정리 작업을 수행합니다.
  • 테스트 메서드 단위: TestSuite는 각 TestCase 클래스 내의 test_로 시작하는 각 테스트 메서드에 대해 다음 순서대로 메서드를 호출합니다.
    • setUp(): 각 테스트 메서드가 실행되기 전에 호출됩니다. 각 테스트가 독립적으로 동작하도록 초기화하는 역할을 합니다.
    • test_...(): 실제 테스트 로직이 담긴 메서드가 실행됩니다.
    • tearDown(): 각 테스트 메서드가 실행된 후에 호출됩니다. setUp()에서 할당된 리소스를 해제하는 정리 작업을 수행합니다.

 

Unittest 테스트 예제 

import unittest

class MyTest(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        print("setUpClass")

    def setUp(self):
        print("  setUp")

    def test_add(self):
        print("    test_add")
        self.assertEqual(1 + 1, 2)

    def test_sub(self):
        print("    test_sub")
        self.assertEqual(5 - 3, 2)

    def tearDown(self):
        print("  tearDown")

    @classmethod
    def tearDownClass(cls):
        print("tearDownClass")

if __name__ == '__main__':
    unittest.main()

 

 

 

  • 순서 호출 메서드 설명
1 setUpClass() 클래스 전체 테스트 전에 한 번 실행
2 setUp() 각 테스트 메서드 전에 매번 실행
3 test_*() 실제 테스트 실행
4 tearDown() 각 테스트 메서드 후에 매번 실행
5 tearDownClass() 클래스 테스트 후 한 번 실행
728x90
반응형
728x90
반응형
  • Gitlab 에서 보안 이슈로 버전 업그레이드가 필요한 상황에서 Gitlab 버전을 업그레이하는 방법에 대해 설명 합니다. 

현재 설치 버전 gitlab 정보 확인 

  • gitlab-rake gitlab:env:info 명령을 통해 확인 하거나 
  • gitlab 에 접속 해서 직접 설치 정보를 확인 하는 방법이 있습니다. 
 gitlab-rake gitlab:env:info
$ gitlab-rake gitlab:env:info

System information
System:
Current User:   git
Using RVM:      no
Ruby Version:   2.7.5p203
Gem Version:    3.1.4
Bundler Version:2.3.15
Rake Version:   13.0.6
Redis Version:  6.2.7
Sidekiq Version:6.4.0
Go Version:     unknown

GitLab information
Version:        15.1.2
Revision:       ea7455c8292
Directory:      /opt/gitlab/embedded/service/gitlab-rails
DB Adapter:     PostgreSQL
DB Version:     13.6
URL:            http://192.112.1.62:6060
HTTP Clone URL: http://1 192.112.1.62 :6060/some-group/some-project.git
SSH Clone URL:  git@1 192.112.1.62:some-group/some-project.git
Using LDAP:     no
Using Omniauth: yes
Omniauth Providers: 

GitLab Shell
Version:        14.7.4
Repository storage paths:
- default:      /var/opt/gitlab/git-data/repositories
GitLab Shell path:              /opt/gitlab/embedded/service/gitlab-shell

 

  • 업그레이드를 하기 위해서는 순차적으로 버전을 업그레이드 해야 합니다.
  • 15.x->18.x 버전으로 바로  최신 버전으로 업그레이드를 하면 안됩니다. 
  • 15.1.x -> 15.4.6 -> 15.11.13 -> 16.0.8 -> 16.3.7 -> 16.7.x -> 최신 16.x -0 ->17.x ->18.x 버전으로 단계적으로 업그레이드 단계를 수행 합니다. 

 

GitLab 백업 하기 

  • 업그레이드가 예기치 않은 이유로 실패 할수 있기때문에  버전을 업그레이드 하기 위해서는 반드시 백업을 수행 해야 합니다. 
  • gitlab-backup create  수행 하면 /var/opt/gitlab/backups/  디레톡리에 1753833159_2025_07_30_15.1.2_gitlab_backup.tar 형식의 압축 파일이 생성 됩니다. 
  • 백업 이후 설정 파일도 백업합니다. 
# GitLab 전체 백업 명령어 실행
sudo gitlab-backup create
sudo cp /etc/gitlab/gitlab.rb /etc/gitlab/gitlab.rb.bak
sudo cp /etc/gitlab/gitlab-secrets.json /etc/gitlab/gitlab-secrets.json.bak

 

$ gitlab-backup create
2025-07-30 08:52:39 +0900 -- Dumping database ... 
Dumping PostgreSQL database gitlabhq_production ... [DONE]
2025-07-30 08:52:54 +0900 -- Dumping database ... done
2025-07-30 08:52:54 +0900 -- Dumping repositories ... 
.................................
.................
2025-07-30 08:54:53 +0900 -- Warning: Your gitlab.rb and gitlab-secrets.json files contain sensitive data 
and are not included in this backup. You will need these files to restore a backup.
Please back them up manually.
2025-07-30 08:54:53 +0900 -- Backup 1753833159_2025_07_30_15.1.2 is done.
$ ls -lrt
⑷ 1217100
-rw------- 1 git git 1246310400  7” 30 08:54 1753833159_2025_07_30_15.1.2_gitlab_backup.tar
 
$ ls -al
⑷ 312
-rw-------. 1 root root  19200  6” 25 16:32 gitlab-secrets.json
-rw-------  1 root root  19200  7” 30 08:55 gitlab-secrets.json.bak
-rw-------  1 root root 137497  6” 25 16:31 gitlab.rb
-rw-------  1 root root 137497  7” 30 08:55 gitlab.rb.bak
drwxr-xr-x. 2 root root    155  9”  2  2024 ssl
drwxr-xr-x. 2 root root      6  7”  6  2022 trusted-certs

 

 

Gitlab 업그레이드 

  • 업그레이드 할 gitlab 버전을 확인 합니다. 
 yum list --showduplicates gitlab-ce

 

  • 설치 버전 선택시 gitlab-ce-[버전정보] 형식으로 패키지를 설치 하므로  설치할 버전을 정확하게 입력하고 설치 합니다. 
sudo yum install -y gitlab-ce-15.4.6-ce.0.el7

 

  • 업그레이드 버전이 설치가 완료되면 reconfigure 명령을 통해 변경된 설정을 Gitlab 에 적용 합니다. 
  • gitlab-ctl reconfigure 명령 수행 중에는 db(PostgreSQL ) 의 데이터 마이그레이션 작업 및 내부 업그레이드 작업들이 이루어 집니다. 
  • 정상적으로 작업이 완료 되면  gitlab-ctl start      & gitlab-ctl status 명령을 통해 업그레이드 작업이 정상적으로 완료 되었는지 최종 확인 합니다. 
$ sudo gitlab-ctl  status
run: alertmanager: (pid 15390) 48113s; run: log: (pid 1574) 12270431s
run: gitaly: (pid 15404) 48112s; run: log: (pid 12724) 48707s
run: gitlab-exporter: (pid 15426) 48112s; run: log: (pid 1557) 12270431s
run: gitlab-kas: (pid 15440) 48102s; run: log: (pid 1559) 12270431s
run: gitlab-workhorse: (pid 15454) 48102s; run: log: (pid 1555) 12270431s
run: logrotate: (pid 13090) 1296s; run: log: (pid 12699) 48710s
run: nginx: (pid 15474) 48101s; run: log: (pid 1556) 12270431s
run: node-exporter: (pid 15487) 48100s; run: log: (pid 1554) 12270431s
run: postgres-exporter: (pid 15493) 48100s; run: log: (pid 1549) 12270431s
run: postgresql: (pid 15504) 48099s; run: log: (pid 1550) 12270431s
run: prometheus: (pid 17054) 47458s; run: log: (pid 1558) 12270431s
run: puma: (pid 15815) 48068s; run: log: (pid 1551) 12270431s
run: redis: (pid 15820) 48067s; run: log: (pid 1548) 12270431s
run: redis-exporter: (pid 15827) 48067s; run: log: (pid 1546) 12270431s
run: sidekiq: (pid 15838) 48062s; run: log: (pid 1552) 12270431s

 

 

  • 보다 높은 최신 버전으로 업그레이드 하기 위해서는 단계적으로 상위 버전 gitlab 버전을 설치하는 단계를 반복 합니다. 

버전 업그레이드 정리

#Gitlab 설치 버전 정보 확인 
yum --showduplicates list gitlab-ce
#설정 적용 
gitlab-ctl reconfigure

#Gitlab 재시작 
gitlab-ctl restart

#Gitlab 상태 확인 
gitlab-ctl status

#gitlab 업그레이드 버전 정보 확인 
gitlab-rake gitlab:env:info

 

업그레이드 패스 확인 하기 (참고)

  • 아래 URL 에 접속 하면 버전 업그레이드시 확인해야 할 내용에 대해 세부적으로 자세히 내용을 들여다 볼수 있습니다. 

 

https://gitlab-com.gitlab.io/support/toolbox/upgrade-path/?distro=centos

 

Upgrade Path

 

gitlab-com.gitlab.io

 

 

 

728x90
반응형
728x90
반응형

작업패키지를 (일감) 을 OpenProject 에 일괄 업로드 하는 방법에 대해 알아봅니다. 

공식문서는 아래 링크를 참고 합니다. 

https://www.openproject.org/docs/system-admin-guide/integrations/excel-synchronization/

 

Excel synchronization with OpenProject

Excel synchronization with OpenProject

www.openproject.org

 

작업패키지 일감 일괄 등록 방법

  • OpenProjectExcel 유틸을 이용해서 일괄적으로 일감을 일괄 등록 하는 방법에 대해 설명합니다.

OpenProjectExcel 다운로드

  • 압축해제후 OpenProjectAPI.xlsm 파일을 실행 합니다. 

 

OpenProjectExcel 실행(OpenProjectAPI.xlsm)

  • 콘텐츠 사용 버튼을 클릭합니다. 

  • ctl+b 버튼을 클릭하면 업로드할 프로젝트 설정 정보 창이 오픈된다.
  • URL 텍스트 입력창에 프로젝트 URL 을 입력 하면 Intance URL , Project 항목이 자동 셋팅 된다.
  • API 토큰 정보는 우측 상단 계정설정 -> 액세스 토큰 메뉴를 선택후 접속 토큰을 생성 한다. 



  • OpenProject  프로젝트 정보를 모두 입력 하고 Accept 버튼을 클릭 하면 아래와 같이 컴파일 에러가 발생 한다. 
    • Tested on: Windows 10, Excel 16.0, VBA 7.1 에서 테스트 버전과 호환이 안되는것으로 보임 
    • 테스트한 버전은 Excel 2013 버전 
  • 코드 수정후 비주얼 베이직을 재실행 한다. 
    • "? -> "?" 수정
TextStr = Replace(TextStr, "\u00A1", "?", , , vbBinaryCompare)
TextStr = Replace(TextStr, "\u00A2", "?", , , vbBinaryCompare)

 

 

OpenProjectAPI 작업 패키지 동기화 및 업로드 

  • 다운로드 workpackages 를 누르면 작업패키지 항목이 다운로드 된다.

  • 항목을 추가 하고 싶다면 데이터생성후 Upload/Update 버튼을 클릭 한다.
    • 버전 잠금, ID 값을 미입력 하면 신규 작업패키지가 추가 되고 
    • 내용을 수정 하면 작업패키지가 수정 된다. 

  • 정상 업로드 되면 아래와 같이 Updatestatus 항목의 컬럼 값이 수정 된다. 
    • 수정 사항 발생 시 : Updatestatus -> 200-OK , 버전잠금 -> 숫자 증가.
    • 신규 추가 사항 반영시 : Updatestatus -> 201-Created ,  버전잠금 -> 숫자 1 생성 .

  • OpenProject 접속후 작업패키지를 확인시 추가 및 수정한 작업패키지 내용에 대한 변경 사항이 반영된것을 확인 할수 있다. 

 

작업 패키지 사용자 정의 필드 추가 작업 적용 

  • 업로드할 컬럼 정보(사용자 정의 필드) 를 추가 하고자 할경우 엑셀의 드랍다운 박스를 이용해 추가할 항목을 선택한다. 
  • 컬럼정보는 Attributes 시트에 작성 되어 있다. 

 

 

728x90
반응형

'테스트 > 관리도구' 카테고리의 다른 글

[OpenProject] OpenProject 환경 설정  (0) 2025.05.08
[OpenProject] OpenProject 설치  (0) 2025.04.09
728x90
반응형

OpenProject가 정상 설치되었다면 이제 OpenProject 를 사용하기 위한 기본 사용 환경 설정 방법에 대해 알아본다. 

 

OpenProject 한글 설정 방법

  • Account setting -> Setting ->Language 설정 -> 한국어 변경 

 

OpenProject 프로젝트 생성 

  • 좌측 상단 + 버튼을 클릭해서 프로젝트 관리하기 위한 신규 프로젝트를 생성 할수 있다. 

 

  • 릴리즈 이름으로 프로젝트가 생성 된다. 

  • OpenProject 는 작업 패키지 단위로 일감을 관리 할수 있다. 
  • 작업패키지 매뉴를 클릭해서 해야할 일을 등록 한다. 

  • 등록한 일감은 Gantt 차트 형식으로도 일정 관리를 할수 있다. 
  • 일감의 진행 시작 일자와, 종료일자를 등록 하고 현재 일감 상태를 변경 하면서 일감(작업패키지) 을 관리 한다.

  • 담당자 할당을 위해서는 사용자 등록/관리가 필요하다 . 
  • 사용자 등록 관리 방법에 대해 알아본다.

사용자관리 방법

  • 우측 상단 관리 매뉴를 선택한다.

  • 프로젝트를 관리하기 위한 다양한 기능을 지원한다. 
  • 사용자 및 권환 매뉴를 선택해서 openproject 에서 업무를 수행할 맴버를 추가 하고 관리 권한을 추가 한다. 

 

  • 계정이 생성되면 접속 비빌 번호를 설정 한다. 
  • 다음로그인 암호 변경 적용 체크 박스를 클릭하면 최초 사용자 접속시에 비밀번호 변경을 할수 있닷.

 

  • 사용자가가 접근 가능 한 프로젝트 항목을 선택하고 추가 버튼을 눌러서 역할 및 프로젝트 접근 권한을 부여 한다. 

  • 역할및 권한 메뉴에서는 역할 별로 프로젝트 관리 접근 권한을 설정 할수 있다. 

 

사용자 정의 필드

  • 작업패키지를 생성 하면 기본 제공 하는 필드로 충분히 업무 내용을 구분 할수 있지만 , 사용자 필드를 사용함으로서 
  • 프로젝트를 진행 하기 위해 필요한 항목을 추가 할수 있다. 
  • 관리 -> 사용자 저으이 필드 메뉴을 선택 해서 추가하고자 하는 사용자 정의 컬럼을 추가 한다. 
    • 아래 예시는 회의록 프로젝트에서 사용할 업무 필드에 대하 설정을 예시로 한다. 

  • 추가된 사용자 정의 필드를 사용하기 위해서는  업무 유형에 메뉴에서 추가된 업무 구분 필드를 추가해 주어야 한다. 
    • 관리-> 작업 패키지 -> 유형 이름 선택(Task) -> 양식 구성(탭) 

 

  • 프로젝트로 돌아와 작업패키지에서 컬럼 보기 설정 (톱니바퀴) 을 클릭해서 추가된 사용자 정의 필드를 추가 한다. 
  • 추가된 컬럼을 드래그&드랍 을 통해 컬럼 보기 순서를 지정할수 있다. 

 

  • 지정한 사용자 정의 컬럼을 다른 사용자와 공유 하기 위해서는 보기 저장 기능을 사용해서 업무 리스트를 같이 볼수 있다. 
 
  • 사용자가 지정한 필터를 추가 해서 새로운 이름의 보기형식을 저장 할수도 있다. 

 

 

728x90
반응형

+ Recent posts