Skip to content

TIL -2025-05-16 [덕 타이핑, Jenkins, 패키징, Nginx, Harbor] #69

Open

Description

@soheeGit

📌 덕 타이핑(duck typing)

  • 객체의 실제 타입보다는 해당 객체가 가지고 있는 **동작(메서드·속성)**에 따라 판단하는 프로그래밍 패러다임
  • "오리가 오리처럼 걷고, 오리처럼 꽥꽥 울면 오리다”라는 말에서 유래했다

1. 기본 개념

  • 타입 검사가 아닌 행위 검사
  • 객체의 클래스나 상속 관계를 확인하지 않고, 어떤 메서드나 속성을 “가졌는가”만 본다.
  • 동적 타이핑 언어에서 주로 사용
  • Python, Ruby, JavaScript 등 실행 시점에 타입을 유연하게 다루는 언어에서 효과적.

2. 예시 (Python)

class Duck:
    def quack(self):
        print("꽥꽥")
    def walk(self):
        print("뒤뚱뒤뚱")

class Person:
    def quack(self):
        print("주인장이 꽥꽥")
    def walk(self):
        print("당당하게 걷기")

def in_the_pond(creature):
    # 타입이 Duck인지 확인하지 않고, quack()와 walk()만 호출
    creature.quack()
    creature.walk()

in_the_pond(Duck())    # 꽥꽥 / 뒤뚱뒤뚱  
in_the_pond(Person())  # 주인장이 꽥꽥 / 당당하게 걷기
  • in_the_pond 함수는 Duck 타입인지 묻지 않고, quack과 walk 메서드만 있으면 동작함.

3. 스태틱 타이핑과 비교

  • 정적 타입 언어 (Java, C#)
    • 컴파일 단계에서 메서드·프로퍼티 유무를 검사
    • 안정성↑, 유효성 검사가 미리 이뤄짐
  • 덕 타이핑
    • 실행 단계에서만 검사 → 동적이고 유연하지만, 타입 불일치 시 런타임 에러 발생

📌 Jenkins

오픈 소스 CI/CD(지속적 통합 및 지속적 배포) 자동화 서버
주로 개발자가 코드를 빌드하고, 테스트하고, 배포하는 자동화된 파이프라인을 구축할 때 사용

핵심 개념

개념 설명
Job / Project Jenkins에서 실행되는 단위. Freestyle, Pipeline 등이 있음
Build Job이 실행된 결과. 성공, 실패 여부 확인 가능
Pipeline 코드로 작성된 Job 흐름 (Jenkinsfile 사용)
Jenkinsfile 파이프라인 정의를 코드로 명시하는 스크립트 (Groovy 기반 DSL 사용)
Plugin Jenkins 기능을 확장해주는 모듈 (Git, Docker, Slack 등 연동 가능)
Node/Agent 작업이 실행될 서버. Jenkins는 master(또는 controller)와 agent로 구성됨
Executor 하나의 노드에서 병렬로 실행 가능한 빌드 개수

Jenkins 주요 사용 사례

  1. GitHub에 Push → 자동 빌드 & 테스트
  2. 코드 변경 시 Docker 이미지 자동 생성 및 배포
  3. 테스트 실패 시 Slack/Email 알림
  4. 프로덕션/스테이징 환경에 자동 배포

간단한 Jenkins Pipeline 예시

pipeline {
    agent any

    stages {
        stage('Build') {
            steps {
                echo 'Building...'
            }
        }
        stage('Test') {
            steps {
                echo 'Testing...'
            }
        }
        stage('Deploy') {
            steps {
                echo 'Deploying...'
            }
        }
    }
}

Jenkins의 장점

  • 다양한 플러그인 지원
  • 커뮤니티 활성화
  • 다양한 스크립트/언어 지원
  • 자동화 파이프라인 작성이 쉬움 (Jenkinsfile)

📌 패키징(Packaging)

개발한 코드를 실제 배포 가능한 형태로 묶는 과정
배포 전 마지막 단계로, 서버에서 실행하거나 웹에 올릴 수 있는 상태로 만드는 것이다.

1. 프론트엔드 패키징

  • 우리가 개발한 React, Vue, HTML/CSS/JS 파일들
  • 개발용 코드에는 디버깅용 코드, 주석, 큰 파일이 많음
  • 보통 아래처럼 Webpack / Vite / CRA 같은 도구가 자동으로 처리해준다
npm run build
  • 결과
    • dist/ 또는 build/ 폴더 생성됨
    • 이 폴더 안에는:
      • index.html
      • main.[hash].js, style.[hash].css 이걸 정적 파일이라고 한다.
  • 이걸 Nginx에 올려서 서비스함

2. 백엔드 패키징

  • Java 기반: Spring Boot
  • Node.js 기반: JavaScript 파일 + 패키지 의존성
  • ./gradlew build, ./mvnw package
  • 결과
    • build/libs/app.jar 파일 생성됨 (단일 실행 파일)
    • 이 파일 하나로 서버 실행 가능: java -jar build/libs/app.jar

3. 정리

구분 패키징 명령 결과물 서버에서 실행 방식
프론트엔드 npm run build 정적 파일 (HTML, JS, CSS) Nginx에서 서빙 (/var/www/...)
백엔드 ./gradlew build app.jar java -jar app.jar 실행

📌 Nginx

웹 서버이자 리버스 프록시 서버로,
사용자(브라우저)의 요청을 받아서 정적 파일을 직접 보내주거나,
백엔드 서버에 대신 전달해주는 프로그램.

1. 정적 파일 보내기

  • 사용자가 https://myapp.com에 접속하면,
  • index.html, main.js, style.css 같은 파일을 바로 보내준다.
  • 이런 기능을 정적 파일 서버라고 한다.

2. 백엔드 연결 (리버스 프록시)

  • 사용자가 /api/data 요청하면,
  • Nginx는 요청을 **백엔드 서버(Spring Boot, Node.js)**로 대신 전달하고 응답을 받아 다시 사용자에게 보내준다.
    📌 이걸 리버스 프록시라고 부름.

3. 어디에 설치하는지

사용자가 접속하는 운영 서버에 설치

  • 간단한 설정 예시
server {
    listen 80;
    server_name myapp.com;

    location / {
        root /var/www/html;
        index index.html;
    }

    location /api/ {
        proxy_pass http://localhost:8080/;
    }
}
  • / → 정적 파일 보여줌
  • /api/ → 백엔드 서버로 전달

📌 Harbor

기업용/팀용 프라이빗 Docker 이미지 저장소
보안 강화, 사용자 권한 관리, 이미지 스캔 등 GHCR보다 강력한 기능을 제공한다.

  • CNCF 인큐베이티드 프로젝트
  • 프라이빗 Docker Registry
  • LDAP 연동, RBAC 지원
  • 이미지 서명, 취약점 검사, 감사 로그 가능
  • UI/CLI/API 지원

Harbor을 CI/CD에 적용하는 구성

GitHub Actions → Harbor (Private Registry) → Jenkins → EC2 Docker 배포

1. Harbor 서버 구축

A. 설치 (Docker Compose 기반)

wget https://github.com/goharbor/harbor/releases/download/v2.9.1/harbor-online-installer-v2.9.1.tgz
tar xvf harbor-online-installer-v2.9.1.tgz
cd harbor
cp harbor.yml.tmpl harbor.yml

B. harbor.yml 주요 설정

hostname: harbor.yourdomain.com
https:
  port: 443
  certificate: /your/ssl/cert.pem
  private_key: /your/ssl/key.pem
harbor_admin_password: YourSecurePassword

C. 설치

./install.sh

Activity

  1. changed the title [-]TIL -2025-05-16 [덕 타이핑][/-] [+]TIL -2025-05-16 [덕 타이핑, Jenkins][/+] on May 16, 2025
  2. changed the title [-]TIL -2025-05-16 [덕 타이핑, Jenkins][/-] [+]TIL -2025-05-16 [덕 타이핑, Jenkins, 패키징, Nginx][/+] on May 17, 2025
  3. changed the title [-]TIL -2025-05-16 [덕 타이핑, Jenkins, 패키징, Nginx][/-] [+]TIL -2025-05-16 [덕 타이핑, Jenkins, 패키징, Nginx, Harbor][/+] on May 19, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions