목차

  • Docker 3~5강
  • Python-dictionary
  • django(2~6)

Docker 3~5강

모니터링과 로깅

  • 모니터링이란?
    • 컨테이너가 어떻게 돌아가고있는지 확인(성능, 자원, 네트원크 사용량 등)
  • Container 로깅
    • 앱의 실행 과정을 로그로 기록하고 로깅으로 확인
    • docker는 모드 로그의 출력 및 에러를 json-file 로기 드라이버에 기록한다.
    • 로그 파일이 계속 커짐으로 사용량을 정해 주어야한다.(최대크기, 파일 개수)
    • 저장 장소(Ubuntu기준: /var/lib/docker/containers/[컨테이너ID]/[컨테이너ID]-json.log)
    • 명려어 3가지
      1. 전체 출력: docker logs logs-test
      2. 실시간 출력: docker logs -f logs-test
      3. 마지막 10줄 출력: docker logs --tail 10 logs-test

Docker Volume

  • 특징
    • 컨테이너만 사용하는 것과 달리 종료 후 데이터가 남음
    • 여러 컨테이너가 같은 데이터 사용 가능
    • 백업 및 옭기긱 쉬움
    • 코드를 바꿔도 데이터는 유지
  • bind mount
    • 특정 폴더나 파일을 컨테이너 안에 직접 쓸 수 있게 해준다.
    • 폴더나 파일을 골라서 Docker 컨테이너에 붙여넣는 것과 비슷
    • 절대 경로
  • tmpfs mount
    • 컴퓨터 메모리를 사용
    • 일시적 데이터 저장 (영구x)
    • 컨테이너끼리 공유 X

Docker Network/컨테이너 네트워크 모델(CNM)

  • 도커 네트워크는 도커 컨테이너끼리 서로 통신할 수 있게 도와준다.
  • 하나의 샌드박스 안에는 여러개의 엔드포인트가 있을 수 있다.
  • 여러개의 네트워크가 연결 될 수 있다.
  • 요소
    • 샌드 박스: 컨테이너를 외부 세계로부터 완전히 분리하는 역할
    • 엔드 포인트: 외부세계와 샌드박스의 연결점
    • 네트워크: 엔드 포인트에서 다른 엔드 포인트로 즉, 컨테이너에서 다른 컨테이너로 데이터를 보내는 길
  • 종류
    • 브리지 네트워크: 기본 네트워크로 한 컴퓨터 안에서 여러 컨테이너가 서로 통신 (포트 맵핑을 사용하면 외부에서도 컨테이너로 접근 가능)
    • 공용 네트워크: 호스트 네트워크를 사용해 컨테이너가 직접 우리 컴퓨터의 네트워크를 쓰게 하는 방법
    • 사설 네트워크: 컨테이너끼리만 통신할 수 있는 네트워크(외부와 격리)

Python-dictionary

딕셔너리

  • 키, 값 쌍
  • 변경 가능(추가, 삭제, 변경)
  • 키 값 중복 불가
  • 키 값 변경 불가
  • 다양한 자료형 가능

생성

  • 중괄호로 생성 empty = {}
  • dict 함수로 생성
  • fromkeys() 메서드 사용

접근 및 변경

  • 키 값을 사용해 접근 print(person['name']) # Alice
  • get 메서드 print(person.get('name')) # Alice
  • 직접 지정해 변경 person['age'] = 26
  • 요소 추가 person['country'] = 'USA'
  • 삭제 pop , del , clear, del

딕셔너리 메서드

  • keys(), values(), items()
  • 키 값 쌍 요소 추가 update()
  • 제일 뒤 요소 삭제 popitem()
  • 추가나 기존값 불러오기 setdefault()

이후 반복문, 컴프리헨션, 중첩 딕셔너리, 메모리를 배웠습니다.


django(2~6)

장고 프로젝트 생성

  • manage.py로 장고 프로젝트를 핸들링한다.
  • 순서
    1. 가상환경 생성
    2. 프로젝트 생성 및 이동
      • django-admin startproject (프로젝트 이름)
      • cd (트로젝트 이름)
    3. 파일 활성화
      • python manage.py runserver
  • 프로젝트 생성 시 생성 되는 파일/폴더
    • settings.py : 프로젝트의 설정을 관리하는 곳
    • urls.py : 어떤 요청을 처리할지 결정하는 곳

앱과 프로젝트

  • 앱이란?
    • 하나의 프로젝트는 여러 개의 앱으로 구성 됳 수 있다.
      • 하나의 앱으로 모두 개발하는 것도 가능.
  • 비교
    • 프로젝트: 앱의 집합체
    • 앱: 각각의 기능 단위 모듈
  • 앱 생성
    • python manage.py startapp <app_name>
  • 앱 등록
    • setting.py의 INSTALLED_APPS 부분에 앱의 이름을 적어준다.

클라이언드와 서버

  • 클라이언트
    • 인터넷에 연결된 장치 특히, 웹 브라우저(사용자)
  • 서버
    • 자원(Resource)을 가지고 있는 컴퓨터(요청 처리 / 응답하는 주체)

요청과 응답

  • 요청
    • 클라이언트(웹 브라우저, 모바일 앱 등)가 서버에게 특정한 작업을 요청합니다.
    • 클라이언트의 정보, 요청의 형식, 인증 정보 등을 포함합니다.
    • 데이터를 포함하며, JSON이나 HTML 폼 데이터와 같은 형식으로 전달합니다.
    • 클라이언트가 요청하는 것이 무엇인지 URL을 보면 파악할 수 있습니다.
  • 응답
    • 서버가 클라이언트의 요청을 받고 처리한 후에 클라이언트에게 결과를 전송합니다.
    • 결과에는 여러 가지 부가적인 정보를 포함합니다.
    • HTML, JSON, XML 등의 형식일 수 있으며, 클라이언트가 요청한 작업에 따라 다양한 형태로 전송합니다.
 

목차

  • Docker 3강 (1~2)
  • Docker 특강
  • Python-tuple

Docker 3강 (1~2)

강의를 듣기 전에 도커, CI/CD, Ubuntu 등이 뭔지 모르겟어서 인터넷 검색으로 알아보았습니다.

  • docker란?
    • 도커 파일 (Dockerfile)(붕어빵 기계 설계도)
      • 정의: 도커 이미지를 빌드하기 위한 파일.
      • 내용: 빌드: 파일 실행 종류, 프로그램 종류, OS종류 정의 등이 들어간다.
      • 목적: 이미지 생성 과정 자동화.
      • 예: 어떤 운영체제를 사용할지, 애플리케이션 코드 및 라이브러리를 어떻게 추가할지 정의.
    • 도커 이미지 (Docker Image)(붕어빵 기계인데 레시피, 재료를 자동으로 넣어주는 기계)
      • 정의: 애플리케이션 실행에 필요한 모든 것을 포함한 읽기 전용 템플릿.
      • 목적: 컨테이너 실행의 기반 제공.
      • 특징: 불변성, 계층적 구조.
    • 도커 컨테이너 (Docker Container)(붕어빵)
      • 정의: 도커 이미지를 실행한 동작 중인 인스턴스.
      • 목적: 애플리케이션을 고립된 환경에서 실행.
      • 특징: 가벼운 프로세스, 독립 실행 환경.
  • 도커 사용 전체 흐름
    • 앱을 정의한 main코드를 개발자가 수정 후 push => CI파일이 Github Actions에서 코드 체크아웃하여 정의된 도커 파일을 불러와 새로운 가상환경에서 도커 이미지를 생성 =(성공)> 도커 이미지가 생성 되면 수정된 코드가 포함된 도커 이미지를 레지스트리(Docker Hub, AWS ECR 등)에 업로드 => CD파일에서 정의된 대로 도커 이미지를 가져와서 컨테이너로 실행 및 배포
      • 테스트가 성공하면 수동으로 main브랜치에 merge한다고 합니다.
      • 레지스트리에 도커 이미지가 업로드 되는 이유는 현재 진행 상황이나 같이 작업하는 사람들과 공유하기 위해 업로드 된다고 합니다.
  • compose
    • 편하게 설정하기: Docker Compose는 여러 컨테이너를 한 파일에 적어서 설정할 수 있어요. 이 파일에는 컨테이너가 무슨 이미지를 쓸지, 어떤 포트를 사용할지, 환경 변수는 뭐가 필요한지 등을 적어둬요. 이렇게 하면 여러 컨테이너를 한 번에 쉽게 설정할 수 있죠.
    • 자동으로 배포하기: 설정 파일이 있으면, Docker Compose가 알아서 컨테이너들을 만들어 주고 실행해 줘요. 개발자가 일일이 명령어를 입력할 필요가 없어요.
    • 의존성 관리: 컨테이너들이 서로 의존하는 관계가 있으면, Docker Compose가 이를 관리해 줘요. 예를 들어, A 컨테이너가 B 컨테이너를 필요로 하면, A를 먼저 켜고 나서 B를 실행하는 식이죠.
    • 모니터링과 로깅: Docker Compose는 컨테이너들이 어떻게 돌아가는지 지켜보고, 로그도 모아줘요. 이렇게 하면 문제가 생겼을 때 빨리 찾아서 고칠 수 있어요.
    • 확장성: 여러 컨테이너를 하나의 그룹으로 관리할 수 있어요. 이게 좋은 이유는, 예를 들어 웹 앱을 만드는 여러 컨테이너를 한꺼번에 관리하고 확장하기 쉽기 때문이에요.
    • 유연성: Docker Compose는 개발 환경, 테스트 환경, 실제 운영 환경에서도 같은 설정 파일을 써서 일관성을 유지할 수 있어요.
    • 보안 강화: 컨테이너들의 네트워크를 분리해서 외부로부터의 접근을 제한할 수도 있어요. 이렇게 하면 보안이 더 강화돼요.
    • 유지보수가 쉬워요: 설정 파일 하나로 컨테이너들을 관리하기 때문에, 뭔가 바꿀 일이 있으면 파일만 수정하면 돼요. 그러면 Docker Compose가 알아서 변경사항을 적용해 줘요.
  • 장점
    • 빠르게 서비스 실행
    • 한 번에 여러 컨테이너 설정
    • 같은 네트워크에서 쉽게 연결
  • 실행
    1. 각 애플리케이션의 Dockerfile 작성하기
      • 보통 내가 만든 애플리케이션을 실행하기 위한 Dockerfile 만 작성
    2. docker-compose.yaml 파일 작성하기
      • 내가 만든 애플리케이션을 실행하기 위해 필요한 database라든지 redis라든지 다른 서비스들을 한꺼번에 정의하는 파일을 작성
    3. docker compose up 으로 실행하기
  • yaml파일 들여쓰기 검사 링크

Docker 특강

특강에서는 docker에 대한 개념과 실습으로 진행 되었습니다.

  • port
    • 80 = http
    • 443 = https
    • 22 = SSH
    • 3360 = MySQL
    • 5432 = PostgreSQL
    • 8888 = MongoDB
  • 실행
    • 메인 파일 생성
    • 도커파일 생성
    • docker buildx build -t flask-app . 빌드로 도커 이미지 생성
    • docker run -d -p 5000:5000 flask-app 컨테이너 실행
    • 주소창에 localhost:5000 으로 접속
  • 정지 및 삭제
    • 실행 중인지 확인 docker ps
    • 컨테이너 정지 docker stop <CONTAINER_ID>
    • 컨테이너 삭제 docker rm <CONTAINER_ID>
    • 도커 이미지 확인 docker images
    • 도커 이미지 중 NONE 파일 삭제 docker image prune
    • 도커 이미지 삭제 docker rmi <image_id>

Python-tuple

  • 튜플이란?
    • 순서가 있어 인덱스로 접근 가능
    • 불변성(immutable)
    • 중복허용
  • 튜플 생성 방법
    • 괄호 사용 number = (1,2,3)
    • 괄호 없이 생성 my_tuple = 1,2,3
    • 단일 요소 튜플 생성 (5, )
    • tuple()함수 사용
  • 인덱싱과 슬라이싱
    • fruits = ('apple', 'banana', 'cherry', 'date')
      • print(fruits[0]) #apple
    • numbers = (0,1,2,3,4,5,6)
      • print(number[2:5]) #(2, 3, 4)
  • 불변, 삭제 불가
  • 추가는 가능
    • my_tiple = (1,2,3)
      • my_tuple += (4,)
  • 메서드
    • count
    • index
    • 튜플과 리스트의 차이점
    특징튜플리스트
    기호 ()또는 생략 []
    변경 가능성 불변 변경 가능
    요소추가/삭제 불가능 가능
    사용사례 변경이 불필요한 데이터, 키로 사용 데이터 조작이 필요한 경우
    • 튜플은 좌표나 날자 등 순서가 중요한 데이터에 자주 사용
    • 튜플끼리 비교 가능 결과 값은 bool
    • 데이터 베이스에서 레코드를 표현할 때 유용
    • 네임드 튜플은 튜플에 이름을 부여해 코드의 가독성을 높인다.

목차

  • Docker 1강
  • Docker 2강
  • Python-list 2일차

Docker 1강

1-2강

  1. CI/CD란?
    • 지속적인 서비스 제공(지속적이 통합)
    • 지속적인 배포
    • 단계: 코드 작성 -> 빌드 -> 테스트 -> 배포
  2. docker 사용 이유
    • Docker Container 내부에서 여러 소프트웨어를 설치해도 호스트 OS에는 영향이 없어요.
    • CI/CD에서 지속적인 통합(Continuous Integration) 과정의 테스트에서 Docker를 활용해요.
    • 어떤 서버에 올리더라도 같은 환경으로 구성된 컨테이너로 동작하기 때문에 표준화된 배포를 구성할 수

1-3강

  • 설치
    1. WSL2 설치 전
      • 시작 버튼 → 제어판 → 프로그램 및 기능 → Windows 기능 켜기/끄기 → Linux용 Windows 하위 시스템
    2. WSL2 설치
      • wsl --install
      • 저는 도움말암 나와서 wsl --list --online으로 설치가능 버젼을 보고 wsl --install Ubuntu-22.04으로 진행하였습니다.
      • wsl --update
      • dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
      • 재부팅
      • wsl --list --verbose 깔려있는 버젼 확인
      • wsl --status 현재 상태 확인
      • 버젼이 1이라면 2로 바꾸어 주어야한다.
        • wsl --set-version Ubuntu-22.04 2
      • cmd에 wsl이나 wsl -d Ubuntu-22.04를 입력해서 실행합니다.
    3. Ubuntu 22.04 에 최신 버전의 docker 설치
      • 유저 이름 설정 및 비밀번호 설정(비밀번호는 2번)
      • lsb_release -a 설치 확인
      • sudo apt-get update
      • sudo apt-get install ca-certificates curl gnupg
      • sudo install -m 0755 -d /etc/apt/keyrings
      • curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
      • sudo chmod a+r /etc/apt/keyrings/docker.gpg
    4. Docker 및 Docker Compose 버전 확인
    5. Windows 에 Docker Desktop 설치
    6. Windows Docker Desktop 설정
      • 우측 상단 톱니바퀴 → 왼쪽 Resources → WSL Integration → Apply&restart

1-5강

  • Container 실행 테스트
    • nginx 이미지 다운받기
    • docker image pull nginx:1.25.3-alpine # 이미지 다운받기
    • docker images # 확인하기
    • docker image history nginx:1.25.3-alpine # 이미지가 어떻게 만들어졌는지 확인
    • docker run -d -p 8001:80 --name webserver01 nginx:1.25.3-alpine # 실행 시키기
    • docker ps | grep webserver01 # 정상 작동 확인
    • docker port webserver01 # port가 어떻게 열려있는지 확인
    • curl localhost:8001 # 8001port 확인

1-6강

  • Docker Container 서비스를 위한 이미지는 Container 런타임에 필요한 바이너리, 라이브러리 및 설정 값 등을 포함하고, 변경되는 상태값을 보유하지 않고(stateless) 변하지 않음(Immutable, Read-Only)
  • 상태 저장 없음(Stateless): 애플리케이션과 관련된 모든 파일과 라이브러리를 포함하고 있기 때문에, 다른 환경에서도 동일한 애플리케이션을 실행 가능
  • 불변성(Immutable): 이미지가 한번 생성되면 변경할 수 없는 것을 의미
  • 도커 이미지는 필요한 파일만 포함하고 있기 때문에, 용량이 작으며, 이미지를 변경할 필요가 있을 경우에는 새로운 이미지를 생성 필요
  • hub.docker.com 에서 이미지를 제공받거나 해당 사이트로 이미지를 제공
  • Private Registry 서버를 통해 이미지를 제공받거나 제공 가능

1-7강

  • 프롬프트에서 로그인 docker login
  • 도커 앱에서도 가능
  • 도커 앱에서 컨테이너 정지및 이미지 삭제

1-8강

  • Container
    • docker = 붕어빵 틀
    • container = 붕어빵
  • Container 수동 생성
docker pull ubuntu:22.04
docker images

# docker create 은 실제 실행하지 않고 컨테이너 생성만
docker create –ti --name ubuntu2204test ubuntu:22.04
docker ps –a
CONTAINER ID   IMAGE          COMMAND       CREATED         STATUS    PORTS     NAMES
2ccc1b2a1144   ubuntu:22.04   "/bin/bash"   4 seconds ago   Created             ubuntu2204test

docker start ubuntu2204test
Ubuntu2204test
docker attach ubuntu2204test

# docker run 은 create/start/attach 를 순차적으로 한 번에 실행하는 것과 같음 
docker run -ti --name=ubuntu2204test2 ubuntu:22.04 /bin/bash
root@57a1a1c759b6:/#

1-9강

  • 명령어 테스트
    • 파일 다운 (강의자료)
    • 홈 디렉토리로 이동 cd ~
    • 디렉토리 만들고 들어가기 mkdir nodejsapp
    • vi app.js -> 다운 받은 파일 내용 복붙 -> ESC -> :wq
    • vi Dockerfile -> 다운 받은 파일 내용 복붙 -> ESC -> :wq
    • docker buildx build -t node-test:1.0 . # 1.0 태그(내 마음대로)를 추가하여 node-test라는 이미지를 빌드
    • docker images | grep node-test # 빌드 완료한 이미지 보기
    • docker image history node-test:1.0 # 1.0으로 태그 추가한 이미지의 Dockerfile history
    • docker run -itd -p 6060:6060 --name=node-test -h node-test node-test:1.0
    • docker ps | grep node-test
    • curl http://localhost:6060
  • docker run 자주 사용하는 옵션
    • -d: detached mode; 백그라운드 모드
    • -p: 호스트와 컨테이너의 포트를 연결(포워딩)
    • -v: 호스트와 컨테이너의 디렉토리를 연결(마운트)
    • -e: 컨테이너 내에서 사용할 환경변수 설정
    • -name: 컨테이너 이름 설정
    • -rm: 프로세스 종료 시 컨테이너 자동 삭제
    • -ti: -i 와 -t 를 동시에 사용한 것으로 터미널 입력을 위한 옵션
  • docker top node-test # 실행 중인 container(프로세스) 조회
  • docker port node-test # 컨테이너에 매핑된 포트 조회
  • docker stats node-test --no-stream # 컨테이너 리소스 통계 출력 (1회)
  • docker stats node-test # 컨테이너 리소스 통계 출력 (스트림)
  • 실행 중인 로그 확인
    • docker logs node-test # 표준 출력(stdout), 표준에러(stderr) 출력
    • docker logs –f node-test # 로그를 계속 출력
    • docker info | grep -i log # 출력된 로그는 파일로 관리되기 때문에 HostOS 의 disk 를 사용
  • Container 내부 확인
    • docker inspect node-test
    • docker container inspect node-test
  • 명령어 모음
    • docker stats # 터미널1, 도커 상태 확인
    • docker events # 터미널2, 도커 프로세스 이벤트 확인
      • docker start node-test # 다시 시작
        • docker stop node-test # 터미널3, 컨테이너 종료
        • docker ps –a # 컨테이너 상태 확인
    • docker pause node-test # 일시중지
    • docker unpause node-test # 다시 시작
    • docker container ls -a # 컨테이너 정보 보기
    • docker container prune # 실행 중이 아닌 컨테이너 삭제
    • docker image prune # 실행 중이 아닌 이미지 삭제
    • docker image ls # 남아 있는 이미지 리스트 확인
    • docker system prune # 이미지, 컨테이너, 볼륨, 네트워크 등 모든 도커 리소스를 일괄적으로 삭제
  • docker exit 코드
    • 0
      • Docker Process가 수행해야 할 모든 Command 또는 Shell을 실행하고 정상 종료
    • 255
      • Docker Image에 정의된 EntryPoint 또는 CMD가 수행이 완료되었을 경우 발생
    • 125
      • Docker run 명령어의 실패로 실제 docker process가 기동되지 않음
    • 126
      • Docker Container 내부에서 Command를 실행하지 못할 경우 발생
    • 127
      • Docker Container 내부에서 Command를 발견하지 못하였을 경우 발생
    • 137
      • kill -9로 인해 종료 됨
    • 141
      • 잘못된 메모리 참조하여 종료 됨
    • 143
      • Linux Signal로 정상 종료 됨
    • 147
      • 터미널에서 입력된 정지 시그널로 종료 됨
    • 149
      • 자식 프로세스가 종료 되어 종료 됨

Docker 2강

2-1

  • CI(Continuous Integration)란?
    • 지속적인 통합 의미
    • 버그 수정, 코드 변경 등이 주기적으로 이루어지고 공유 및 피드백을 주면서 문제가 없을 시 merge되는 자동화 시스템
  • CD(Continuous Delivery/Continuous Deployment)란?
    • 지속적인 제공 의미(Continuous Delivery)
      • CI 이후의 자동화된 배포 준비 과정입니다.
      • 코드를 스테이징 환경에 배포하고, 사람이 최종적으로 프로덕션 배포를 승인하기 전 단계까지 자동화.
      • 프로덕션 환경으로 배포하기 전 단계에서 충분히 테스트된 상태를 유지.
    • 지속적인 배포 의미(Continuous Deployment)
      • Continuous Delivery의 확장으로, 코드 변경 사항이 자동으로 프로덕션 환경에 배포됩니다.
      • 모든 단계가 자동화되며, 사람이 개입하지 않고도 안정적으로 배포 가능.
  • 회사나 팀마다 자동화의 정도가 다르다.
  • 간단한 CI/CD 파이프라인 구성
    • 파이프라인은 코드가 개발에서 배포까지 거치는 모든 단계를 자동화.
    • 단계:
      1. 코드 커밋
      2. 빌드
      3. 테스트
      4. 배포
  • 도구 및 기술
    • CI 도구:
      • Jenkins
      • GitHub Actions
      • GitLab CI/CD
      • CircleCI
      • Travis CI
    • CD 도구:
      • ArgoCD
      • Spinnaker
      • AWS CodePipeline
    • 컨테이너 및 오케스트레이션:
      • Docker
      • Kubernetes
  • github Actions 이해하기
    • github Actions는 내장된 ci/cd도구
    • ci/cd를 구축할 필요 X, 무료
  • github Actions 사용하기
    • 레포지토리 .github/workflows 만들기
    • 필요 Actions 파일을 yaml형식으로 작성
    • 반드시 .github/workflows 안에 yaml파일이 있어야한다,
  • github Actions에서 CI 구성
# Actions 이름 github 페이지에서 볼 수 있다.
name: 'CI'

# Event Trigger 특정 액션 (Push, Pull_Request)등이 명시한 Branch에서 일어나면 동작을 수행한다.
on: 
    push:
        # 배열로 여러 브랜치를 넣을 수 있다.
        branches: [ develop, feature/* ]
    # github pull request 생성시
    pull_request:
        branches: 
            - develop # -를 쓴 여러 줄로 여러 브랜치를 명시하는 것도 가능

    # 실제 어떤 작업을 실행할지에 대한 명시
jobs:
  ci:
  # 스크립트 실행 환경 (OS)
  # 배열로 선언시 개수 만큼 반복해서 실행한다. ( 예제 : 1번 실행)
    runs-on: [ ubuntu-latest ] 

    # 실제 실행 스크립트
    steps: 
      # uses는 github actions에서 제공하는 플러그인을 실행.(git checkout 실행)
      - name: checkout
        uses: actions/checkout@v4

      # with은 plugin 파라미터 입니다. (java 11버전 셋업)
      - name: java setup
        uses: actions/setup-java@v2
        with:
          distribution: 'adopt' # See 'Supported distributions' for available options
          java-version: '17'

      # run은 사용자 지정 스크립트 실행
      - name: run unittest
        run: |
          ./gradlew clean test
  • github Actions에서 CD 구성
name: 'CD'

on: 
    push:
        branches: [ main ] # main브랜치에 push가 일어났을 때 jobs가 동작한다.
jobs:
  cd: # 셋팅 단계
    runs-on: [ ubuntu-latest ] 

    steps: 
      - name: checkout
        uses: actions/checkout@v4

      - name: java setup
        uses: actions/setup-java@v3
        with:
          distribution: 'adopt' # See 'Supported distributions' for available options
          java-version: '17'

      - name: run unittest # 테스트 단계
        run: |
          ./gradlew clean test
		  
      - name: deploy to heroku # 테스트 성공한 경우 배포
	      uses: akhileshns/heroku-deploy@v3.12.12
		    with:
          heroku_api_key: ${{secrets.HEROKU_API_KEY}}
          heroku_app_name: "sampleapp-github-actions" #Must be unique in Heroku
          heroku_email: "nbcdocker@proton.me"
  • GitHub Actions의 YAML 파일에는 워크플로우(Workflow)를 정의하며, 이 안에 이벤트(Event), 러너(Runner), 잡(Job), 스텝(Step), 그리고 액션(Action) 등이 계층적으로 정의한다.
    • Workflow: 전체 워크플로우 정의.
      • Github Repository의 .github/workflows 폴더 아래에 저장
    • Event: 트리거 조건.
      • push, pull request open, issue open, 특정 시간대 반복(cron) 등의 특정한 조건
    • Runner: 워크플로우 실행 환경.
      • Github Action Runner app이 설치된 VM(가상환경)
    • Job: 독립적인 작업 단위.
      • 여러 step의 모음을 의미
    • Step: 잡 안의 세부 실행 단계.
      • 실행 가능한 하나의 shell script 또는 action
    • Action: 재사용 가능한 작업 코드.
      • Job을 만들기 위해 Step들을 연결

2-2

  • VsCode에서 깃 프로젝트로 명시하기
    • 터미널에 git --version #다운 받은지 확인
    • 왼쪽 사이드바에서 소스 제어 아이콘(🔄)을 클릭.
    • "소스 제어" 패널에 프로젝트 정보보기 가능
  • Git 저장소를 VS Code에서 열기
    • 프로젝트 디렉토리 열기: File > Open Folder를 클릭하고 Git 프로젝트가 있는 디렉토리를 선택.
    • 디렉토리에 .git 폴더가 있다면, VS Code가 자동으로 Git 프로젝트로 인식
    • Git 프로젝트가 아닌 경우: 터미널에 git init
  • 새로운 Git 저장소 시작
    • 폴더 생성
    • git 저장소 초기화: 터미널에 git init
    • github연동: git remote add origin <repository_url>
    • git 파일 생성 #.gitignore파일에 환경설정 파일, 로그 파일
    • 파일 커밋
    • git push
  • 브랜치 만들기
    • git switch -c develop #develop브랜치 생성
    • git push -u origin develop #develop브랜치에 push
    • git switch -c feature/add-workflow #add-workflow 브랜치 생성
    • 수동으로 .github 파일 생성
    • 수동으로 wokeflows 파일 생성
    • 수동으로 yaml파일 만들기

Python-list 2일차

심화

문제 1

리스트 numbers = [1, 2, 3, 4, 5]가 있습니다. 이 리스트의 모든 요소를 제곱한 새로운 리스트 squared_numbers 출력하세요

numbers = [1,2,3,4,5]
num_list = []
for x in numbers:
    s_list = x**2
    num_list.append(s_list) 

print(num_list)

numbers = [1,2,3,4,5]
num_list = [x**2 for x in numbers]
print(num_list)

문제 2

리스트 numbers = [1, 2, 3, 4, 5, 6]에서 짝수만을 포함하는 새로운 리스트를 출력하세요

numbers = [1,2,3,4,5,6]
number = []
for x in numbers:
    if x % 2 == 0:
        number.append(x)
print(number)

numbers = [1,2,3,4,5,6]
number = [x for x in numbers if x%2==0]
print(number)

문제 3

2차원 리스트 matrix = [[1, 2], [3, 4], [5, 6]]에서 각 요소를 모두 더한 합계를 계산하세요.

matrix = [[1, 2], [3, 4], [5, 6]]
result = 0
for x in matrix:
    for num in x:
        result+=num
print(result)

matrix = [[1, 2], [3, 4], [5, 6]]
result = 0
for x in matrix:
    result += sum(x)
print(result)

matrix = [[1, 2], [3, 4], [5, 6]]
result = sum([item for row in matrix for item in row])
print(result)

문제 4 - set 함수 사용

다음 리스트에서 중복된 요소를 제거하고, 오름차순으로 정렬된 새로운 리스트를 만드세요: numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5]

numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5]
set_num = sorted(list(set(numbers)))
print(set_num)

numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5]
set_num = list(set(numbers))
set_num.sort()
print(set_num)

목차

  • 발표준비 마무리
  • 베이직반 Python(list 1일차)
  • Django

발표준비 마무리

  • PPT 수정
    • 글꼴 수정: PPT에 투자할 시간이 부족하여 기본 구색만 맞추고 글꼴을 수정하여 디테일을 추가해 주었습니다.
    • 기본 -> Pretendard, Pretendard ExtraLight
  • 시연영상 수정
    • 시연영상 중에 팀원 소개하는 부분이 없어 Zep 캐릭터 단체사진을 추가했습니다.
  • 사전 발표
    • 각 팀원들의 회고 부분은 팀원들이 직접 발표하는 것으로 정하였습니다.
    • 시간이 조금 지체되어 발표에 대한 전체적인 마무리는 발표자이자 팀장님인 이다원님이 맡아주셨습니다.

베이직반 Python(list 1일차)

  • fruits = ['apple', 'banana', 'cherry', 'date']
  • new_fruits = ['melon', 'blueberry']
  • 리스트의 인덱스 번호로 값을 불러올 수 있다. # print(fruits[2]) => 'cherry'
  • len함수를 사용해 리스트의 길이를 알 수 있다. # print(len(fruits)) => 4
  • len함수를 사용해 값을 가져올 수 있다. # fruits[len(fruits)-1] => 'date'
  • fruits.append('mango') # print(fruits) => ['apple', 'banana', 'cherry', 'date', 'mango']
  • fruits.insert(2, 'watermelon') # print(fruits) => ['apple', 'banana','watermelon', 'cherry', 'date', 'mango']
    • insert(인덱스 숫장, 추가할 값)
  • fruits.extend(new_fruits) # print(fruits) => ['apple', 'banana','watermelon', 'cherry', 'date', 'mango', 'melon', 'blueberry']
    • 중복 리스트일 때 유용하다.
  • fruits.remove('banana') # print(fuits) => ['apple', 'watermelon', 'cherry', 'date', 'mango', 'melon', 'blueberry']
  • fruits.pop(1) # print(fruits) => ['apple', 'cherry', 'date', 'mango', 'melon', 'blueberry']
  • my_list = [0, 1, 2, 3, 4, 5, 6]
  • list = [7, 8, 9]
  • print(my_list[2:5]) # [2, 3, 4]
    • 슬라이싱의 특징 start:end:step => start(포함):end(해당 인덱스 미포함)
  • print(my_list + list * 2) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 7, 8, 9]
  • print(list[1:1:-1]) # [9]
  • numbers = [1, 3, 3, 1, 7, 2, 9, 3, 5, 7]
  • print(numbers.index(7)) # 4
  • print(numbers.count(7)) # 2
  • 처음 보는 함수
    • extend, insert
  • 인지하지 못하고있던 부분
    • 슬라이싱의 end부분의 숫자는 인덱스를 지정하는게 아니다. ex) end - 1 자리의 숫자까지의 값이 나온다.
    • insert의 내부 파라미터 (인덱스, 추가할 값)
    • pop의 파라미터 (인덱스)

Django

1강

  • 파이썬 문법(반복문, 조건문, 함수, 클래스)
  • 로직에 대한 이해도
  • HTML / CSS 필수(기초)
  • JavaScript 선택

2강

  • 프레임워크는 0.0.0 major.minor.patch 형태롤 지니는데 왜?
    • Major: 주요 버전이 변경되면 호환이 되지 않을 수 있다.
    • Minor: 호환성은 유지 되고 새로운 기능이 추가 된다.
    • Patch: 보통 버그 수정, 보안 업데이트, 또는 작은 수정 사항
  • VSCODE 가상환경 설정
    • python -m venv 이름
    • source django/Scripts/activate
    • 가상 환경 설정 완료
    • pip freeze > requierment.txt

3강

  • Django 프로젝트
    • Django는 프로젝트 단위로 움직인다. (하나의 프로그램을 만든다.)
  • 나의 첫 Django 프로젝트
    • django-admin startproject <프로젝트 이름> <생성 디렉토리>
  • 만들어진 파일들의 기능
    • settings.py: 프로젝트 설정을 관리하는 곳
    • urls.py: 어떤 요청을 처리할지 결정하는 곳
    • init.py: 하나의 폴더를 하나의 파이썬 패키지로 인식하도록 하는 파일
    • wsgi.py : 웹 서버 관련 설정 파일
    • manage.py : Django 프로젝트 유틸리티 (조종기)

회고

오늘 과제 발표 직전까지 매우 바빳던 것 같습니다.

과제도 잘 마무리했고 새로 지급받은 강의를 들으며 조금 쉬었습니다.

python 강의를 들으면서 아직 내가 모르는 부분이 너무 많다고 생각이 들었지만 알게 되부분 또한 많아졌다고 생각합니다.

django강의를 들으며 VSCODE에서 가상환경을 설정하는 방법에 대하여 아주 자세하게 나오는데 이때까지 아나콘다 환경의 가상환경만 사용해온 저에게는 아주 큰 희고식이였습니다.

또한 장고의 기능에 대하여 큰기대를 품게 되었습니다. 언젠간 나만의 웹사이트를 만들고싶다는 생각까지 들었습니다.

하지만 내일은 Docer 강의를 먼저 들을 생각입니다.

제가 제대로 전달받지 못해서 도커 강의를 먼저 들으라는 말을 팀원분에게 전달받아 내일은 도커강의를 들을듯합니다.

감사합니다

목차

  • 스트림릿 디자인 마무리
  • 다이어 그램 작성
  • README 문서 검토 및 수정

스트림릿 디자인 마무리

  1. 배경색 수정
    • config.toml 파일의 구조 파악
    • base에는 dark와 light만 사용가능 다른 색상을 사용하려면 HTML 스타일 적용해야합니다.
    • primaryColor에는 셀렉트 박스, 버튼 등의 색을 정의 해야합니다. 크기 및 UI개선을 위해서는 HTML 스타일 적용해야합니다.
    • backgroundColor: 서브배경 색상결정
    • secondaryBackgroundColor: 사이드 바 색상을 지정할 수 있습니다.
[theme]
base = "dark"  # 또는 "light"
primaryColor = "#37B7C3"
backgroundColor = "#1E1E1E"  # 서브 배경 색상
secondaryBackgroundColor = "#2A2A2A"  # 보조 배경 색상 (사이드바 등)
textColor = "#FFFFFF"  # 텍스트 색상
font = "sans serif"

2. 시간 체크 UI 구현

# 시간 및 날짜 출력 (매번 렌더링 시 갱신)
current_date_space = st.sidebar.empty()  # 빈 공간 생성
current_time_space = st.sidebar.empty()  # 빈 공간 생성

# 현재 날짜와 시간 출력
current_day = datetime.now().strftime('%Y-%m-%d')  # 현재 날짜 포맷팅
current_time = datetime.now().strftime('%H:%M:%S')  # 현재 시간 포맷팅

current_date_space.markdown(
    f'<p style="color:white; font-weight:bold;">현재 날짜 - {current_day}</p>',
    unsafe_allow_html=True,
)
current_time_space.markdown(
    f'<p style="color:white; font-weight:bold;">현재 시간 - {current_time}</p>',
    unsafe_allow_html=True,
)

다이어 그램 작성

다이아그램 웹사이트를 이용해서 스트리릿으로 구현한 페이지 구조를 보여줄 수 있게 만들었고 이를 합쳐 README에 올렸습니다.

 


README 문서 검토 및 수정

README 문서는 프로젝트의 기능 및 설계를 보여주는 것이라 생각했습니다.
README작성을 맡으신 팀원분이 대체적으로 작성하고 다른 팀원들이 따로 작성을 해보거나 첨언을 하는 형식으로 진행을 했고 저는 개선사항에 첨언을 넣었습니다.
최종적으로 우리 프로젝트를 잘 보여주는 문서를 작성했다고 생각하며 마무리했습니다.
마지막으로 노션으로 작성한 README를 README.md 파일로 옮기는 작업을 했습니다.
gpt를 사용해서 표 데이터를 마크다운으로 사용하는 방법을 익혔습니다.
개행을 넣는 방법과 표 데이터를 쓰는 방법 등 많은 정보를 얻을 수 있었습니다.

 


회고

처음 도전하는 팀 프로젝트인 만큼 많은 것을 배워 내것으로 만드는게 목표였습니다.


프로젝트를 마무리하며 목표를 생각했을 때 정말 많은 것을 배웠고 아직은 완전하지 않지만 성공적이였다고 생각합니다.

 

하지만 삐걱되는 부분도 많았습니다. 다들 처음하는 만큼 더욱 열심히하고 놓친 부분이 있어서 그랬다고 생각합니다.

 

- 프로그램을 진행하면서 아쉬웠던 부분은

   1. 기획단계와 구상단계에서 웹 사이트를 기준으로 기획안을 만들어야합니다.

   2. 코드 컨벤션을 진행해서 변수명이 통일 되어야합니다.

   3. 사용 환경을 일치시켜야합니다.

   4. 프론트엔드(Streamlit)을 구현하는 것이 처음이였기 때문에 구현 하고 싶었던 기능을 구현하지 못했습니다. (이후에도 이 프로젝트를 수정하려고 합니다.)

 

- 프로그램을 진해아며 좋았던 점

  1. RAG, langchain, OpenAI, FAISS, Retrieval 등의기능과 흐름을 자세히 알게되는 시간이였습니다.

  2. Streamlit UI의 구조 등 기본적인 것들과 구축 단계에 대해 자세히 알게 되었고 이후에는 구상하는 단계에서 어떤 기능을 추가해야할지 생각하는데 도움이 될것같으며 아직 파이썬 문법에 많이 약해 각 기능을 함수로 지정하여 부르는 부분은 조금 더 노력해야할 것으로 생각합니다.

 

개선사항으로 넘어간 기능들이 아쉽긴 하지만 모두 서로 존중해주며 서로의 의견을 귀담아 들어 프로젝트를 잘 마무리하는 것 같습니다.


프로젝트를 진행하며 재밋고 힘들었지만 뿌듯한 마음이 가장 큼니다. 김준기님 이다원님 전상우님 정말 감사합니다.

+ Recent posts