728x90

인스턴스 속성 (Instance Attribute)

- 인스턴스 속성은 클래스의 각 인스턴스마다 개별적으로 유지되는 속성

- 각 인스턴스는 자체 인스턴스 속성을 가지고 있으며, 인스턴스마다 값이 다를 수 있음

- 인스턴스 메서드 내에서 'self'를 사용하여 인스턴스 속성에 접근하고 수정할 수 있음

- 인스턴스 속성은 해당 클래스 각각의 인스턴스에 대해 독립적임

- 예시

class MyClass:
    def __init__(self):
        self.instance_attribute = 10  # 인스턴스 속성

obj1 = MyClass()
obj1.instance_attribute = 20  # obj1의 인스턴스 속성을 수정
obj2 = MyClass()
print(obj1.instance_attribute)  # 출력: 20
print(obj2.instance_attribute)  # 출력: 10 (기본값)

 

클래스 속성 (Clase Attribute)

- 클래스 속성은 클래스에 속하는 속성으로, 해당 클래스의 모든 인스턴스가 공유하는 속성

- 클래스 정의 내부에서 클래스 변수로 선언되며, 모든 인스턴스가 동일한 값을 공유

- 클래스 속성은 클래스 자체와 관련이 있으며, 해당 클래스의 모든 인스턴스에서 동일한 값을 공유

- 클래스 메서드 내에서 'cls'를 사용하여 클래스 속성에 접근하고 수정할 수 있음

- 예시

class MyClass:
    class_attribute = 10  # 클래스 속성

obj1 = MyClass()
obj2 = MyClass()
print(obj1.class_attribute)  # 출력: 10
print(obj2.class_attribute)  # 출력: 10

MyClass.class_attribute = 20  # 클래스 속성 수정
print(obj1.class_attribute)  # 출력: 20 (수정된 값)
print(obj2.class_attribute)  # 출력: 20 (수정된 값)
728x90
728x90

인스턴스 속성, 클래스 속성

인스턴스 메서드 (Instance Method)

- 인스턴스 메서드는 클래스의 인스턴스에 의해 호출되는 메서드

- 첫 번째 매개변수로 'self'를 사용하여 현재 인스턴스에 대한 참조를 전달

- 인스턴스 속성에 접근하고 수정하는데 사용됨

- 인스턴스 메서드는 'self'를 통해 인스턴스의 상태를 변경하거나 인스턴스의 속성에 접근 가능

class MyClass:
    def __init__(self):
        self.some_property = 1
        
    def instance_method(self, some_int):
        # 인스턴스 속성에 접근
        self.some_property = some_int

 

정적 메서드 (Static Method)

- 정적 메서드는 특정 클래스와 관련이 있는 동작을 수행하지만, 인스턴스나 클래스에 대한 참조를 받지 않는 메서드

- '@staticmethod' 데코레이터를 사용하여 정적 메서드임을 나타냄

- 정적 메서드는 클래스의 인스턴스 속성에 접근 가능

- 정적 메서드는 주로 클래스와 관련된 유틸리티 함수를 구현하는 데 사용

class MyClass:
    @staticmethod
    def static_method():
        # 클래스의 인스턴스 속성에 접근 불가능
        # some_property = 10 불가능
        # 클래스와 관련된 동작 수행
        pass

클래스 메서드 (Class Method)

- 클래스 메서드는 클래스 레벨에서 호출되지만, 인스턴스에 대한 참조를 받지 않고, 클래스 자체에 대한 참조를 받음

- 첫 번째 매개변수로 'cls'를 사용하여 현재 클래스에 대한 참조를 전달

- 클래스 속성에 접근하고 수정하는데 사용됨

- 클래스 메서드는 'cls'를 통해 클래스 속성을 변경하거나 접근 가능

class MyClass:
    some_class_property = 1
    
    def class_method(cls):
        # 클래스 속성에 접근
        cls.some_class_property = 10
        # 클래스 속성 변경
        cls.some_class_method()

 

 

728x90
728x90

공백

- 스페이스로 들여쓰기 (탭, 공백 혼합 금지)

- 들여쓰기는 스페이스 네 개 사용

- 한 줄의 문자 길이 79자 이하

- 표현식이 길어 다음 줄로 내려쓰는 경우 추가 들여쓰기 사용

- 파일에서 함수와 클래스는 빈 줄 두 개로 구분, 클래스에서 메서드는 빈 줄 하나로 구분

class MyClass:
    def __init__(self):
        self.data = []

    def my_method(self):
        # Some code here
        pass


def my_function():
    # Some code here
    pass

- 리스트 인덱스, 함수 호출, 키워드 인수 할당에는 스페이스 사용하지 않음

- 할당( = ), 증분 할당( +=, -= 등), 비교( ==<>!=<><=>=innot inisis not), Booleans (andornot)과 같은 이항 연산자는 항상 양쪽에 하나의 공백으로 둘러쌈 ( i = i + 1, c = (a+b) * (a-b) )

- 불필요한 공백 사용하지 않음

 

명명규칙

- 함수, 변수, 속성은 lowercase_underscore 형식

- 보호 인스턴스 속성은 _leading_underscore 형식

- 비공개 인스턴스 속성은 __double_leading_underscore 형식

- 클래스와 예외는 CapitalizedWord 형식

- 모듈 수준 상수는 ALL_CAPS 형식

- 클래스의 인스턴스 메서드(instance method)에서는 첫 번째 파라미터(해당 객체 참조)의 이름을 self로 지정

- 클래스 메서드(class method)에서는 첫 번째 파라미터(해당 객체 참조)의 이름을 cls로 지정

 

표현식과 문장

- 긍정 표현의 부정(if not a is b) 대신 인라인 부정(if a is not b) 사용

- 길이를 확인하여 빈 값을 확인하지 않음 (if len(somelist)==0)

  if not somelist를 사용하고, 빈 값은 암시적으로 False가 된다고 가정

- 길이를 확인하여 비어있지 않은 값을 확인하지 않음 (if len(somelist)!=0)

  if somelist를 사용하고, 비어있지 않은 값은 암시적으로 True가 된다고 가정

- 한 줄로 된 if 문, for와 while 루프, except 복합문을 쓰지 말고 여러 줄로 나눠서 명료하게 작성

 

임포트 규칙

- 항상 파일의 맨 위에 import 문을 놓음

- 모듈을 import 할 때는 항상 모듈의 절대 이름을 사용하며 현대 모듈의 경로를 기준으로 상대 경로로 된 이름을 사용하지 않음

  예를들어 bar 패키지 안의 foo 모듈을 임포트할 때는 import foo 가 아닌 from bar import foo 라고 해야함

- 상대적인 임포트를 해야 한다면 명시적인 구문을 써서 from . import foo 로 작성

- 임포트는 '표준 라이브러리 모듈, 서브파티 모듈, 자신이 만든 모듈' 섹션 순으로 구분해야 함

  각각의 하위 섹션에서는 알파벳 순서로 임포트

 

참고 사이트

- https://peps.python.org/pep-0008/

 

 

728x90
728x90

프록시 설정 이유

하나의 서비스를 이루는 서버가 여러 개 있을 때,

사용자는 각 서버가 어떤 역할을 하는지 파악하고 원하는 서버에 요청을 해야할까? 

ex)

http://localhost:5000/service1/~~

http://localhost:5050/service2/~~

 

중간에 프록시 서버를 두면 프록시서버가 사용자의 요청을 분기처리하여 서비스를 호출한다

사용자는 프록시서버만 알면 된다

ex)

http://localhost:80/service1/~~

http://localhost:80/service2/~~

 

 

윈도우 nginx 설치

 

설정파일 설정

※ 사전준비 : 기동되고 있는 서버의 url

 

1. {nginx설치경로}/conf/sites-enabled/customizing.conf 파일 생성

upstream spring-frontend {
    server localhost:8080;
}
upstream flask-backend {
    server localhost:5000;
}
upstream fastapi-backend {
    server localhost:5050;
}

server {
    listen 80;
    proxy_max_temp_file_size 0;
    client_max_body_size 256M;

    location / {
        proxy_pass http://spring-frontend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
    }
    location /service1/ {
        proxy_pass http://flask-backend;
    }
    location ~^/service2/ {
        proxy_pass http://fastapi-backend;
    }
    location ~^/(docs|openapi.json)$ {
        proxy_pass http://fastapi-backend;
    }
}
  • upstream > 연결할 서버 url 정의
    • 예시 :
      upstream spring-frontend {server localhost:8080;}
  • server > location에 url mapping
    • 예시 : localhost/service1/ 로 들어오는 요청은 flask-backend(http://localhost:5000/service1)로 연결
      location /service1/ { proxy_pass http://flask-backend; }

2. {nginx설치경로}/conf/nginx.conf 파일에 위에서 만든 conf 파일 불러오도록 설정

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include mime.types;
    include sites-enabled/*.conf;
}

3. nginx 재기동

nginx -s stop # 멈추기
nginx # 시작

 

접속 확인

위의 설정파일에서 localhost/docslocalhost:5050/docs 연결했음 > 브라우저에서 localhost/docs에 접속하여 localhost:5050/docs 를 접속했을 때와 같은 서버가 뜬다면 성공

 

 

 

 

nginx 기초

nginx > 웹서버 정적 파일을 처리하는 HTTP 서버로서의 역할 HTML, CSS, Javascript, 이미지와 같은 정보들을 웹브라우저에 전송하는 역할 응용프로그램 서버에 요청을 보내는 리버스 프록시로서의 역할

bigseok.tistory.com

728x90

'Python > Web' 카테고리의 다른 글

FastAPI 개발자가 직접 개발한 FastAPI backend 프로젝트 구조  (0) 2024.03.03
WSGI와 ASGI 단순 비교  (0) 2024.02.28
FastAPI 비동기 처리  (1) 2024.02.26
FastAPI async 비동기 동시 처리  (1) 2024.02.26
nginx 기초  (0) 2022.10.25
728x90

nginx > 웹서버

  • 정적 파일을 처리하는 HTTP 서버로서의 역할
    • HTML, CSS, Javascript, 이미지와 같은 정보들을 웹브라우저에 전송하는 역할
  • 응용프로그램 서버에 요청을 보내는 리버스 프록시로서의 역할
    • 클라이언트가 가짜 서버에 요청하면, 프록시 서버가 배후서버(reverse server)로부터 데이터를 가져오는 역할을 한다.
    • 프록시 서버가 Nginx, 리버스 서버가 응용프로그램 서버를 의미
    • 웹 응용프로그램 서버에 리버스 프록시(Nginx)를 두는 이유는 요청에 대한 버퍼링 때문
    • 클라이언트가 직접 App 서버에 요청하는 경우 프로세스 1개가 응답 대기상태가 되어야 하기 때문에, 프록시 서버를 둠으로서 요청을 배분하는 역할을 함
      • nginx.conf 파일에서 location 지시어를 사용하여 요청을 배분
      • Nginx는 비동기 처리 방식(Event-Drive) 방식을 채택

설치

  • 리눅스 설치
su - # 관리자모드 
apt-get update # apt-get 업데이트 
sudo apt-get install nginx # nginx 설치 
nginx -v # nginx 버전
  • 윈도우 설치

nginx 기본 명령어

## nginx.exe가 존재하는 위치에서 아래 명령어 사용 ##

# 버전
nginx -v

# 시작 : nginx 설치경로로 가서 nginx.exe 더블클릭
nginx (nginx 명령어로 시작 가능하지만 cmd 멈춤.. 끄고 다른 cmd창 열어야함)

# 기동 중인 nginx에 명령하기
## 설정파일 변경 반영을 위해 reload (내린 후 다시 로드해야 되는 경우도 있음)
nginx -s reload;  
## 멈추기
nginx -s stop

nginx 디렉토리 구조 (리눅스 버전)

sudo find / -name nginx.conf # 디렉토리 찾기
cd /etc/nginx # nginx 경로로 이동

sudo apt-get install tree # 트리명령어 사용을 위해 설치
tree . # 현재 디렉토리 트리구조로 보기

nginx.conf 기본 환경설정 튜닝하기

nginx.conf 파일은 Nginx가 동작해야 할 방식을 설정 값을 통해 지정

root 계정만 수정이 가능하기 때문에, 수정이 필요하다면 sudo vim nginx.conf 를 통해 파일 열기

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
        worker_connections 768;
        # multi_accept on;
}

http {

        ##
        # Basic Settings
        ##

        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;
        # server_tokens off;

        # server_names_hash_bucket_size 64;
        # server_name_in_redirect off;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        ##
        # SSL Settings
        ##

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
        ssl_prefer_server_ciphers on;

        ##
        # Logging Settings
        ##

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        ##
        # Gzip Settings
        ##

        gzip on;

        # gzip_vary on;
        # gzip_proxied any;
        # gzip_comp_level 6;
        # gzip_buffers 16 8k;
        # gzip_http_version 1.1;
        # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

        ##
        # Virtual Host Configs
        ##

        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
}


#mail {
#       # See sample authentication script at:
#       # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
#
#       # auth_http localhost/auth.php;
#       # pop3_capabilities "TOP" "USER";
#       # imap_capabilities "IMAP4rev1" "UIDPLUS";
#
#       server {
#               listen     localhost:110;
#               protocol   pop3;
#               proxy      on;
#       }
#
#       server {
#               listen     localhost:143;
#               protocol   imap;
#               proxy      on;
#       }
#}

최상단(Core 모듈)

user  seokhwa; # (default : www-data)
worker_processes  1;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
  • user : NGINX 프로세스가 실행되는 권한
    • nginx는 마스터(master)와 워커(worker) 프로세스로 나뉜다.
    • 워커 프로세스가 실질적인 웹서버 역할을 수행한다.
    • user 지시어는 워커 프로세스의 권한을 지정한다.
    • 워커 프로세스를 악의적 사용자가 제어하면 해당 머신을 최고 사용자의 권한으로 원격제어하는 것이기 때문에 위험하다.
  • work_processes : NGINX 프로세스 실행 가능 수
    • 위에서 언급한 워커 프로세스이다. 실질적인 웹서버 역할을 한다.
    • auto도 무방하지만, 명시적으로 서버에 장착되어 있는 코어 수 만큼 할당하는 것이 보통이며, 더 높게도 설정 가능하다.
  • pid : NGINX 마스터 프로세스 ID 정보가 저장됨

events 블락

events { 
    worker_connections  1024;
    # multi_accept on; (디폴트값 : off) 
}
  • NGINX의 특징인 비동기 이벤트 처리 방식에 대한 옵션 설정
  • worker_connections는 하나의 프로세스가 처리할 수 있는 커넥션의 수
  • 최대 접속자수 = {worker_processes} X {worket_connections}

http 블락

http { 
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
 
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    '$status $body_bytes_sent "$http_referer" '
    '"$http_user_agent" "$http_x_forwarded_for"';
 
    access_log  /var/log/nginx/access.log  main;
 
    sendfile        on;
 
    #tcp_nopush     on; 
 
    keepalive_timeout  65;
 
    #gzip  on; 
 
    include /etc/nginx/conf.d/*.conf;
}
  • keepalive_timeout : 접속시 커넥션을 몇 초동안 유지할지에 대한 설정값
    • 이 값이 높으면 불필요한 커넥션(접속)을 유지하기 때문에 낮은 값 또는 0을 권장한다. (default=10)
  • servers token : NGINX의 버전을 숨길것인가에 대한 옵션
    • 보안상 주석을 제거하여 설정하는 것이 좋다.
  • types_hash_max_size, server_names_hash_bucket_size 호스트의 도메인 이름에 대한 공간 설정
    • 이 값이 낮을 경우 많은 가상 호스트 도메인을 등록한다거나, 도메인 이름이 길 경우 bucket 공간이 모자라 에러가 생길 수 있으므로 넉넉하게 설정하는 것이 좋다.

기타

  • include옵션 : 가상 호스트 설정이나 반복되는 옵션 항목을 inlcude를 통해 불러올 수 있다.
    • 리버스 프록시를 각 도메인에 설정한다고 했을 떄 헤더 처리 옵션등을 conf.d디렉토리에 넣어두고 incldue 명령을 통해 불러올 수 있다.
728x90
728x90

파이썬 설치 (Windows 기준)

1. Windows installer 필요한 버전 다운로드

https://www.python.org/downloads/windows/

default로 사용할 파이썬 버전 한 개만 PATH에 등록 체크하여 설치

2. 설치 경로

  • default : Install Now를 통해 설치하면 C:\Users\{usr_name}\AppData\Local\Programs\Python\Python310 경로에 설치됨
  • 사용자지정 : Customize installation을 통해 설치 경로 지정 가능

3. 설치된 파이썬 확인

  • cmd에서 아래 명령어를 통해 설치된 파이썬 리스트를 확인 가능
## 설치된 파이썬 리스트
py --list
# Installed Pythons found by py Launcher for Windows
# -3.10-64 *
# -3.7-64

## 설치된 파이썬 리스트와 경로
py --list-paths
# Installed Pythons found by py Launcher for Windows
# -3.10-64       C:\project\common\Python\Python310\python.exe *
# -3.7-64        C:\project\common\Python\Python37\python.exe

## py 도움말 : # py -h를 통해 출력 가능

## 파이썬이 여러 개 설치되어있는 경우 py -버전 명령어를 통해 실행 가능
py -3.7  # 3.7버전 실행

## pip 사용 시 -m 옵션을 주어 py 명령라인에서 pip 실행 가능
py -3.7 -m pip install 라이브러리명

 

파이썬 개발환경 관리 (pipenv)

pipenv는 파이썬에서 격리된 가상 환경(virtual environment)과 프로젝트 단위의 패키지 관리를 가능하게 하는 도구

서로 다른 환경의 프로젝트를 컴퓨터 한 대로 개발해야 하는 경우 각 프로젝트 별로 격리된 환경 필요

pipenv를 통해 격리된 가상환경 구성 가능

cmd에서 아래 명령어를 실행하여 pipenv 사용 가능

1. 설치

# 파이썬을 설치한지 오래 된 경우 pip 업그레이드가 필요할 수 있음 (pip install --upgrade pip)
pip install pipenv

2. 가상환경 만들기

# 프로젝트 경로로 이동
cd project1

# 가상환경에서 사용할 파이썬 버전을 --python 옵션에 명시하여 pipenv 커맨드를 실행하면 가상환경 생성됨
pipenv --python 3.10

프로젝트 디렉터리에 Pipfile이 생성됨

프로젝트의 메타 정보가 저장됨

3. 가상환경 사용

# 가상환경 shell에 접속 / 나가기
pipenv shell
exit

# 가상환경 제거
pipenv --rm

# 가상환경 내에 패키지 설치 > 설치한 패키지가 pipfile에 자동으로 명시됨
# pipfile을 통해 어디에서든 동일한 파이썬 개발환경 구성 가능 (동일한 환경을 구성하고 싶은 경로에 pipfile을 복사 후 pipenv install)
pipenv install 패키지명

# 파이썬 실행 / 중단
pipenv run python
exit()

# 프로젝트에 설치된 패키지들을 트리구조로 시각화하여 보여줌
pipenv graph

# 보안취약점이 있는 패키지가 설치되어있는지 체크
pipenv check
728x90
728x90

사용자 입력 : input( '입력값 안내 문구' )

출력 : print(출력할 값 )

## input 사용해보기
input('이름을 입력해주세요')
# 이름을 입력해주세요 < 문구 출력됨
# 석화 < 입력 후 엔터
# '석화' 출력됨

## 입력값 변수에 저장
user_input = input('원하는 값을 입력해주세요 : ')
# 원하는 값을 입력해주세요 : {내맘대로 입력값}
# 변수 출력
print(user_input) # '내맘대로 입력값'

 

728x90
728x90

기본 연산자

# 더하기 : +
print(10 + 3) # 13

# 빼기 : -
print(10 - 3) # 7

# 곱하기 : *
print(10 * 3) # 30

# 나누기 : /
print(10 / 3) # 3.3333333333333335

# 몫 : //
print(10 // 3) # 3

# 나누기 : %
print(10 % 3) # 1

# 제곱 : **
print(10 ** 3) # 1000

# 절대값
print(abs(-9)) # 9
print(abs(9))  # 9

# 반올림
print(round(10.3)) # 10
print(round(10.6)) # 11

# 최대값
print(max(1,3,6,8,111)) # 111

# 최소값
print(minx(-1,4,6,8,-11)) # -11

# 제곱근
from math import sqrt
print(sqrt(9)) # 9

 

복합연산자

x = 4
y = 2

# x = x + y
x += y  # 6

# x = x - y
x -= y  # 2

# x = x * y
x *= y  # 8

# x = x / y
x /= y  # 2

 

728x90

+ Recent posts