Repository navigation
Open
Labels
Description
📌 덕 타이핑(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 주요 사용 사례
- GitHub에 Push → 자동 빌드 & 테스트
- 코드 변경 시 Docker 이미지 자동 생성 및 배포
- 테스트 실패 시 Slack/Email 알림
- 프로덕션/스테이징 환경에 자동 배포
간단한 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.ymlB. harbor.yml 주요 설정
hostname: harbor.yourdomain.com
https:
port: 443
certificate: /your/ssl/cert.pem
private_key: /your/ssl/key.pem
harbor_admin_password: YourSecurePasswordC. 설치
./install.sh- 설치 후 접속: https://harbor.yourdomain.com
- 관리자 로그인: admin / YourSecurePassword
Activity
[-]TIL -2025-05-16 [덕 타이핑][/-][+]TIL -2025-05-16 [덕 타이핑, Jenkins][/+][-]TIL -2025-05-16 [덕 타이핑, Jenkins][/-][+]TIL -2025-05-16 [덕 타이핑, Jenkins, 패키징, Nginx][/+][-]TIL -2025-05-16 [덕 타이핑, Jenkins, 패키징, Nginx][/-][+]TIL -2025-05-16 [덕 타이핑, Jenkins, 패키징, Nginx, Harbor][/+]