
노트정리 스터디를 이끌어주시는 신석님께서 notbookLM을 사용하시는 것을 보여줬는데 사용해보면 좋을듯하다
https://notebooklm.google.com/
이쪽은 신석님(신식이심^^)께서 만들어내신 output
https://elixirrkc-my.sharepoint.com/:b:/g/personal/3dt001_dataschool_msai_kr/IQA-QSLHMHY5Rac3Sb_Gqd0eAfW8i2oemvYq1FnweGnT1do?e=9oZ2Id
주신 팁
Computer Engineering 목적 / DevOps, 자동화, 배포
데이터 잘 저장, Flow 잘 잡기에 초점
✨Trend: CD는 이제 단순 "배포"를 넘어 "릴리즈 엔지니어링"으로 진화중
Auto Build → Auto Test → Human Approve → Deploy
Auto Build → Auto Test → Auto Deploy
https://abhaykarthik.medium.com/waterfall-vs-agile-vs-devops-sdlc-models-8cc11b1a6edc
| 구분 | Scrum | Kanban | XP |
|---|---|---|---|
| 성격 | 애자일 프레임워크 | 작업 흐름 관리 방식 | 애자일 개발 방법론 |
| 핵심 초점 | 스프린트 기반 일정 관리 | 작업 흐름(Flow) 최적화 | 코드 품질 및 개발 실천 |
| 반복 주기 | 고정된 스프린트 (1~4주) | 없음 (연속적 흐름) | 매우 짧은 반복 |
| 역할 | Product Owner, Scrum Master, 개발팀 | 명확한 역할 없음 | 명확한 역할 없음 |
| 계획 방식 | 스프린트 계획 회의 | 필요 시 수시 계획 | 짧은 주기의 계획 |
| 변경 대응 | 스프린트 종료 후 반영 | 즉시 반영 가능 | 즉시 반영 가능 |
| 주요 기법 | 데일리 스크럼, 회고 | WIP 제한, 칸반 보드 | TDD, 페어 프로그래밍 |
| 장점 | 목표·일정 명확, 협업 강화 | 유연성 높음, 도입 쉬움 | 품질 향상, 버그 감소 |
| 단점 | 규칙이 엄격, 초기 적응 필요 | 일정 예측 어려움 | 숙련도·비용 부담 |
| 적합한 경우 | 기능 단위 개발, 팀 협업 중요 | 운영·유지보수, 잦은 변경 | 품질이 중요한 개발 |
https://www.manageengine.com/products/service-desk/itsm/devops-lifecycle-and-pipeline.html
속도(1,2)와 안정성(3,4)는 Trade-off가 아닌, 함께 가는 것

소스 코드를 실행 가능한 아티팩트로 변환하는 과정
npm install, pip installjavac, go builddocker build
https://www.headspin.io/blog/the-testing-pyramid-simplified-for-one-and-all
QA 엔지니어랑 친하게 지내는 것이 좋다.
커뮤니케이션을 활발하게 하는 것이 바람직하다.
코드를 실행하지 않고 품질을 검사하는 단계

*젠킨스: Github Actions와 비슷하지만, 내가 셋업을 해야할게 무척 많음. 요즘은 클러스터 서비스 이용
- 하나가 Array의 elemhttps://docs.github.com/ko/actions
워크플로 트리거 문서



# This workflow will install Python dependencies, run tests and lint with a single version of Python
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python
name: Python application
on:
push:
branches: [ "master" ]
pull_request:
branches: [ "master" ]
permissions:
contents: read
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python 3.10
uses: actions/setup-python@v3
with:
python-version: "3.10"
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install flake8 pytest
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
- name: Lint with flake8
run: |
# stop the build if there are Python syntax errors or undefined names
flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
# exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
- name: Test with pytest
run: |
pytest
name: My First CI
#1. Trigger: 언제 실행할 것인가?
on: [push]
jobs:
build:
#2. Runner: 어디서 실행할 것인가?
runs-on: ubuntu-latest
#3. Steps: 무엇을 실행할 것인가?
steps:
- uses: actions/checkout@v3 # 코드 가져오기
- name: Run Script
run: echo "hello world" #스크립트 실행, 소스코드랑은 상관 X
test: ...(생략)

- name: Cache
uses: actions/cache@v5.0.2
with:
# A list of files, directories, and wildcard patterns to cache and restore
path:
# An explicit key for restoring and saving the cache
key:
# An ordered multiline string listing the prefix-matched keys, that are used for restoring stale cache if no cache hit occurred for key. Note `cache-hit` returns false in this case.
restore-keys: # optional
# The chunk size used to split up large files during upload, in bytes
upload-chunk-size: # optional
# An optional boolean when enabled, allows windows runners to save or restore caches that can be restored or saved respectively on other platforms
enableCrossOsArchive: # optional, default is false
# Fail the workflow if cache entry is not found
fail-on-cache-miss: # optional, default is false
# Check if a cache entry exists for the given input(s) (key, restore-keys) without downloading the cache
lookup-only: # optional, default is false
# Run the post step to save the cache even if another step before fails
save-always: # optional, default is false
steps:
- uses: actions/cache@v3
with:
path: ~/.npm #여기 있는 파일을 캐싱
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json)') }} #os에 따라 인스톨되는 캐싱 이름이 달라지기 때문에 키를 이렇게 잡음
https://docs.github.com/ko/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets







env:
API_KEY: ${{ secrets.MY_API_KEY }}
steps:
- name: Login to DockerHub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USER }}
password: ${{ secrets.DOCKER_PASSWORD }}
https://medium.com/@kalimitalha8/implementing-gitops-with-argocd-a-step-by-step-guide-b79f723b1a43
서버를 코드로 관리
| 구분 | Terraform | Ansible |
|---|---|---|
| 분류 | Infrastructure as Code (IaC) | Configuration Management / Automation |
| 주요 목적 | 인프라 생성·변경·삭제 | 서버 설정·배포·운영 자동화 |
| 관리 대상 | 서버, 네트워크, 로드밸런서, DB, 클라우드 리소스 | OS 설정, 패키지 설치, 서비스 설정, 앱 배포 |
| 상태 관리 | 상태 파일(.tfstate)로 리소스 상태 관리 | 별도 상태 파일 없음 |
| 주요 언어 | HCL (HashiCorp Configuration Language) | YAML |
| 에이전트 필요 여부 | 불필요 | 불필요 (SSH 기반) |
| 실행 방식 | plan → apply 단계적 실행 | Playbook 즉시 실행 |
| 멱등성 | 기본적으로 멱등성 보장 | 모듈 단위로 멱등성 보장 |
| 대표 사용 사례 | AWS EC2, VPC, GCP, Azure 리소스 생성 | Nginx 설치, 사용자 생성, 앱 배포 |
| 멀티 클라우드 | 매우 강력 | 제한적 |
kubernetes 쓰면서 terraform 사용 가능(kuberenetes 클러스터 자체 생성)
AWS에 EC2 3대 만들고
VPC 만들고
EKS 클러스터 만들고
를 코드로 만들어서 관리하는 것
무중단 배포의 정석
현재 운영 중인 버전(Blue)와 동일한 신규 버전(Green)을 동시에 띄워놓고 트래픽만 전환하는 방식
소수의 사용자에게만 먼저 신규 버전을 배포하여 문제가 없는지 확인 후 점진적 확대
Shift left: 보안 검사를 파이프라인의 왼쪽으로 이동(앞에서 실행할수록 비용 ↓)
해킹 방법 중, 비밀번호를 전송할때까지 간격을 확인해서 비밀번호의 길이를 유추해내는 방법이 있다. 이를 위해 서버에서는 홀딩해뒀다가 일정 시간이 지나고 전송하는 방식을 취하기도 한다.
N8N같은 자동화툴도 있음
yaml파일이 많을때, 템플릿화를 하고싶다면 Helm이나 kustomize를 사용하면 된다

User-agent: *
Disallow: /
Allow : /$
Allow : /.well-known/privacy-sandbox-attestations.json
클라이언트 입장에서 보어야 한다. → 동일한 페이지를 받았을 때, 그 내용이 어떻게 표현되는가에 따름
synchronous
http request를 보내고 그 응답을 받아 처리할 수 있도록 한다
import requests
URL = ‘https://jsonplaceholder.typicode.com/posts'
response = requests.get(url) # HTTP 요청 및 응답객체 생성
print(response.status_code) # HTTP 상태 코드
print(response.text) # 응답 본문 ( Unicode )
print(response.content) # 응답 본문 ( Bytes )
print(response.json()) # JSON 응답을 파싱
HTML/XML에서 데이터를 읽어오는 Python Library
https://www.crummy.com/software/BeautifulSoup/bs4/doc/


html_doc = """<html><head><title>The Dormouse's story</title></head>
<body>
<p class = "title"><b> The Dormouse's story</b></p>
<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>
<p class="story">...</p>
"""
from bs4 import BeautifulSoup
soup = BeautifulSoup(html_doc, 'html.parser')
soup.find("title")
soup.title
#<title>The Dormouse's story</title>
soup.title.name
#u'title'
soup.title.stirng
#u'The Dormouses's story'
soup.title.parent.name
#u'head'
soup.p
# <p class="title"><b>The Dormouse's story</b></p>
soup.p['class']
#u'title'
soup.a
#<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
soup.find_all('a', class_='sister')
# [<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
# <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a>,
# <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>]
soup.find(id="link3")
# <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>
soup.find_all("a")
soup("a")
