{% for book in books %}
<li>{{book}}</li>
{% endfor %}

목차

  • Python-조건문
  • django(7~10)

Python-조건문

  1. 조건문의 기본 개념
    • if: 조건이 True이면 코드블록을 실행한다.
    • elif: 앞의 조건이 거짓이라면 다음 조건을 검사
    • else: 위의 모든 조건이 거짓일 때 실행
  2. if 문
if 조건식:
    위 조건이 참일 때 실행할 코드
elif 조건식:
    if가 거짓이고 elif가 참일 때 실행할 코드
else:
    위 조건이 모두 거짓일 때 실행할 코드
  1. AND, OR, NOT 연산자
    • AND: 모든 조건이 True일 때만 True
    • OR: 하나라도 조건이 True이면 True
    • NOT: 조건의 결과를 반전 (True<->False)
  2. 삼항 연산자(조건부 표현식)
참일 때 값 if 조건식 else 거짓일 때 값
  1. 조건문과 함께 자주 쓰이는 비교 연산자

연산자의미예시결과

== 같음 x == y x와 y가 같으면 True
!= 같지 않음 x != y x와 y가 다르면 True
< 작음 x < y x가 y보다 작으면 True
> x > y x가 y보다 크면 True
<= 작거나 같음 `x <= y x가 y보다 작거나 같으면 True
>= 크거나 같음 x >= y x가 y보다 크거나 같으면 True

django(7~10)

7강 Django의 설계 철학 - MTV Pattern

  • 소프트웨어의 디자인 패턴
    • 클라이언트 - 서버 또한 소프트웨어 디자인 패턴 중 하나에요.
    • 자주 사용되는 소프트웨어의 구조를 마치 건축 공법처럼 일반화 해둔 것

Django의 디자인 패턴(MTV Pattern)

  • MTV 패턴은 MVC 패턴을 살짝 변형한 것
  • Model - View - Controller
    • Model : 데이터와 관련된 로직을 관리
    • View : 레이아웃과 관련된 화면을 처리
    • Controller : Model과 View를 연결하는 로직을 처리
  • MTV Pattern
    • Model
      • MVC에서의 Model입니다.
      • 데이터와 관련된 로직을 처리합니다. → 데이터 구조 정의, 데이터베이스 기록 관리해요.
    • Template
      • MVC에서의 View입니다.
      • 레이아웃과 화면상의 로직을 처리 →즉, UI와 레이아웃을 다루어요.
    • View
      • MVC에서의 Controller입니다.
      • 메인 비지니스 로직을 담당합니다.
      • 클라이언트의 요청에 대해 처리를 분기하는 역할을 합니다.
        • DB도 조회하고 외부로 요청하기도 해요.
        • 응답을 만들어서 클라이언트에게 전달해요.

MVCMTV

Model Model
View Template
Controller View

8강 Django Template 시작하기

  • 순서
    1. 요청(Request)이 들어오면
    2. URL(urls.py) 처리
    3. View(views.py) 처리
    4. Template(html) 처리
    5. 응답(Response) 전달
  • URL(urls.py) 방법1
    • urlpatterns(URL패턴 목록)에 path('index/',views.py 경로) 추가
    • path는 url경로 정의
    • url경로가 index일 때 처리 정의
    • views.py에 index view 추가
      • views.py 경로에 views.index 작성
      • views.py파일이 다른 폴더에 있기 때문에 from articles import views 추가
    • python manage.py runserver
      • 기존 링크에 /index를 추가 해주면 위에 정의한 함수들이 출력된 페이지가 나오게 된다.
      • http://127.0.0.1:8000/index/
  • URL(urls.py) 방법2
    • urlpatterns(URL패턴 목록)에 path('index/',views.py 경로) 추가
    • path는 url경로 정의
    • url경로가 index일 때 처리 정의
    • views.py에 index view 추가
      • views.py 경로에 views.index 작성
    • articles폴데에 pamplates 폴더 생성 index.html파일 생성 및 작성 (tip. !gkrh tab을 누르면 기본 html 자동 작성)
    • python manage.py runserver
      • 기존 링크에 /index를 추가 해주면 위에 정의한 함수들이 출력된 페이지가 나오게 된다.
      • http://127.0.0.1:8000/index/
def index(request):
    return render(request, 'index.html')

# render의 기본 구조
render(request, 템플릿, context)

9강 Django template System

  • template란?
    • 데이터를 보여주는 로직
  • Template System
    • 데이터 표현을 위해 다양한 도구를 제공
    • DTL: Django Template에서 사용하는 문법(파이썬과 비슷)
      • 변수, Variable: {{variable}}, view의 context의 키로 넘긴 데이터(value)를 접근할 수 있다.
      • 필터, Filters: {{variable|filter}}, 필터는 약 60개가있어 docs를 참고하여 사용해야한다./커스텀도 가능
      • 태그, Tags: {% tag %}, 반복 또는 논리를 수행하여 제어 흐름을 만들거나 특수한 기능을 수행(시작 태그{% if ~ %}, 종료 태그{% endif %})
      • 주석, Comments: {# 한 줄 주선 #}, {% comment %} 여러줄 주석 {% endcomment %}
    • 변수 사용 방법 views.py의 def함수 안에 context를 딕셔너리형태로 작성, html파일에 {{context의 키 이름}} 작성
    • 태그 사용 방법 views.py의 def함수 안에 태그로 사용할 변수 정의 후 html파일에으로 작성, 태그의 인덱스 순서로 접근하기 위해선 {{태그이름.0}}, 태그에 함수를 적용하고 싶다면 {{태그이름.0|upper}}, 여러줄 태그로 for문을 사용하고 싶다면
    • {{태그이름}}
 
  • Templates Inheritance (base.html과 hello.html보고 참고)
    • 코드의 중복 문제를 해결하기 위한 방법 즉, 템플릿 상속
    • 상위 템플릿에서 하위 템플릿 마다 달라질 부분을 정의
      • {% block block_name %} {% endblock block_name %}
    • 하위 템플릿에서 상위 템플릿을 상속해서 확장한다는 것(최상단에 위치해야 함)
      • {% extends 'template_name' %}
  • 템플릿을 깔끔하게 저장하기 위해서 가장 위의 디렉토리에 templates폴더를 만들고 base.thml 파일 작성하고 settings.py의 TEMPLATES안의 DIRS를 작성 'DIRS': [BASE_DIR / 'templates']

10강 HTTP Form

  • 클라이언트가 서버에게 데이터를 보내는 방법
<form action="/submit/" method="post">
    <label for="username">사용자 이름:</label><br>
    <input type="text" id="username" name="username" required><br>
    
    <label for="email">이메일 주소:</label><br>
    <input type="email" id="email" name="email" required><br>
    
    <label for="password">비밀번호:</label><br>
    <input type="password" id="password" name="password" required><br>
    
    <input type="submit" value="가입하기">
</form>
  • action
    • 데이터가 전송될 URL을 지정합니다.
    • 지정하지 않을경우 현재 페이지의 URL로 데이터를 전송합니다.
  • method
    • 데이터를 전송하는 방식(HTTP request method)을 지정합니다.
    • HTML Form은 GET 방식 또는 POST 방식으로만 전송이 가능합니다.
  • 실습은 data_throw.html 파일에 있다.
    • 사용 태그 lable(for=my_data), input(type=text,id=my_data), button(type=submit)
    • <>를 다 작성하면 뒤에 바로 텍스를 작성해서 화면에 노출
  • input:
    • 사용자의 입력을 받기 위해 사용
    • type 속성에 따라 입력 동작 방식이 달라진다. (defalut값은 text)(text, password, date등)
    • name으로 서버에 데이터를 전달하고, 서버는 name을 보고 데이터를 판단
    • input의 name 속성:
      • form을 제출(submit)하면 name속성에 설정된 값이 서버로 전송
      • name속성의 값이 key가 되고, 사용자가 입력한 값이 value가 되어 전송
  • HTTP란?
    • 하이퍼텍스트 전송 프로토콜 (Hyper Text Transfer Protocol)
    • 여러가지 리소스를 보내고 받을 때 사용하는 프로토콜 (통신규약) == 약속입니다.
    • 요청(request)와 응답(response)로 이루어지는 통신입니다.
    • 웹에서 이루어지는 데이터 교환의 기초라고 할 수 있습니다.
  • HTTP methods
    • HTTP에서 수행할 작업을 나타냅니다.
    • 특정 자원에 대해 내가 수행하고자 하는 동작을 method로 정의.
    • GET, POST, PUT, DELETE, … 등이 있다.
    • GET: 특정한 자원을 조회할 때 사용.
      • 쿼리스트링을 사용해서 전송
      • 쿼리스트링: URL에 데이터가 포함되어 전송하는 방식

목차

  • 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 강의를 먼저 들을 생각입니다.

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

감사합니다

+ Recent posts