1···45678910

AWS 로그인 후 putty 설치
https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html
putty-64bit-0.80-installer.msi 다운로드
 
1. 오른쪽 상단에 시간대 서울 선택 후 > 왼쪽 위 메뉴 > 컴퓨팅 > EC2 선택

 
 
 
2. 인스턴스 메뉴에서 > 인스턴스 선택
 

 
3. 인스턴스 시작
 

 
4. 인스턴스 이름 및 태그 작성
 

 
5. 스크롤 내려서 ubuntu 선택

 
6. 스크롤 내린 후 키 페어 생성
7. 키 페어 생성 후, pem파일 나의 파일에 넣기

.

 

 
8. 스토리지 구성 

 

 
9. PuTTYgen 열기

 
파일 선택

 
 
10. PuTTY열기

11. ppk파일 넣기

13. 폰트 바꾸기

 

14. 
HostName에 나의 인스턴스 IP넣기
Load선택 후 PuTTygen에서 받은 파일 pem넣기

 

# OPEND 선택 후 입력
# cmd창에서 순서대로 입력
 
> sudo passwd
> 비밀번호
> su root
> 비밀번호
> rm /etc/localtime
> ln -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime
> date
> su ubuntu
> sudo apt update
> sudo apt upgrade
> sudo apt install mysql-server
> sudo ufw allow mysql
> sudo systemctl start mysql
> sudo systemctl enable mysql
> sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
   i
   # bind-address = 127.0.0.1
   esc
   :wq
> sudo /etc/init.d/mysql restart
> sudo /usr/bin/mysql -u root -p
> 비밀번호
> use mysql;
> create user 'mysql'@'%' identified by '비밀번호';
> grant all privileges on *.* to 'mysql'@'%' with grant option;
> flush privileges;
> exit
> sudo /usr/bin/mysql -u mysql -p
> 비밀번호
> create database test;
> use test;
> exit


13. 인스턴스 목록으로 간 후, 생성한 인스턴스 선택 후 하단에 보안 선택
      보안 세부정보 아래에 있는 보안 그룹 링크 클릭
 

 
 
 
14. 인바이드 규칙 편집 선택

 

 
 
 













DataBase 

 

DB(Database)
데이터가 모여있는 기지

DBMS(Database Management System)
DB를 관리할 수 있는 구체적인 시스템
오라클, MySQL, MariaDB, MS-SQL, MongoDB, ...

MySQL
웹 사이트와 다양한 애플리케이션에서 사용되는 DBMS이다.
오라클은 관리 비용이 고가이지만 MySQL은 저가형 데이터베이스이다.
문법이 간결하고 쉬우며, 메모리 사용량이 현저히 낮아서 부담없이 사용 가능하다.

DBMS 소통 방식
-----------------------------------------------------
          사용자
-----------------------------------------------------
    ↕               ↕
고객 관리 응용프로그램      ↕   주문 관리 응용프로그램
    ↕               ↕
-----------------------------------------------------
          DBMS
-----------------------------------------------------

RDBMS(관계형 데이터베이스 관리 시스템)
테이블끼리 서로 관계를 맺는다.

Table A(TBL_USER)                Table B(TBL_ORDER)
번호(PK)    이름    나이    아이디(UK)       주문번호(PK)       번호(FK)    날짜       상품수량
1    이기영    20    lky1234       20240114001    2    20240114    5
2    장상화    21    jsh5555       20240114002    2    20240114    20
3    조은종    22    jej9999       20240114003    1    20240114    100
4    서경덕    45    sgd7777       20240115001    4    20240115    1
5    문우람    78    mor4444       20240115002    3    20240115    45

이러한 구조를 가지는 것을 Table이라고 부른다.

COLUMN(열, 속성, 필드)
공통된 값들의 주제(집합)

ROW(행, 레코드, 튜플)
하나의 정보

PRIMARY KEY(PK)
고유한 값, 테이블 당 1개씩만 존재한다.
각 정보의 구분점으로 사용된다.
중복이 없고 NULL값을 허용하지 않는다.

FOREIGN KEY(FK)
다른 테이블의 PK를 의미한다.
보통 테이블끼리 관계를 맺을 떄 사용한다.
중복이 가능하고, NULL도 허용한다.

UNIQUE KEY(UNIQUE)
NULL은 허용하지만 중복은 허용하지 않는다.

SQL문(쿼리문) - DDL, DML, DCL, TCL
스크립트 언어(인터프리터 언어)
DMBS와 소통하는 언어



MySQL 설치


1) 로그인
> mysql -u root -p
> 비밀번호

2) 기본 데이터베이스 선택
> use mysql;

3) 로컬에서만 접속 가능한 계정 생성
> create user 'userid'@localhost identified by '비밀번호';

4) 원격으로도 접속 가능한 계정 생성
> create user 'userid'@'@'%' identified by '비밀번호';

5) 데이터베이스 생성
> create database [데이터베이스 이름];

6) 데이터베이스 사용
> user [데이터베이스 이름];

7) 데이터베이스 삭제
> drop database [데이터베이스 이름];

8) 사용자 비밀번호 변경
> set password for 'userid'@'%' = '신규 비밀번호';

9) 사용자 삭제
> drop user 'userid'@'%';

10) 연결 권한
> grant asll privileges on *.* to 'userid'@'%' with grant option;

11) 권한 관련 명령어 확정
> flush privileges;


 

SQL문(쿼리문)

- DDL (데이터 정의어)



DDL(DATA Definition Language): 데이터 정의어
- 테이블을 조작하거나 제어할 수 있는 쿼리문

자료형
- 정수 tinyint
smallint
mediumint
int
bigint
- 실수 decimal(m, d) : m자리 정수, d자리 소수점으로 표현
- 날짜 date  :  1000-01-01 ~ 9999-12-31(3byte)
time  : -838:59:59 ~ 838:59:59(3byte)
datetime : 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59(8byte)
- 문자 char(m) : 고정 길이 문자열(0~255)
varchar(m) : 가변 길이 문자열(0~65535)
- Boolean MySQL에서는 tinyint를 사용하는 것이 가장 좋다.
bit(1)로 설정해도 어차피 byte 단위로 데이터를 저장하고,
bool, boolean으로 설정해도 자동으로 tinyint로 변경된다.
만약 값에 의미부여를 하고 싶다면, varchar로 설정한 뒤
check 제약조건으로 이상 데이터 삽입을 막아준다.
enum을 사용하면 정규화를 위반하게 되며, 설정해놓은 데이터 수정이 어렵고
다른 DBMS로 이관할 경우, MySQL에만 존재하는 enum을 모두 다른 타입으로 변경해야한다.
만약 enum을 사용하고자 한다면, 정규화 위반이 가능하도록 약속했고, 유일하고 변하지 않는 값이며,
2~10개의 값일 경우에만 사용한다.

 


   

Table

 

1. create: 테이블 생성 create table [테이블명] ([컬럼명] [자료형]...);
2. drop: 테이블 삭제 drop table [테이블명];
3. alter: 테이블 수정 테이블명 수정

          alter table [테이블명] rename [새로운 테이블명]
       - 컬럼 맨 뒤에 추가
          alter table [테이블명] add [컬럼명] [자료형] [제약조건];
       - 컬럼 맨 앞에 추가
          alter table [테이블명] add [컬럼명] [자료형] [제약조건] first;
       - 컬럼 지정 위치에 추가
          alter table [테이블명] add [컬럼명] [자료형] [제약조건] after [기존 컬럼명];
       - 컬럼 삭제
          alter table [테이블명] drop [컬럼명];
       - 컬럼명 변경
          alter table [테이블명] change [기존컬럼명] [변경할 컬럼명] [컬럼타입];
       - 컬럼 타입 변경
          alter table [테이블명] modify [컬럼명] [변경할 컬럼타입];
       - 제약 조건 확인
          desc [데이터베이스명].[테이블명];
       - 제약 조건 추가
          alter table [테이블명] add constraint [제약조건 이름];
       - 제약 조건 삭제
          alter table [테이블명] drop constraint [제약조건 이름];
4. truncate: 테이블 내용 전체 삭제 truncate table [테이블명];

 


데이터 무결성


무결성 : 데이터의 정확성, 일관성, 유효성이 유지되는 것

 

● 정확성 : 데이터는 애매하지 않아야 한다.

일관성 : 각 사용자가 일관된 데이터를 볼 수 있도록 해야한다.
유효성 : 데이터가 실제 존재하는 데이터여야 한다.

1. 개체 무결성
모든 테이블이 PK로 선택된 컬럼을 가져야 한다.

2. 참조 무결성
두 테이블의 데이터가 항상 일관된 값을 가지도록 유지한다.

3. 도메인 무결성
컬럼의 타입, NULL값의 허용 등에 대한 사항을 정의하고
올바른 데이터가 입력되었는 지를 확인한다.



모델링(기획) : 추상적인 주제를 DB에 맞게 설계하는 것

1. 요구사항분석
회원, 주문, 상품: 3가지를 관리하고자 한다.

2. 개념적 설계(개념 모델링)

 

회원 주문 상품
---------------------------------
번호 번호 번호
---------------------------------
아이디 날짜 이름
비밀번호 회원번호 가격
이름 상품번호 재고

3. 논리적 설계(논리 모델링)

 

회원 주문 상품
--------------------------------------------------------
번호PK 번호PK 번호PK
--------------------------------------------------------
아이디 U, NN 날짜 NN 이름 NN
비밀번호 NN 회원번호 FK 가격 D=0
이름 NN 상품번호 FK 재고 D=0

4. 물리적 설계(물리 모델링)

 

tbl_user
------------------------------------------
id: bigint primary key
------------------------------------------
user_id: varchar(255) unique not null
password: varchar(255) not null
name: varchar(255) not null

5. 구현



정규화

 

정규화


 :  삽입/수정/삭제의 이상현상을 제거하기 위한 작업.
    데이터의 중복을 최소화하는 데에 목적이 있다.
    5차 정규화까지 있으나 3차 정규화까지만 진행한다.

 

 

1차 정규화

1차 정규화 같은 성격과 내용의 컬럼이 연속적으로 나타나거나
   하나의 컬럼에 여러 값이 연속적으로 나타날 경우
   상품명
   와이셔츠1, 와이셔츠2, 와이셔츠3

   상품명1   상품명2   상품명3
   와이셔츠1   와이셔츠2   와이셔츠3
 * 조회가 힘들다.
   ▶ 1차 정규화 진행
   
      상품명
      와이셔츠1
      와이셔츠2
      와이셔츠3

 

2차 정규화

2차 정규화 조합키(복합키)로 구성되었을 경우 조합키의 일부분에만 종속되는 속성이 있는 경우(부분 종속).
     꽃
   이름   색상   꽃말   과
   해바라기   노란색   행운   국화
   장미   빨간색   사랑   장미
 "과" 속성(컬럼)은 부분종속이다.
▶ 2차 정규화 진행
   
      꽃
      이름   색상   꽃말
      해바라기   노란색   행운
      장미   빨간색   사랑

      과
      이름   과
      해바라기   국화
      장미   장미

 

3차 정규화

3차 정규화 PK가 아닌 컬럼이 다른 컬럼을 결정하는 경우.
  이행함수 종속 제거.
   회원번호   이름   시   구   동   우편번호
   1   한라봉   경기도   남양주   화도   12345
   2   홍길동   서울   강남   역삼   56466
* 우편번호로 시, 구, 동을 알 수 있다.
* 중복된 데이터가 생길 가능성이 있다.
▶ 3차 정규화 진행

      회원번호   이름   우편번호
      1   한라봉   12345
      2   홍길동   56466

      우편번호   시   구   동
      12345   경기도   남양주   화도
      56466   서울   강남   역삼




데이터베이스에서 정규화가 필요한 이유
   데이터베이스를 잘못 설계하면 불필요한 데이터 중복으로 인해 공간이 낭비된다.
   이런 현상을 이상(Anomaly)현상이라고 한다.


   회원번호와 프로젝트코드 두 컬럼의 조합키로 설정되어 있는 테이블이고
   한 사람은 하나의 부서만 가질 수 있다.

   회원번호      이름   부서   프로젝트코드   급여   부서별 명수
   22080101   한라봉   개발팀   ABC0001      3000   4
   22080101   한라봉   개발팀   DEF1112      2000   4
   22080101   한라봉   개발팀   CBA9474      4000   4
   22080104   홍길동   기획팀   EFG0881      5000   2
   22081106   이순신   디자인팀   GHI9991      6000   3

★정규화가 필요한 이유 3가지

이상 현상의 종류  
1. 삽입 이상  새 데이터를 삽입하기 위해 불필요한 데이터도 삽입해야하는 문제


담당 프로젝트가 정해지지 않은 사원이 있다면,프로젝트 코드에
NULL을 작성할 수 없으므로 이 사원은 테이블에 추가될 수 없다.
따라서 '미정'이라는 프로젝트 코드를 따로 만들어서 삽입해야 한다.
2. 갱신 이상 중복 행 중에서 일부만 변경하여 데이터가 불일치하게 되는 모순의 문제


한 명의 사원은 반드시 하나의 부서에만 속할 수 있다.
만약 "한동석"이 보안팀으로 부서를 옮길 시 3개 모두 갱신해주지 않는다면
개발팀인지 보안팀인지 알 수 없다.
3. 삭제 이상 행을 삭제하면 꼭 필요한 데이터까지 함께 삭제되는 문제

"이순신"이 담당한 프로젝트를 박살내서 드랍된다면 "이순신" 행을 모두 삭제하게 된다.
따라서 프로젝트에서 드랍되면 정보를 모두 드랍하게 된다.




   ▶ 2차 정규화

      회원번호      프로젝트코드   급여
      22080101   ABC0001      3000
      22080101   DEF1112      2000
      22080101   CBA9474      4000
      22080104   EFG0881      5000
      22081106   GHI9991      6000


      회원번호      이름   부서   부서별 명수
      22080101   한라봉   개발팀   4
      22080104   홍길동   기획팀   2
      22081106   이순신   디자인팀   3


   ▶ 3차 정규화 진행

      회원번호      이름   부서   
      22080101   한라봉   개발팀   
      22080104   홍길동   기획팀   
      22081106   이순신   디자인팀   
      22080103   장보고   개발팀

      부서   부서별 명수
      개발팀   4
      기획팀   2
      디자인팀   3

 


 

SQL문(쿼리문)

- DML(Data Manipulation Language) : 데이터 조작어

1. select: 조회(검색) select [컬럼명1, ...]
from [테이블명]
where [조건식];
2. insert 1) 컬럼을 생략할 수 있다.

insert into [테이블명]
([컬럼명1], [컬럼명2], ...)
values([값1], [값2], ...);



2) 모든 값을 전부 작성한다.

insert into [테이블명]
values([값1], [값2], ...);
3. update update [테이블명]
set [기존 컬럼명1] = [새로운 값1], [기존 컬럼명2] = [새로운 값2], ...
where [조건식];
4. delete delete from [테이블명]
where [조건식];

 

 

조건식
>, <  초과, 미만
>=, <=  이상, 이하
=  같다
<>, !=, ^= 같지 않다
AND 둘 다 참이면 참
OR  둘 다 아니어도 참 



join

: 여러 테이블에 흩어져 있는 정보 중
사용자가 필요한 정보만 가져와서 가상의 테이블처럼 만들고 결과를 보여주는 것.
정규화를 통해 조회 테이블이 너무 많이 쪼개져 있으면,
작업이 불편하기 떄문에 조회의 성능을 향상시키고자 join을 사용한다.

- 내부 조인(inner join)
from [테이블명]
inner join [테이블명]
on 조건식
inner join [테이블명]
on 조건식
inner join [테이블명]
on 조건식
...


- 등가 조인
: on절에 등호가 있을 때, 서로 관계를 맺고 있는 테이블끼리 JOIN할 때 주로 사용된다.

 

- 비등가 조인
: on절에 등호가 없을 때, 서로 관계를 맺지 않고 있는 테이블끼리 JOIN할 때 주로 사용된다.

 

 

- 외부 조인(outer join) : 조건에 일치하지 않아도 원하는 정보까지 합쳐서 조회
- left outer join 선행 테이블의 모든 정보를 가져오고 싶을 때 사용한다.
- right outer join 후행 테이블의 모든 정보를 가져오고 싶을 때 사용한다.






옵티마이저(Optimizer)


SQL을 가장 빠르고 효율적으로 수행할 최적의 처리경로(최적비용)을 생성해주는 DBMS 내부의 핵심 엔진
사용자가 쿼리문(SQL)으로 결과를 요청하면, 이를 생성하는 데 필요한 처리경로는 DBMS에 내장된
옵티마이저가 자동으로 생성한다. 옵티마이저가 생성한 SQL 처리경로를 실행 계획(Execution Plan)이라고 한다.
COST: 예상 수행 시간, 쿼리를 수행하는 데 소요되는 일량 또는 시간
CARDINALiTY: 실행 결과의 건수

옵티마이저의 SQL 최적화 과정
사용자가 작성한 쿼리를 수행하기 위해, 실행 계획을 찾는다.
데이터 딕셔너리에 미리 수집해 놓은 오브젝트 통계 및 시스템 통계 정보를 이용해서
각 실행계획의 예상 비용을 산정한다.
각 실행계획을 비교해서 최저 비용을 갖는 하나를 선택하여 실행한다.

 


옵티마이저의 종류


1. 규칙기반 옵티마이저(RBO)
미리 정해진 규칙에 따라 실행

2. 비용기반 옵티마이저(CBO)
비용이 가장 낮은 실행계획을 선택

 


SQL문(쿼리문)

- TCL(Transaction Control Language) : 트랙잭션 제어어

 

 

트랜잭션 : 하나의 작업(서비스)에 필요한 쿼리를 묶은 단위

commit
: 모든 작업을 확정하는 명령어

rollback
: 이전 커밋 시점으로 이동


   > show variables like '%autocommit%';


   > set autocommit = true;
   > set autocommit = false;



VIEW


기존의 테이블은 그대로 놔둔 채 필요한 컬럼들 새로운 컬럼을 만든 가상 테이블.
실제 데이터가 저장되는 것은 아니지만 VIEW를 통해서 충분히 데이터를 관리할 수 있다.

- 독립성: 다른 곳에서 접근하지 못하도록 하는 성질
- 편리성: 긴 쿼리문을 짧게 만드는 성질
- 보안성: 기존의 쿼리문이 모이지 않는다.

VIEW 문법
create view [뷰 이름] as (select 쿼리문)









 

'🟡개발 도구 > DBMS' 카테고리의 다른 글

파이참에서 aws, MySQL 연결하기  (0) 2024.01.19
데이터베이스와 MongoDB  (0) 2023.12.02

1. Jinja

Jinja는 Python에서 사용되는 템플릿 엔진 중 하나로, 템플릿과 데이터를 결합하여 동적인 콘텐츠를 생성하는 데 사용됩니다. 주로 웹 프레임워크에서 HTML 페이지를 동적으로 렌더링하는 데 활용됩니다.

https://jinja.palletsprojects.com/en/3.1.x/

 

2. 설치

Jinja2를 설치합니다.

# Window
pip install jinja2

# macOS
pip3 install jinja2

 

 

3. 간단한 예제

templates라는 디렉토리를 프로젝트 루트에 만들고 그 안에 index.html 파일을 추가합니다.

 

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{{ data. title }}</title>
    <link rel="stylesheet" href="/css/style.css">
</head>
<body>
    <h2>안녕! {{ data.name}}</h2>
    <p>{{ request.url }}</p>
</body>
</html>

 

 

main.py 생성 후 작성

from fastapi import FastAPI, Request
from fastapi.templating import Jinja2Templates
from fastapi.staticfiles import StaticFiles
# Jinja2Templates는 html과 연결시켜주는 역할
# 정적파일을 저장해주는 공간을 생성 StaticFiles -> 가상화시켜서 경로를 만들어줌

# http:// http://127.0.0.1:8000/
app = FastAPI()
templates = Jinja2Templates(directory="templates")

app.mount("/css", StaticFiles(directory="static"), name ="css") # 연결 #/css는 가상의 경로가 됨

@app.get("/")
async def read_root(request: Request):
   # 템플릿에 전달할 데이터
    data = {"name": "뚠빵이", "title": "푸바오 당근뺏기"}
    
    # 템플릿 렌더
    return templates.TemplateResponse("index.html", {"request": request, "data": data})

 

 

http://127.0.0.1:8000/에 액세스하면 FastAPI가 Jinja를 사용하여 동적으로 렌더링한 HTML 페이지를 볼 수 있습니다. 위의 예제에서는 index.html 파일에 정의된 변수 {{ name }}과 {{ title }}에 데이터를 전달하여 동적으로 내용을 생성합니다.

 

uvicorn main:app --reload

 

 

4. 로그인 예제

templates라는 디렉토리를 프로젝트 루트에 만들고 그 안에 login.html 파일과 info.html파일을 추가합니다.

 

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>로그인</title>
</head>
<body>
    <h2>로그인</h2>
    <form action="/login" method="post">
        <p>아이디: <input type="text" name="userid"></p>
        <p>비밀번호: <input type="password" name="userpw"></p>
        <p><button type="submit">로그인</button></p>
    </form>
</body>
</html>

 

info.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>회원정보</title>
</head>
<body>
    <h2>회원정보</h2>
    <p>입력한 아이디는 {{ userid }} 이고, 비밀번호는 {{ userpw }} 입니다!</p>
</body>
</html>

 

 

main.py 파일 생성

 

main.py

from fastapi import FastAPI, Request, Form
from fastapi.templating import Jinja2Templates

app = FastAPI()

templates = Jinja2Templates(directory="templates")

@app.get("/login")
async def login_form(request: Request):
    return templates.TemplateResponse("login.html", {"request": request})

@app.post("/login")
async def login(request: Request, userid: str = Form(...), userpw: str = Form(...)):
    return templates.TemplateResponse("info.html", {"request": request, "userid": userid, "userpw": userpw})
#(...)은 무조건 입력해야 하는것 html의 name = useri와 일치해야함

'🟡웹 개발 > 웹 서비스' 카테고리의 다른 글

FastAPI  (0) 2023.12.16
Streamlit  (2) 2023.12.03
픽사베이  (1) 2023.12.03
인스타그램  (1) 2023.12.03
셀레니움  (0) 2023.12.02

1. Fast API

FastAPI는 Python 기반의 웹 프레임워크로, 주로 API를 빠르게 개발하기 위해 설계되었습니다. FastAPI는 강력한 타입 힌팅(Type Hints)을 활용하여 개발자에게 코드 작성의 안정성과 가독성을 제공합니다.

https://fastapi.tiangolo.com/ko/

 

  타입 힌팅(Type Hints)

타입 힌팅(Type Hints)은 프로그래밍 언어에서 변수, 함수 매개변수, 함수 반환값 등에 대한 데이터 타입 정보를 코드에 명시적으로 제공하는 기술입니다. Python 3.5 이상에서 도입된 기능으로, 코드의 가독성을 높이고 프로그램의 안정성을 강화하는 데 도움이 됩니다.

 

 

2. Fast API vs Flask vs Django

FastApi

장점

FastAPI는 최신 Python 기반 프레임워크로 빠른 성능과 사용하기 쉬운 API로 유명합니다. 비동기 프로그래밍을 지원하므로 실시간 애플리케이션 구축에 적합합니다. 또한 자동 API 문서화 및 유효성 검사를 제공하여 개발자의 시간과 노력을 절약합니다.

단점

FastAPI는 비교적 새로운 프레임워크이며 기존 프레임워크에 비해 커뮤니티 지원 및 리소스가 많지 않을 수 있습니다. 또한 비동기 프로그래밍을 처음 접하는 개발자를 위한 학습 곡선도 있습니다.

활용도

FastAPI는 특히 데이터 집약적인 애플리케이션을 위한 실시간 및 고성능 API 구축에 적합합니다.

 

Django

장점

Django는 웹 애플리케이션 개발에 널리 사용되는 성숙한 Python 기반 프레임워크입니다. 인증, 관리자 패널 및 ORM과 같은 많은 기본 기능을 제공합니다. 또한 지원 및 리소스를 제공하는 크고 활동적인 커뮤니티가 있습니다.

단점

Django는 복잡할 수 있으며 설정하려면 상당한 구성이 필요합니다. 소규모 프로젝트나 경량 API
축에는 적합하지 않을 수도 있습니다.

활용

Django는 웹 애플리케이션, 특히 콘텐츠 기반 웹사이트, 전자상거래 플랫폼 및 소셜 미디어 플랫폼을 구축하는 데 널리 사용됩니다.

 

Flask

장점

Flask는 배우고 사용하기 쉬운 경량 Python 기반 프레임워크입니다. 유연성을 제공하고 개발자가 모듈식 및 확장 가능한 방식으로 웹 애플리케이션을 구축할 수 있도록 합니다. 또한 사용자 정의가 가능하고 소규모 프로젝트를 구축하는 데 적합합니다.

단점

Flask는 다른 프레임워크에 비해 기본 제공 기능이 적기 때문에 개발자가 구현하는 데 더 많은 노력과 시간이 필요할 수 있습니다. 또한 대규모 웹 애플리케이션을 구축하는 데 적합하지 않을 수도 있습니다.

활용

Flask는 개인 웹 사이트, 간단한 API 및 내부 대시보드와 같은 소규모 웹 애플리케이션 및 프로토타입을 구축하는 데 적합합니다.

 

요약

FastAPI는 실시간 및 고성능 API를 구축하는 데 적합한 현대적이고 빠른 프레임워크이고, Django는 복잡한 웹 애플리케이션을 구축하는 데 적합한 성숙한 프레임워크이며, Flask는 소규모 웹 애플리케이션 및 프로토타입을 구축하는 데 적합한 가볍고 유연한 프레임워크입니다. . 그들 사이의 선택은 개발 팀의 기술과 경험뿐만 아니라 프로젝트의 특정 요구 사항과 요구 사항에 따라 다릅니다.

 

3. 설치

FastAPI를 설치하기 전에 Python 가상환경을 만들어줍니다. 가상환경을 사용하면 프로젝트 간에 의존성 충돌을 방지하고 프로젝트 별로 필요한 패키지를 독립적으로 관리할 수 있습니다.

# Windows
python -m venv venv

# macOS/Linux
python3 -m venv venv

 

 

가상환경이 생성되면 해당 가상환경을 활성화합니다.

# Windows
venv\Scripts\activate

# macOS/Linux
source venv/bin/activate

 

 

FastAPI를 사용하려면 먼저 FastAPI 패키지를 설치해야 합니다.

pip install fastapi

 

 

FastAPI 애플리케이션을 실행하기 위해 uvicorn이라는 ASGI 서버가 필요합니다.

pip install "uvicorn[standard]"

 

 

uvicorn[standard]

1. 이 패키지는 uvicorn에 기본적으로 포함된 기능 외에도 추가적인 표준 미들웨어를 포함합니다.

2. 표준 미들웨어는 보안, 로깅 및 기타 서버 관련 기능을 추가하는 데 도움이 됩니다.

3. 예를 들어, Gzip 압축, CORS(Cross-Origin Resource Sharing) 지원 등이 기본적으로 포함되어 있습니다.

 

uvicorn

1. 기본적으로 필요한 최소한의 기능만을 제공하는 패키지입니다.

2. uvicorn[standard]에 비해 미들웨어가 적고, 기본적인 서버 기능만을 제공합니다.

 

 

※ ASGI 서버

ASGI는 Asynchronous Server Gateway Interface의 약자로, 비동기 웹 애플리케이션과 서버 간의 표준 인터페이스를 제공하는 프로토콜입니다. ASGI는 Python 웹 애플리케이션을 구축할 때 비동기 처리를 지원하고, 실시간 기능을 구현할 수 있도록 하는 중간 계층 역할을 합니다.

기존의 WSGI(웹 서버 게이트웨이 인터페이스)는 동기적인 요청과 응답을 다루는 데에 효과적이었습니다. 하지만 현대의 웹 애플리케이션에서는 동시성(concurrency)이나 비동기(asynchronous) 처리가 중요한 역할을 하게 되면서 WSGI의 한계가 드러나게 되었습니다.

 

 

 

4. 기본 예제

main.py

from fastapi import FastAPI

users = {
    0: {"userid": "apple", "name": "푸바오"},
    1: {"userid": "banana", "name": "아이바오"},
    2: {"userid": "orange", "name": "러바오"}
}

app = FastAPI()

# http://127.0.0.1:8000/users/0
# uvicorn main:app --reload
@app.get("/users/{id}")
def find_user(id: int):
    user = users[id]
    return user

# http://127.0.0.1:8000/users/0/userid
# http://127.0.0.1:8000/docs
@app.get("/users/{id}/{key}")
def find_user_by_key(id: int, key: str):
    user = users[id][key]
    return user

 

 

5. 실행

작성한 FastAPI 애플리케이션을 실행합니다. 다음 명령을 사용하여 uvicorn을 통해 실행할 수 있습니다.

uvicorn main:app --reload

 

FastAPI는 자동으로 생성된 Swagger UI를 통해 API 문서를 제공합니다. 기본적으로 http://127.0.0.1:8000/docs 또는 http://127.0.0.1:8000/redoc에서 확인할 수 있습니다. Swagger UI를 통해 API의 엔드포인트, 매개변수, 응답 형식 등을 살펴볼 수 있습니다.

 

 

6. REST와 RESTful API

REST: "Representational State Transfer" 약자로,  상에서 자원을 표현하고 상태를 전송하기 위한 아키텍처적인 스타일입니다. REST 네트워크 아키텍처의  형식으로, 리소스(자원) 정의하고 이를 고유하게 식별하는  중점을 두며, HTTP 프로토콜을 기반으로 하고 있습니다. REST 간결하고 확장 가능한 디자인을 지향하여  서비스를 위한 표준 아키텍처로 널리 사용되고 있습니다.

 

RESTful API(REST API): REST 아키텍처를 따르는  서비스의 인터페이스를 말합니다.  API 클라이언트와 서버 간의 통신을 위한 규칙을 제공하며, 자원의 생성, 조회, 수정, 삭제(CRUD) 같은 기본적인 데이터 조작을 위한 메서드를 제공합니다. RESTful API HTTP 기반으로 하기 때문에 웹에서 쉽게 사용할  있습니다. 클라이언트와 서버 간의 통신은 자원의 표현을 통해 이루어지며 표현은 일반적으로 JSON 또는 XML 형식으로 이루어집니다.

 

예를 들어, 다음은 간단한 RESTful API의 예시입니다:

자원(리소스): /users

HTTP 메서드: GET (모든 사용자 조회), POST (새로운 사용자 생성), PUT 또는 PATCH (사용자 정보 업데이트), DELETE (사용자 삭제)

 

 

7. JSON

JSON은 "JavaScript Object Notation" 약어로, 데이터를 표현하고 교환하기 위한 경량의 데이터 형식입니다. 주로 서버와 클라이언트 간에 데이터를 주고 받을  사용되며, 텍스트 형태로 이루어져 있습니다. JSON은 간결하면서도 읽기 쉽고 파싱하기 쉬운 구조를 가지고 있어 많은 프로그래밍 언어에서 지원하고 있습니다.

{
  "키1": "값1",
  "키2": "값2",
  "키3": {
    "키4": "값4",
    "키5": "값5"
  },
  "배열키": [
    "배열값1",
    "배열값2",
    "배열값3"
  ]
}

 

 

8. HTTP Method

FastAPI에서는  메서드에 대응하는 데코레이터를 제공하여 해당 엔드포인트에 대한 핸들러 함수를 등록할  있습니다. 이러한 데코레이터를 사용하여 각각의 HTTP 메서드에 대한 동작을 정의할  있습니다.

from fastapi import FastAPI
from pydantic import BaseModel
from typing import Optional

users = {
    0: {"userid": "apple", "name": "푸바오"},
    1: {"userid": "banana", "name": "아이바오"},
    2: {"userid": "orange", "name": "러바오"}
}

app = FastAPI()
# http://127.0.0.1:8000/user/?
@app.get("/users/{id}")
def find_user(id: int):
    item = users[id]
    return item

# http://127.0.0.1:8000/users/0/userid
@app.get("/users/{id}/{key}")
def find_user_by_key(id:int, key:str):
    user = users[id][key]
    return user

# http://127.0.0.1:8000/id-by-name?name=푸바오
@app.get("/id-by-name")
def find_user_by_name(name:str):
    for userid, user in users.items():
        if user['name'] == name:
            return user
    return {"error : 데이터를 찾지 못함"}

class User(BaseModel):
    userid : str
    name : str

@app.post("/{id}")
def create_user(id: int, user: User):
    if id in users:
        return {"error" : "이미 존재하는 키"}
    users[id] = user.__dict__       # user객체를 딕셔너리로 만듬
    return {"success" : "ok"}


class UserForUpdate(BaseModel):
    userid: Optional[str]
    name: Optional[str]

@app.put("/{id}")
def update_user(id:int, user: UserForUpdate):
    if id not in users:
        return {"error" : "id가 존재하지 않음"}
    if user.userid : 
        users[id]['userid'] = user.userid
    if user.name:
        users[id]['name'] = user.name
    return {"success" : "ok"}

@app.delete("/users/{id}")
def delete_item(id:int):
    users.pop(id)
    return {"success": "ok"}

'🟡웹 개발 > 웹 서비스' 카테고리의 다른 글

Jinja 템플릿 엔진  (0) 2023.12.18
Streamlit  (2) 2023.12.03
픽사베이  (1) 2023.12.03
인스타그램  (1) 2023.12.03
셀레니움  (0) 2023.12.02

1. HTML

HTML은 HyperText Markup Language(하이퍼텍스트 마크업 언어)의 약자로, 웹 페이지의 구조를 정의하는 마크업 언어입니다. HTML은 웹 브라우저가 웹 페이지를 해석하고 표시하는 데 사용되며, 텍스트, 이미지, 링크, 표, 목록 등의 다양한 요소를 포함할 수 있습니다.

 

HTML 문서는 태그(tag)라 불리는 특별한 코드로 구성되어 있습니다. 각 태그는 각자의 의미를 가지며, 웹 브라우저에게 문서의 구조를 알려줍니다. 각 태그는 일반적으로 다음과 같은 형식을 가집니다.

 

2. HTML 기본 구조

<!DOCTYPE html>
<html>
<head>
    <title>문서 제목</title>
</head>
<body>

    <h1>이것은 제목입니다</h1>
    <p>이것은 단락입니다.</p>

</body>
</html>

<!DOCTYPE html>: HTML5 문서 유형을 정의합니다.
<html>: HTML 문서의 시작과 끝을 나타냅니다.
<head>: 문서의 메타데이터와 관련된 정보를 포함하는 부분입니다.
<title>: 문서의 제목을 정의합니다. 이는 브라우저 탭이나 창의 제목에 표시됩니다.
<body>: 실제로 웹 페이지에 표시되는 내용을 담고 있는 부분입니다.
<h1>, <p>: 각각 제목과 단락을 나타내는 태그입니다.

 

 

3. 문단 태그

문단(paragraph) 태그는 텍스트를 문단으로 묶는 데 사용되는 HTML 태그입니다. 주로 글의 내용을 구조화하고 가독성을 높이기 위해 활용됩니다.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>문단 태그</title>
</head>
<body>
    <p>1. 문단 태그</p>
    <p>문단을 만드는 태그</p>
    블록 태그
    블록 태그
</body>
</html>

 

 

4. 제목 태그

HTML에서 제목을 나타내는 데 사용되는 태그는 <h1>에서 <h6>까지입니다. 이는 Heading(헤딩) 태그로 불리며, 숫자가 커질수록 제목의 수준이 낮아집니다.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>제목 태그</title>
</head>
<body>
    <h1>안녕하세요. 제목태그 h1</h1>
    <h2>안녕하세요. 제목태그 h2</h2>
    <h3>안녕하세요. 제목태그 h3</h3>
    <h4>안녕하세요. 제목태그 h4</h4>
    <h5>안녕하세요. 제목태그 h5</h5>
    <h6>안녕하세요. 제목태그 h6</h6>
</body>
</html>

 

 

5. 서식 태그

"서식 태그"는 HTML 문서에서 텍스트의 서식을 지정하는 태그들을 가리킵니다. 여러 서식 태그들이 텍스트의 스타일, 강조, 목록, 링크 등을 정의하는 데 사용됩니다.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>서식태그</title>
</head>
<body>
    <h2>서식 태그</h2>
    <p>b 태그는 글자를 <b>굵게</b> 표현합니다</p>
    <p>strong 태그는 글자를 <strong>굵게</strong> 표현합니다</p>
    <p>i 태그는 글자를 <i>이탤릭체</i>로 표현합니다</p>
    <p>em 태그는 글자를 <em>이탤릭체</em>로 표현합니다</p>
    <p>ins 태그를 사용하면 <ins>중요한 글자</ins>를 표현할 수 있습니다</p>
    <p>del 태그를 사용하면 <del>글자를 지운 것</del>처럼 표현합니다</p>
    <p>sup 태그를 사용해서 수식을 표현: x<sup>2</sup> + y<sup>3</sup> = z</p>
    <p>sub 태그를 사용해서 화학식을 표현: H<sub>2</sub>O</p>
</body>
</html>

 

6. 목록 태그

HTML에서 목록을 만들기 위해 사용되는 주요 목록 태그에는 <ul><ol><li>가 있습니다. 이러한 태그들은 웹 페이지에서 항목을 순서 있는 목록(ordered list)이나 순서 없는 목록(unordered list)으로 구성하는 데 사용됩니다.

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>목록 태그</title>
</head>

<body>
    <h2>목록 태그</h2>
    <ul>
        <li>러바오</li>
        <li>아이바오</li>
        <li>푸바오</li>
    </ul>

    <hr>
    <ol>
        <li>러바오</li>
        <li>아이바오</li>
        <li>푸바오</li>
    </ol>

    <hr>
    <dl>
        <dt>러바오</dt>
        <dd>아이바오</dd>
        <dd>푸바오</dd>
        <dd>대나무</dd>
    </dl>
</body>
</html>

 

 

7. 이미지 태그

이미지를 웹 페이지에 삽입하기 위해 사용되는 HTML 태그는 <img>입니다. <img> 태그는 이미지의 소스(src) 및 대체 텍스트(alt)와 같은 속성을 사용하여 이미지를 정의합니다.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>이미지 태그</title>
</head>
<body>
    <h2>이미지 태그</h2>
    <img src="https://img.png" alt="로고">
    <img src="./rain1.png" alt="비 이미지">
    <img src="./images/rain2.png" alt="비 이미지">
</body>
</html>

 

 

 

8. 하이퍼 링크

하이퍼링크(하이퍼텍스트 링크)를 생성하기 위해 사용되는 HTML 태그는 <a>(앵커) 태그입니다. <a> 태그는 사용자를 다른 웹 페이지로 이동하거나 같은 페이지 내에서 다른 부분으로 이동하게 하는 링크를 생성하는 데 사용됩니다.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>하이퍼링크</title>
</head>
<body>
    <h2>하이퍼링크</h2>
    <!-- 절대 경로 -->
    <a href="http://koreaisacademy.co.kr">코리아IT아카데미</a>
    <a href="https://www.daum.net"><img src="https://t1.daumcdn.net/daumtop_chanel/op/20200723055344399.png" alt="다음 로고"></a>

    <!-- 상대 경로 -->
    <a href="./subpage/1-1. 이미지태그.html">서브페이지로 이동</a>
    <a href="./subpage/1-1. 이미지태그.html"><img src="./rain5.png" alt="비 이미지"></a>
</body>
</html>

 

 

9. 테이블

HTML에서 테이블을 만들기 위해 사용되는 태그는 <table>입니다. 테이블은 행과 열로 구성되며, 각 셀에 데이터를 담을 수 있습니다. 테이블을 만들 때는 <table>을 시작 태그로 사용하고, 각 행은 <tr>(table row) 태그로, 각 셀은 <td>(table data) 태그로 정의합니다.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>테이블 1</title>
</head>
<body>
    <h2>테이블 1</h2>
    <table>
        <tr>
            <td>첫번째 셀</td>
        </tr>
    </table>
    <hr>
    <table border="1" width="300">
        <tr>
            <td>첫번째 셀</td>
        </tr>
    </table>
    <hr>
    <table border="1">
        <tr>
            <td>첫번째 셀</td><td>두번째 셀</td>
        </tr>
        <tr>
            <td>세번째 셀</td><td>네번째 셀</td>
        </tr>
        <tr>
            <td>다섯번째 셀</td><td>여섯번째 셀</td>
        </tr>
    </table>
    <hr>
    <table border="1">
        <tr>
            <td colspan="2">첫번째 셀</td>
        </tr>
        <tr>
            <td>세번째 셀</td><td>네번째 셀</td>
        </tr>
        <tr>
            <td>다섯번째 셀</td><td>여섯번째 셀</td>
        </tr>
    </table>
    <hr>
    <table border="1">
        <tr>
            <td>첫번째 셀</td><td>두번째 셀</td>
        </tr>
        <tr>
            <td rowspan="2">세번째 셀</td><td>네번째 셀</td>
        </tr>
        <tr>
            <td>여섯번째 셀</td>
        </tr>
    </table>
</body>
</html>

 

 

10. 아이프레임

아이프레임(<iframe>) 태그는 다른 HTML 문서를 현재 문서에 삽입하는 데 사용됩니다. 이를 통해 외부 웹 페이지, 동영상, 지도 등을 현재 페이지에 내장할 수 있습니다. <iframe> 태그는 웹페이지의 일부분을 다른 웹페이지로 대체하거나, 다른 소스의 콘텐츠를 보여주는 데에 유용합니다.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>아이프레임</title>
</head>
<body>
    <h2>아이프레임</h2>
    <p><a href="./테이블.html">테이블 연습 페이지(현재창)</a></p>
    <p><a href="./테이블.html" target="_blank">테이블 연습 페이지(새탭)</a></p>
    <p><a href="./테이블.html" target="korea">테이블 연습 페이지(아이프레임)</a></p>
    <p><a href="http://www.koreaisacademy.com" target="korea">코리아IT아카데미(아이프레임)</a></p>
    <p><iframe src="http://www.koreaisacademy.com" style="width:100%; height:600px; border: 3px dashed red;" name="korea"></iframe></p>
</body>
</html>

 

 

11. 폼

HTML에서 폼(form)은 사용자로부터 정보를 입력 받을 수 있는 구조를 제공하는 데 사용됩니다. 폼을 생성하기 위해 사용되는 주요 태그는 <form>입니다. 폼은 텍스트 입력, 비밀번호 입력, 라디오 버튼, 체크박스, 드롭다운 메뉴 등 다양한 입력 요소를 포함할 수 있습니다.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>폼태그</title>
</head>
<body>
    <h2>폼태그</h2>
    <form action="./regist" method="post">
        <input type="hidden" name="hdd" value="서버로 전달될 값">

        <p>아이디: <input type="text" maxlength="20" placeholder="아이디를 입력하세요" name="userid" id="userid" required></p>
        <p>비밀번호: <input type="password" maxlength="20" placeholder="비밀번호를 입력하세요" name="userpw" id="userpw" required></p>
        <p>성별: <label for="male">남자</label><input type="radio" name="gender" value="남자" id='male' checked> <label for="female">여자</label><input type="radio" name="gender" value="여자" id="female"></p>
        <p>취미: <label for="hobby1">게임</label><input type="checkbox" name="hobby" id="hobby1" value="게임" checked>  <label for="hobby2">술</label><input type="checkbox" name="hobby" id="hobby2" value="술"> <label for="hobby3">다꾸</label><input type="checkbox" name="hobby" id="hobby3" value="다꾸"> <label for="hobby4">배드민턴</label><input type="checkbox" name="hobby" id="hobby4" value="배드민턴"> <label for="hobby5">드라마시청</label><input type="checkbox" name="hobby" id="hobby5" value="드라마시청"></p>
        <p>첨부파일: <input type="file" name="file"></p>
        <p>이메일: <input type="email" name="email"></p>
        <p>웹사이트: <input type="url" name="url" value='http://www.naver.com' readonly></p>
        <p>전화번호: <input type="tel" name="tel" disabled></p>
        <p>생년월일: <input type="date" name="birthday"></p>
        <p>좋아하는 숫자: <input type="number" min="1" max="10" step="1"></p>
        <p>쿠폰번호: <input type="search" name="search"></p>
        <p>좋아하는 색상: <input type="color" name="color"></p>
        <p>프로그래밍 능력: <input type="range" min="0" max="10" value="3"></p>
        <p>직업: 
            <select name="job" id="job">
                <option value="프로그래머">프로그래머</option>
                <option value="공무원">공무원</option>
                <option value="의사">의사</option>
                <option value="법조인">법조인</option>
                <option value="취준생">취준생</option>
            </select>
        </p>
        <p>자기소개</p>
        <p><textarea name="content" id="content" cols="50" rows="5"></textarea></p>
        <p><input type="button" value="클릭하세요" onclick="alert('안녕?')"> <input type="reset" value="다시입력"> <input type="submit" value="회원가입"></p>
    </form>
</body>
</html>

 

 

12. 디스플레이

디스플레이 관련 태그는 웹 페이지에서 콘텐츠의 표시 방법과 레이아웃을 제어하는 데 사용됩니다. 주로 CSS (Cascading Style Sheets)와 함께 사용되며, 웹 페이지의 디자인 및 레이아웃을 조정하는 데에 큰 역할을 합니다.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>디스플레이</title>
</head>
<body>
    <h2>디스플레이</h2>
    1. <span style="font-size: 30px; color: deeppink">span 태그 영역</span>입니다.
    <div style="width: 600px; height: 300px; background-color: gold;">2. div 태그 영역</div>
</body>
</html>

 

 

13. 시맨틱 태그

시맨틱 태그(semantic tags)는 HTML5에서 도입된 태그로, 문서의 구조와 의미를 더 명확하게 전달하기 위해 사용됩니다. 이러한 태그들은 웹 페이지의 콘텐츠를 구조화하고 의미를 부여하여 검색 엔진 및 개발자에게 페이지의 내용을 이해하기 쉽게 만듭니다.

 

<header>: 문서나 섹션의 머리말을 정의합니다.
<nav>: 내비게이션 링크를 정의합니다.
<article>: 독립적으로 구분되거나 재사용 가능한 컨텐츠 영역을 정의합니다.
<section>: 문서의 섹션을 정의합니다.
<aside>: 주변 내용과는 관련이 적은 부가 정보를 포함하는 콘텐츠를 정의합니다.
<footer>: 문서나 섹션의 꼬리말을 정의합니다.

1. 동기(Synchronous)

동기적인 작업은 순차적으로 실행되며, 한 작업이 끝나야 다음 작업이 시작됩니다.

간단한 비유로 설명하자면, 일을 처리하는데 한 가지 작업이 끝나기를 기다리면서 그때까지 다른 작업을 처리하지 않는 것과 비슷합니다. 대표적으로 함수를 호출하면 해당 함수의 실행이 끝날 때까지 제어가 반환되지 않습니다.

 

def func1():

    print('1')
    print('2')
    print('3')


def main():
    func1()


main()

# 동기는 스택처럼 쌓임
# 호출 호출 호출 >> 맨 끝 함수부터 스택구조로 순차적으로 실행

 

import time

def nagging():
  time.sleep(1)     # 동기함수
  print('🐼')


def main():
  nagging()
  nagging()


print(f"start : {time.strftime('%X')}")
main()
print(f"end : {time.strftime('%X')}")
더보기
start : 13:16:04
🐼
🐼
end : 13:16:06

 

 

2. 비동기(Asynchronous)

비동기적인 작업은 한 작업이 시작되면 바로 다음 작업으로 넘어가며, 작업이 완료되기를 기다리지 않습니다.
이는 주로 이벤트 핸들링, 네트워크 호출, 파일 읽기/쓰기 등의 상황에서 유용합니다.
대표적인 예로 비동기 함수 호출이 있습니다.

# sleep이 동기함수 이므로 asyncio.sleep 비동기용 슬립함수를 사용


import time

import asyncio

# asycn def : 코루틴
async def nagging():        
    await asyncio.sleep(1)  # 비동기 함수
    print('🐼')


async def main():
    await asyncio.gather(
        nagging(),
        nagging()
    )

    
print(f"start : {time.strftime('%X')}")
asyncio.run(main())
print(f"end : {time.strftime('%X')}")

 

await (동기처럼 멈춰주는 역할)

await는 Python에서 비동기 프로그래밍을 할 때 사용되는 키워드로, 주로 async 함수 내에서 다른 비동기 함수의 실행을 기다리는 데에 쓰입니다. await 키워드를 사용하면 현재 실행 중인 코루틴(coroutine)이 다른 코루틴의 완료를 기다리면서 실행을 일시 중단할 수 있습니다. 비동기 함수를 정의할 때는 함수 선언 앞에 async 키워드를 붙이고, 그 안에서 다른 비동기 함수를 호출할 때는 await를 사용합니다. await는 오직 async 함수 내에서만 사용됩니다. 일반적인 동기 함수나 스크립트에서는 사용할 수 없습니다.

 

run()

asyncio.run은 Python의 asyncio 모듈에서 제공하는 함수로, Python 3.7 이후 버전에서 도입되었습니다. 이 함수는 asyncio 이벤트 루프를 생성하고 실행하는 역할을 합니다. 주로 콘솔 스크립트나 간단한 애플리케이션에서 사용됩니다.

asyncio.run(main(), debug=False)
# main(): 실행하고자 하는 비동기 함수입니다. 이 함수는 asyncio 이벤트 루프에서 실행됩니다.
# debug: 선택적 매개변수로, 디버그 모드를 설정합니다. 기본값은 False입니다.

'🟡프로그래밍 언어 > python' 카테고리의 다른 글

20. 변수 타입 어노테이션  (0) 2023.12.13
19. 파이썬 모듈  (0) 2023.12.13
18. 파이썬 예외처리  (0) 2023.12.12
17. 스페셜 메서드  (0) 2023.12.12
16. 파이썬 상속  (0) 2023.12.12

1. 변수 타입 어노테이션

변수 타입 어노테이션은 파이썬 3.5부터 도입된 기능으로, 변수의 예상 타입을 명시하는데 사용됩니다. 이는 주로 코드의 가독성을 높이고, 정적 타입 검사 도구(예: mypy)를 사용하여 타입 오류를 사전에 잡아내기 위한 목적으로 사용됩니다.

타입 어노테이션은 실제로 변수의 타입을 강제하는 것이 아니라, 개발자가 변수가 어떤 타입을 가져야  것으로 예상하는지 명시하는 것입니다.

 

2. 기본 타입 어노테이션

name : str = '푸바오'
age : int = 3
height : float = 120.5
is_lover : bool = True


print(name)
print(type(name))
더보기
푸바오
<class 'str'>

 

 

3. 리스트, 튜플, 딕셔너리, 세트

컬렉션 타입에 대한 어노테이션은 조금  복잡합니다. 이를 위해 List, Tuple, Dict, Set 등의 제네릭 타입을 사용하게 됩니다. 이러한 타입들은 typing 모듈에서 가져올  있습니다.

from typing import List, Tuple, Dict, Set

names : List[str] = ['푸바오', '루이바오', '후이바오']
age : Tuple[int, int] = (25, 20)
scores : Dict[str, float] = {'푸바오' : 50, '아이바오' : 100}
numbers : Set[int] = {1, 2, 3, 3, 4}


print(names)
print(age)
print(scores)
print(numbers)
더보기
['푸바오', '루이바오', '후이바오']
(25, 20)
{'푸바오': 50, '아이바오': 100}
{1, 2, 3, 4}

 

 

4. 함수

함수의 매개변수와 반환 타입에 대한 어노테이션은 다음과 같이 합니다.

def add(a: int, b: int) -> int: # a는 int, b는 int, 결과(리턴값)는 int 자료형으로 처리
    return a + b
    
print(add(10, 5))
print(add('10','삼'))

print(add.__annotations__) # 타입 어노테이션을 확인
더보기
15
10삼
{'a': <class 'int'>, 'b': <class 'int'>, 'return': <class 'int'>}

 

 

5. 클래스

클래스 또는 사용자 정의 타입에 대한 어노테이션도 가능합니다.

class Student:
    def __init__(self, name: str, age: int):
        self.name = name
        self.age = age
    def __str__(self) -> str:
        return '이름:' + self.name + ', 나이:' + str(self.age)

def print_student(s: Student) -> None:
    print(f"이름:{s.name}, 나이:{s.age}")

student = Student('푸바오', 3)
print(student)
print_student(student)
더보기
이름:푸바오, 나이:3
이름:푸바오, 나이:3

 

 

6. 옵셔널

변수가 특정 타입이거나 None  있는 경우 Optional 사용합니다.

from typing import Optional

def find_score(name : str, scores : Dict[str, float]) -> Optional[float] :
    return scores.get(name)
    
print(find_score('푸바오', {'푸바오':80.5, '대나무':40.5, '아이바오':90.5}))
print(find_score('러바오', {'푸바오':80.5, '대나무':40.5, '아이바오':90.5}))
더보기
80.5
None

'🟡프로그래밍 언어 > python' 카테고리의 다른 글

21. 파이썬 동기/비동기  (0) 2023.12.13
19. 파이썬 모듈  (0) 2023.12.13
18. 파이썬 예외처리  (0) 2023.12.12
17. 스페셜 메서드  (0) 2023.12.12
16. 파이썬 상속  (0) 2023.12.12

1. 모듈

파이썬에서 모듈을 만들려면 간단히 .py 확장자를 가진 파일에 코드를 작성하면 됩니다. 모듈은 단순한 함수 뿐만 아니라 변수, 클래스 등도 포함할  있으며, 다른 스크립트에서 import 구문을 사용하여 가져올  있습니다.

 

 

 

 math_tools.py

# 변수

PI = 3.141592


# 함수

def add(a, b):
return a + b


def subtract(a, b):
return a - b


# 클래스
class Circle:
def __init__(self, radius):
self.radius = radius


def area(self):
return PI * self.radius * self.radius

.

 

구글 드라이브 마운트해서 사용하기

→ 구글드라이브에 math_tools.py 업로드 후 경로지정

path = '/content/drive/MyDrive/컴퓨터비전 시즌1/1.파이썬 기초/module/'

import sys
sys.path.append(path)
import math_tools
 

 

# 모듈 내의 변수
print(math_tools.PI)
더보기
3.141592653589793
# 모듈 내의 함수
print(math_tools.add(5,3))
print(math_tools.subtract(5,3))
# 모듈 내의 클래스
circle = math_tools.Circle(5)
print(circle.area())
더보기
78.53981633974483
# 필요한 속성, 클래스만 가져오기
from math_tools import PI, Circle

print(PI)
circle = Circle(5)
print(circle.area())
더보기
3.141592653589793
78.53981633974483
import math_tools as mt

# 모듈 내의 함수 사용
print(mt.add(5, 3))  # 8
print(mt.subtract(5, 3))  # 2

# 모듈 내의 클래스 사용
circle = mt.Circle(5)
print(circle.area())
더보기
8
2
78.53981633974483

'🟡프로그래밍 언어 > python' 카테고리의 다른 글

21. 파이썬 동기/비동기  (0) 2023.12.13
20. 변수 타입 어노테이션  (0) 2023.12.13
18. 파이썬 예외처리  (0) 2023.12.12
17. 스페셜 메서드  (0) 2023.12.12
16. 파이썬 상속  (0) 2023.12.12

1. 예외

예외(Exception) 프로그램 실행  발생할  있는 예상치 못한 문제 또는 오류 상황을 의미합니다. 예외가 발생하면 프로그램은 중단되기 때문에 이를 적절하게 처리하여 중단을 방지하거나 오류에 대한 정보를 사용자에게 제공해야 합니다.

 

2. 예외가 발생하는 경우

  • ValueError
    • 잘못된 값을 함수나 연산에 제공할 때 발생합니다.
    • 예) 숫자가 아닌 문자열을 int() 함수로 변환하려고 할 때 발생.
  • TypeError
    • 올바르지 않은 유형의 객체를 연산에 사용하려 할 때 발생합니다.
    • 예) 문자열과 숫자를 함께 더하려고 할 때 발생.
  • ZeroDivisionError
    • 숫자를 0으로 나누려고 할 때 발생합니다.
  • IndexError
    • 리스트, 튜플, 문자열 등의 시퀀스 유형에서 범위를 벗어난 인덱스에 접근하려 할 때 발생합니다.
    • 예) 길이가 3인 리스트에 대해 4번째 요소에 접근하려고 할 때 발생.
  • KeyError
    • 딕셔너리에서 존재하지 않는 키를 사용하여 값을 검색하려고 할 때 발생합니다.
  • AttributeError
    • 객체에 없는 속성이나 메서드에 접근하려고 할 때 발생합니다.
  • FileNotFoundError
    • 존재하지 않는 파일을 열려고 할 때 발생합니다.
  • ImportError
    • 존재하지 않는 모듈을 가져오려고 할 때 또는 모듈 내에 해당 속성/함수가 없을 때 발생합니다.
  • NameError
    • 정의되지 않은 변수나 함수를 사용하려고 할 때 발생합니다.
    • 예) 프로그램에서 정의되지 않은 변수 x를 사용하려고 할 때 발생.
  • OverflowError
    • 수치 연산 결과가 너무 커서 표현할 수 없을 때 발생합니다.
  • MemoryError
    • 프로그램이 사용 가능한 모든 메모리를 소진했을 때 발생합니다.

 

3. 예외 처리 기본 구조

try:
    # 예외가 발생할 가능성이 있는 코드
    
except ExceptionType1:  # 'ExceptionType1'에는 실제 예외 유형이 들어갑니다.
    # ExceptionType1 예외가 발생했을 때 실행될 코드
    
except ExceptionType2:  # 'ExceptionType2'에는 다른 예외 유형이 들어갑니다.
    # ExceptionType2 예외가 발생했을 때 실행될 코드
    
# 추가적인 except 블록을 계속 추가할 수 있습니다.

else:
    # try 블록에서 예외가 발생하지 않았을 때 실행될 코드
    
finally:
    # 예외 발생 여부와 관계없이 항상 실행될 코드

 

 

예시1)

# 에러코드 확인

print(10 / 3)
print(5 / 0)
print(4 / 2)



3.3333333333333335
---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
<ipython-input-1-9c5e3ff0ad94> in <cell line: 2>()
      1 print(10 / 3)
----> 2 print(5 / 0)
      3 print(4 / 2)

ZeroDivisionError: division by zero

 

 

# 특정 예외 처리

try:
    print(10 / 3)
    print(5 / 0)    #ZeroDivisionError: division by zero
    print(4 / 2)
except ZeroDivisionError :
    print('0으로 나눌 수 없습니다.')
print('프로그램 종료')
더보기
3.3333333333333335
0으로 나눌 수 없습니다.
프로그램 종료

 

# 모든 예외처리 

try:
    print(10 / 3)
    print(5 / 0)
    print(4 / 2)
except :
    print('0으로 나눌 수 없습니다.')
print('프로그램 종료')
더보기
3.3333333333333335
0으로 나눌 수 없습니다.
프로그램 종료

 

 

 

예시2)

# 에러 코드 확인

data = [10, 20, 30, 40, 50]
print(data[5])


---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-4-879de49a30d4> in <cell line: 2>()
      1 data = [10, 20, 30, 40, 50]
----> 2 print(data[5])

IndexError: list index out of range

 

# 모든 예외 처리

try:
    data = [10, 20, 30, 40, 50]
    print(data[0])
    print(data[5])
    print(data[3]) #IndexError: list index out of range
except:
    print('인덱스 지정 잘못됨')
print('종료')
더보기
10
인덱스 지정 잘못됨
종료

# 특정 예외 처리

try:
    data = [10, 20, 30, 40, 50]
    print(data[0])
    print(data[5])
    print(data[3]) #IndexError: list index out of range
except IndexError:
    print('인덱스 지정 잘못됨')
print('종료')
더보기
10
인덱스 지정 잘못됨
종료

 

 

try:
    data = [10, 20, 30, 40, 50]
    print(data[0])
    print(int('일'))
    print(5/0)
    print(data[5])
    print()
    print(data[3]) #IndexError: list index out of range
except IndexError :
    print('인덱스 지정 잘못됨')
except ZeroDivisionError:
    print('0으로 나눌 수 없음')
except:                     # 전체예외처리는 마지막에 써야함
    print('오류처리')
print('종료')
더보기
10
오류처리
종료

 

  • except:만 사용: 하면 프로그램 종료나 키보드 중단과 같은 특수한 예외까지 처리할 수 있지만, 대부분의 상황에서 이렇게 예외 처리는 권장되지 않습니다.
  • except Exception as e:는 일반적인 예외만 처리하면서, 발생한 예외의 상세 정보에 접근할 수 있는 능력을 제공합니다. 이 형태를 사용하면 더 명시적이며 예외 처리가 더 예측 가능해집니다.

 

 

# 예외 에러 메세지 받기

try:
    data = [10, 20, 30, 40, 50]
    print(data[0])
    print(5/0)
    print(data[5])
    print(data[3]) #IndexError: list index out of range
except IndexError as e:
    print(e)
except ZeroDivisionError as e:
    print(e)
except Exception as e:                # 전체예외처리는 마지막에 써야함
    print(e)
print('종료')
더보기
output
10
division by zero
종료

# 예외가 발생하지 않았을 경우

try:
    data = [10, 20, 30, 40, 50]
    string = '오늘은 즐거운 예외처리 시간!'
    print(10 / 3)
    print(4 / 2)
except ZeroDivisionError as e:
    print('0으로 나눌 수 없습니다', e)
except IndexError as e:
    print('인덱스 지정이 올바르지 않습니다', e)
except TypeError as e:
    print('데이터 타입이 올바르지 않습니다', e)
else:
    print('정상적인 프로그램 진행')
print('프로그램을 종료합니다')
더보기
3.3333333333333335
2.0
정상적인 프로그램 진행
프로그램을 종료합니다

 

# 예외 발생 여부와 관계없이 실행하기

try:
    data = [10, 20, 30, 40, 50]
    print(data[0])
    print(5/0)
    print(data[5])
    print(data[3]) #IndexError: list index out of range
except IndexError as e:
    print(e)
except ZeroDivisionError as e:
    print(e)
except Exception as e:                # 전체예외처리는 마지막에 써야함
    print(e)
else:
    print('정상적인 프로그램 실행')
finally:
    print('오류에 관계없이 무조건 실행되는 문장')
print('종료')
더보기
10
division by zero
오류에 관계없이 무조건 실행되는 문장
종료

 

 

 

4. Exception 클래스

Exception 클래스는 파이썬의 내장 예외 계층 구조에서 거의 모든 내장 예외의 기본 클래스입니다. 이 클래스는 사용자 정의 예외를 만들거나 특정 예외 유형을 잡기 위한 기본적인 인터페이스를 제공합니다.

  1. 상속: 예외 유형은 Exception을 상속받아서 정의됩니다. 예를 들면 ValueError, TypeError, FileNotFoundError 등이 있습니다. 이 상속 구조 덕분에 except Exception 블록은 Exception을 상속받은 모든 예외를 캡처할 수 있습니다.
  2. 메시지: 예외가 생성될 때, 일반적으로 오류 메시지를 함께 전달할 수 있습니다. 이 메시지는 예외 객체의 args 속성을 통해 접근 가능하며, 예외를 문자열로 변환할 때(예: str(e)) 해당 메시지가 반환됩니다.

 

try:
    raise Exception('에러가 발생') # raise 에러를 내는 코드
except Exception as e:
    print(e)
def func1():
    n = int(input('짝수 입력 : '))
    if n % 2 != 0:
        raise Exception('짝수가 아닙니다.') # raise를 통해서 에러가 발생하게 만듬
    print(n)

try:
    func1()
except Exception as e:
    print('예외가 발생했습니다.')
더보기
짝수 입력 : 11
예외가 발생했습니다.
def func1():
    func2()

def func2():
    func3()

def func3():
    try:
        print('%d' % '문자열 출력')
    except TypeError:
        print('타입이 올바르지 않음')

func1()
# 리턴받기 전까지만 오류처리를 해주면됨
더보기
타입이 올바르지 않음

 

 

 

5. 사용자 정의 예외 클래스를 직접 만들고 활용하기

class AgeLimitError(Exception):
    def __init__(self, age, message ='원하는 나이 범위가 아님~'):
        self.age = age
        super().__init__(message) # 부모클래스 생성자에 메세지전달
        
def check_age(age):
    if age < 20:
        raise AgeLimitError(age, '어림')
    elif age > 40:
        raise AgeLimitError(age ,'늙음')
    else:
        return('적당')
        
ages = [17, 25, 43, 19]

for age in ages:
    try:
        print(check_age(age))
    except AgeLimitError as e:
        print(f"Error for age {e.age}: {e}")
더보기
Error for age 17: 어림
적당
Error for age 43: 늙음
Error for age 19: 어림

'🟡프로그래밍 언어 > python' 카테고리의 다른 글

20. 변수 타입 어노테이션  (0) 2023.12.13
19. 파이썬 모듈  (0) 2023.12.13
17. 스페셜 메서드  (0) 2023.12.12
16. 파이썬 상속  (0) 2023.12.12
15. 객체지향과 클래스  (1) 2023.12.11

1. 스페셜 메서드

파이썬의 스페셜 메서드 (또는 매직 메서드라고도 불림)는 더블 언더스코어(__)로 시작하고 끝나는 메서드 이름을 갖습니다. 이 메서드들은 특정 구문이나 내장 함수를 사용할 때 파이썬 인터프리터에 의해 자동으로 호출됩니다.

예를 들어, 객체에 대해 + 연산자를 사용하면 해당 객체의 __add__ 메서드가 호출됩니다. 또는 len() 함수를 사용하면 __len__ 메서드가 호출됩니다.

 

 

1. __init__ : 객체 초기화 메서드

2. __str__ : 객체를 문자열로 표현하는 메서드. print() 함수나 str() 함수를 사용할  호출됩니다.

class Book:
    def __init__(self, title):
        self.title = title

book = Book('파이썬')
print(book)
print(str(book))
더보기
<__main__.Book object at 0x7b6b4b2ecc10>
<__main__.Book object at 0x7b6b4b2ecc10>

 

class Book:
    def __init__(self, title):
        self.title = title

    def __str__(self):
        return self.title
        
book = Book('파이썬')
print(book)
print(str(book))
더보기
파이썬
파이썬

 

 

3. __add__ : + 연산자를 사용할  호출되는 메서드

class Calc:
    def __init__(self, value):
        self.value = value

    def __add__(self, other): # other : 다른객체
        return self.value + other.value

num1 = Calc(5)
num2 = Calc(10)
result = num1 + num2
print(result)
# 덧셈 오버라이딩

 

4. __len__ : len() 함수를 사용할  호출되는 메서드

class Queue:
    def __init__(self):
        self.items = [1, 2, 3, 4, 5]

    def __len__(self):
        return len(self.items) #len()
        
        
queue = Queue()
print(len(queue))

 

 

5. __getitem__ : 인덱싱을 사용할  호출되는 메서드

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    
    def __getitem__(self, index):
        if index == 0:
            return self.x
        elif index == 1:
            return self.y
        else:
            return -1

p1 = Point(3, 4)
print(p1[0], p1[1], p1[100])
더보기
3 4 -1

 

6. __call__ : 객체를 함수처럼 호출할  사용되는 메서드

class CallableObject:
    def __call__(self, *args, **kwargs):
        print(f"Called with arguments: {args} and keyword arguments: {kwargs}")

callable_obj = CallableObject()
callable_obj(1, 2, 3, a="A", b="B")
더보기
Called with arguments: (1, 2, 3) and keyword arguments: {'a': 'A', 'b': 'B'}

'🟡프로그래밍 언어 > python' 카테고리의 다른 글

19. 파이썬 모듈  (0) 2023.12.13
18. 파이썬 예외처리  (0) 2023.12.12
16. 파이썬 상속  (0) 2023.12.12
15. 객체지향과 클래스  (1) 2023.12.11
14. 콜백함수와 람다함수  (1) 2023.12.11