자바스크립트(Javascript)

컴파일 과정 없이 브라우저 내부의 자바스크립트 처리기(인터프리터)에 의해 바로 실행된다.
※ 개발이 발전됨에 따라 컴파일 과정이 가능해졌으며, Node.js로 서버환경을 구축한다.

 

 

 

웹 페이지에서 자바스크립트의 역할
웹 페이지는 3가지( HTML, CSS, JS ) 코드가 결합되어 작성된다.
자바스크립트는 사용자의 입력을 처리하거나 웹 애플리케이션을 작성하는 등
웹 페이지의 동적 제어에 사용된다.

1. 사용자의 입력 및 연산 ( 반응 )
키, 마우스 등의 입력과 연산은 오직 자바스크립트로만 처리가 가능하다.

2. 웹 페이지 내용 및 모양의 동적 제어
HTML 태그의 속성이나 콘텐츠, CSS 속성 값을 변경해서
웹 페이지의 동적인 변화를 일으키는 데에 활용된다.

3.  브라우저 제어
브라우저 윈도우의 크기나 모양 변경, 새 윈도우나 탭 열기, 다른 웹 사이트 접속,
브라우저 히스토리 제어 등 브라우저의 작동을 제어하는 데 활용된다.

4.  웹 서버와의 통신
웹 페이지가 웹 서버와 데이터를 주고 받을 때 활용된다.

5.  웹 애플리케이션 작성
자바스크립트 언어로 활용할 수 있는 API를 제공하므로,
웹 브라우저에서 실행되는 다양한 웹 애플리케이션을 개발할 수 있다.

 


Node.js 아키텍처

 

 

Node.js 아키텍처
자바스크립트 코드 실행에 필요한 런타임으로 V8엔진을 사용하고, 
스크립트 런타임에 필요한 이벤트 루프 및 운영체제 시스템API 를 사용하는 데는
 libuv ( 리버브 ) 라이브러리를 사용한다.

 


1. 애플리케이션에서 요청이 발생하면, V8엔진은 자바스크립트 코드를 바이트 코드 혹은 기계어로 변경한다.
2. 자바스크립트로 작성된 Node.js의 API는 C++로 작성된 코드로 사용된다.
3. V8 엔진은 이벤트 루프가 필요하기 때문에 libuv를 사용하고, 전달된 요청을 libuv의 이벤트 큐에 추가한다.
4. 이벤트 큐에 쌓인 요청은 이벤트 루프에 전달되고, 운영체제 커널에 비동기 처리를 요청한다.
    운영체제 내부적으로 비동기 처리가 힘든 경우(DB, 네트워크 통신, 파일 처리 등)는 워커 쓰레드에서 처리한다.
5. 운영체제의 커널 혹은 워커 쓰레드가 완료한 작업은 다시 이벤트 루프로 전달된다.
6. 이벤트 루프에서 콜백으로 전달된 요청에 대해 완료 처리 후 V8로 넘긴다.
7. 완료 처리된 응답은 Node.js App으로 전달된다.

 

 

Node.js문서에서는 이벤트큐는 다른 큐들까지 합쳐서 이벤트큐라고 한다.

태스크큐(=이벤트큐)

 

 

콜 스택 ( 이벤트 큐 안에 있음 ) 
싱글 쓰레드란 콜 스택을 1개를 가지고 있다는 뜻이다.
하지만, 1개의 콜 스택으로는 마지막 작업이 앞에 있는 작업을 모두 기다려야하기 때문에
libuv에 있는 이벤트 루프로 보낸다.

 

V8이라는 콜스택에 작업배치

코드를 1번부터 10번줄까지 작성하면

스택구조로 콜스택에 쌓인다.

콜스택에 쌓일때 비동기로만 처리되어야하는 것들이 있다. 

비동기 처리에서도 두가지로 나뉨

1. OS(운영체제) 비동기로 돌리기

2. 멀티쓰레드로 처리

 

리버브를 두고 멀티쓰레드 환경을 구축해서 비동기로 작업=> 콜스택에 쌓인것이 처리되고 이벤트큐에 쌓인다.

=> 이벤트큐 

 

이벤트큐

세분화

task quue

microtask

macro task 

 

이벤트 큐 안에 있는 task큐는 이벤트큐의 메인이다.

 

 



 

3번 => 이벤트 큐

3번으로 들어갈땐 이벤트 큐

5번 => 태스크 큐

5번에서 돌아올땐 태스크 큐

 

6번 콜스택으로 가서 쌓임

 

태스크 큐를 이벤트큐로 봐도 무방하다.

 

 

이벤트 기반 아키텍처


1. V8의 콜 스택에 쌓인 뒤 I/O 처리가 필요한 코드는 이벤트 루프로 보낸다.
2. 이벤트 루프에서 처리될 작업을 태스크 큐에 담는다.
3. 태스크 큐에 있는 작업을 이벤트 루프로 보내서 루프를 실행하고 운영체에 또는 쓰레드 워커에서 I/O 처리를 진행한다.
4. 쓰레드 워커와 운영체제는 받은 요청에 대한 결과를 이벤트 루프로 다시 돌려준다.
5. 이벤트 루프에서는 결과값에 대한 코드를 콜 스택에 다시 추가한다.

 

 

 

이벤트 루프
운영체제의 비동기 I/O 기능을 사용하거나, 쓰레드 풀을 사용해서 모든 작업을 비동기로 처리한다.
여러 큐를 사용해서 특정 우선순위대로 작업들을 처리해준다.

1. 이벤트 루프의 시작 및 각 반복의 마지막에 루프가 활성화 상태인지 확인한다.

 

2. 타이머 단계에서 타이머 큐를 처리하며, 이 때 setTimeout(), setInterval()을 처리한다.
   타이머가 실행되는 순서는 확실하지 않고, 프로세스 퍼포먼스에 따라 다르다.

 

3. 펜딩(pending) I/O 콜백 단계에서는 다음 반복으로 연기된 콜백을 처리한다.

 

4. 유휴, 준비 단계를 통해 다음 폴 단계의 준비를 내부적으로만 진행한다.

 

5. 풀 단계에서는 새로운 연결 ( 소켓 맺기, 파일 읽기, DB 커넥션 생성하기 등 ) 작업을 진행한다.
   각 작업은 쓰레드 풀을 사용한다.

 

6. 검사 단계에서는 풀 단계의 성공 실패 여부를 판단하고 이를 setImmediate( )로 처리한다.
   I/O 사이클에 스케줄링 되었다면, setTimeout( )보다 setImmediate( ) 가 항상 먼저 실행된다.
먼저 처리해야 하면 setImmediate( ) 를 해야한다.

 

7. 종료 콜백 단계에서는 콜백의 종료 처리 ( 파일 닫기, 커넥션 종료 등) 를 한다.

 

8. 각 단계 사이마다 nextTickQueue와 microTaskQueue에 있는 작업이 먼저 실행된다.
   process.nextTick( )함수를 통해 nextTickQueue에 작업을 추가할 수 있고,
   이벤트 루프가 진행되기 전에 에러를 핸들하며 필요 없는 자원을 해제 및 재요청 처리까지 가능하다.
   microTaskQueue에는 Promise로 만든 콜백 함수가 추가된다.

 

 


microtaskqueue 

fetch 통신

fetch 리턴타입 promise 

promise는 microtaskqueue에 저장된다.

mircotaskqueue는 다른 것들보다 먼저 실행이 되는데, microtaskqueue보다 먼저 실행되는 것이 nextTickqueue이다.

 

프로세스에 nextTickqueue라는 메소드를 사용하면 콜백함수를 전달하는데, 그것이 nextTickqueue에 쌓인다.

코드상에서 타이머에 들어갈 settimeout을 먼저 썼어도, nextTickqueue이 어딘가에 있다면  nextTickqueue먼저 실행된다.

nextTickqueue가 비워지면 microtaskqueue 가 실행이 된다.

 

검사쪽에 쓰이는 check()

setimediate 메소드.

타이머 - setTimeout

검 사 - setimmediate

 

실무에서는 예를들어 통신보다 먼저 실행해야할 코드가 있다면 nextTickqueue에 등록하기


 

I/O싸이클은 운영체제가 처리할 수 없는 것들 => 파일 입출력, 네트워크 통신 등등..

타이머, 검사,(I/O싸이클)폴 에도 각각의 task큐가 있다.

각각의 task큐 목적은 타이머 검사 폴 큐에서 해당 콜백함수가 실행이 되어 완료가 되면 완료처리를 했을때 각각의 task큐에 담아놓는다.

각각의 task큐는 이 다음 V8에 있는 콜스택에 들어가기 위한 준비를 한다.

V8에 도착해야 응답을 할 수 있기 때문에

따라서 각각 이벤트루프에서는 task큐가 존재하고, 각 task큐에서는 작업이 완료가 된 것들이 들어가있다.

그렇게 완료가 되어있는 것들은 멀티 쓰레드이다.

하지만 V8쪽은 단일 쓰레드이기 때문에 멀티가 단일에 들어가려면 우선순위를 정확히 정해야한다.

이 우선순위를 정해주기 위한 역할이 이벤트큐

 

정리

(이벤트큐)

V8콜스택에 처리해야 할 것들을 담아놓고, 이벤트루프가 돌면서 각각의 task큐에 쌓여있던 것들을 단일 쓰레드로 보내기 위해서 우선순위를 정해서 이벤트큐에 저장, 이벤트큐에 우선순위가 저장되고 콜스택에 쌓아서 처리

 


자바스크립트를 작성할 수 있는 위치


1. HTML 태그의 이벤트 리스너 속성에 작성
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>
    <hr>
    <img src = "images/icon1.png" width="200px" 
            onmouseover="this.src='images/icon2.png' " onmouseout="this.src = 'images/icon1.png'">
</body>
</html>


2. <script></script> 태그 안에서 작성
<head></head>, <body></body>, body 태그 밖 등 어디든 들어갈 수 있다.
웹 페이지 내에서 여러 번 작성할 수 있다.

<!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>
        <hr />
        <img
            src="images/icon3.png"
            width="200px"
            onmouseover="over(this)"
            onmouseout="out(this)"
        />
    </body>
    <script>
        function over(object) {
            object.src = `images/icon4.png`;
        }

        function out(object) {
            object.src = `images/icon3.png`;
        }
    </script>
</html>


3. .js 자바스크립트 파일에 작성
자바스크립트 코드를 확장자가 .js인 별도의 파일로 저장하고,
<script src = ".js경로"></script> 와 같이 가져온다.

<!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>
        <hr />
        <img src="images/icon5.png" width="200px" onclick="change(this)" />
    </body>
    <script src="c_script.js"></script>
</html>



4. URL 부분에 작성
<a> 태그의 href 속성에도 자바스크립트 코드를 작성할 수 있다.
하지만 href 속성에서 자바스크립트 코드를 쓸 때에는 "javascript:"라는 키워드를 작성해야 한다.

 

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>URL에 작성</title>
    </head>
    <body>
        <a href="javascript:alert('진행!')">진행</a>
    </body>
</html>

데이터 타입과 변수


   1. 자바스크립트 식별자(이름)
      식별자(identifier)란 자바스크립트 개발자가 변수, 상수, 함수에 붙이는 이름이다.
      식별자를 만들 때 다음 규칙을 준수해야 한다.

      - 첫 번째 문자 : 알파벳, 언더바, $문자만 사용 가능
      - 두 번째이상 문자 : 알파벳, 언더바, 0-9, $사용 가능
      - 대소문자 구분 : data와 dAta는 다른 식별자이다.
      - 키워드(예약어) 사용 불가

   2. 문장 구분
      세미콜론으로 문장과 문장을 구분한다.
      한 줄에 한 문장만 있는 경우 세미콜론을 생략할 수 있다.
   
      i = i + 1
      j = j + 1;
      k = k + 1; m = m + 1;
      n = n + 1 p = p + 1 (X)

   3. 주석
      - 한 줄 주석 : //
      - 범위 주석  : /* */


   4. 데이터 타입(typeof())
      - 숫자 타입(number) : 42, 3.14, ...
      - 논리 타입(bool) : true, false
      - 문자열 타입(string) : "안녕", "하세요", "35", 'a', "A", ...
      - 객체 레퍼런스 타입(object) : Object, Array, Math, Date,...
      - undefined : 타입이 정해지지 않은 것을 의미한다.
      - null : 값이 정해지지 않은 것을 의미한다.


   5. 변수
      - var 키워드 : 함수의 영역만 영역으로 판단한다.
      - let 키워드 : 모든 영역을 영역으로 판단한다.


   6. 상수
- const 키워드 : 값을 변경시킬 수 없다.

   7. 지역변수와 전역변수
- 변수의 사용 범위 ( scope )에 따라서 전역변수(global)와 지역변수 ( local )로 나뉜다.
전역변수 : 함수 밖에서 선언된 변수
지역변수 : 영역 안에서 선언된 변수

'컴퓨터 비전 > Javascript' 카테고리의 다른 글

function  (0) 2024.01.29
oper , switch  (0) 2024.01.29
scope ( let , var, const )  (0) 2024.01.29
javascript 메소드 정리  (0) 2024.01.28
queue.js  (0) 2024.01.28

 

버전 관리 시스템  원하는 시점(버전)으로 이동할 수 있으며, 각 버전별로 여러
 개발자가 협업할 수 잇는 최적의 환경을 제공하는 시스템
SVN 작업 내역 커밋 시 변경사항과 히스토리가 즉시 서버로 전송되기 때문에 관리가 용이하다.
또한 간단한 설치와 사용방법으로 별도의 교육 없이도 초보자도 쉽게 사용할 수 있다.
하지만 항상 원격 저장소(SVN 서버)를 필요로 하며, 서버간 버전 관리도 힘들다.

Git(분산형 버전 관리 시스템)
SVN이 가지고 있던 클라이언트와 서버 간의 버전 관리 문제를 많이 보완해준 시스템이다.
서버 뿐만 아니라 로컬에서도 버전 관리가 가능하다.
로컬이 서버가 될 수 있고, 반대로 서버가 로컬이 될 수 있다.
브랜치라는 개념을 사용하여 개발자 마음대로 로컬 환경에서도 커밋과 버전 관리가 가능하다.

 

 

1. git 사용자 설정

사용자 아이디 이름 입력

git config --global user.name "아이디"
git config --global user.email "이메일 "

 

사용자 이름, 이메일 확인

$ git config --global user.name
$ git config --global user.email

 

전체 정보확인

git config --list

▶ 본인 개인 파일 올리기

 

1. 깃 허브 접속


2. new 클릭


3. Repository 이름 설정

 

4. git init:

  • 현재 디렉토리를 Git 저장소로 초기화합니다.
git init

 

 

5. git add:

  • 변경된 파일을 스테이징 영역에 추가합니다.
# 모든 파일 add
git add .

# 지정 파일 add
git add [파일명]

 

6. git commit:

  • 스테이징 영역에 있는 변경 사항을 커밋합니다.
git commit -m "메세지"

 

7. git status:

  • 현재 작업 디렉토리의 상태를 확인합니다.
git status

 

8. git remote:

  • 원격 저장소의 정보를 관리합니다.
# 원격 저장소의 정보 확인
git remote -v

 

git remote add origin

  • 로컬 Git 저장소와 원격 저장소 간의 연결을 설정하는 명령어입니다.
  • 여기서 "origin"은 일반적으로 원격 저장소의 별칭(alias)으로 사용되며, 원격 저장소에 대한 단축 이름으로 자주 사용됩니다.
# 원격 저장소의 정보
git remote add origin [개인 저장소 깃 허브 주소]

 

git push:

  • 로컬 변경 사항을 원격 저장소로 푸시합니다.
git push origin master

 

README 작성


팀과 협업 ( 팀원 )

 

organizations 의 Fork받기

 

1. 나의 organizations 선택

 

2. Fork 선택

 

3. Fork 생성


■ 본인 작업 push 보내야 할 때

 

1. test 브랜치에서 본인 작업 저장

 

2. git add: 

  • 본인 작업한 파일 스테이징 영역에 추가
# 모든 파일 add
git add .

# 지정 파일 add
git add [파일명]

 

3. git commit:

  • 본인 작업 파일을 커밋
git commit -m "별칭"

 

4. git checkout master

  • 개인브랜치에서 master 브랜치로 이동
git checkout master

 

 

5. git merge:

  • 브랜치를 병합합니다.
# master브랜치에서 test와 병합
git merge test

 

6. git push:

  • 로컬 변경 사항을 원격 저장소로 푸시합니다.
git push origin master

 

 

7. gihhub 접속

Pull requests 선택

 

pull requests > New pull request 

 

 > Create pull reauest 클릭

 

>  작업 추가한 메시지 작성

 

 


■ 팀원파일 pull 받을 때

 

(추가 작업이 있을 경우) 

자신의 브랜치 (test) 에서

git add .					
git commit - m " "

 

팀 저장소가 없을경우 생성

git remote add [팀 저장소 ]

 

 

 

 

pull 받는 순서

 

1. master 브랜치 이동

git checkout master  # master브랜치 이동후
git pull team03 master

 

2. master 브랜치에서 파일을 받은 후 test 브랜치로 이동 

git checkout test

 

 

3. test브랜치에서 master 브랜치와 merge (병합)

git merge master

 


 

git 스테이징 취소

 

#  해당 파일을 스테이징에서 제외
git reset <파일명>

# 만약 모든 파일을 스테이징에서 제외
git reset

 

 

git branch:

  • 브랜치 목록을 확인
git branch

 

 

git branch 생성

# 새로운 브랜치 생성:
git branch [ 생성할 브랜치명 ]

# 새로운 브랜치 생성하면서 이동
git checkout -b [ 생성할 브랜치명

 

git checkout:

  • 다른 브랜치로 이동하거나 특정 커밋으로 돌아갑니다. 
git checkout <branch-name>

 

 

git remote remove [ 저장소 ]

  • 만약 team03이라는 이름의 다른 원격 저장소가 이미 등록되어 있다면, 새로운 원격 저장소를 추가하려면 먼저 기존의 team03 원격 저장소를 제거해야 합니다.
  • 다음 명령어를 사용하여 기존의 team03 원격 저장소를 제거할 수 있습니다.
git remote remove team03

 

git remote add team03 [ 팀 url ]

  • 새로운 team03 원격 저장소 추가
# 새로운 team03 원격 저장소 추가
git remote add team03 https://github.com/[ 팀 url ]

1.

> Setting 에 들어가 Add Interpreter에서 

🔶pymysql

🔶 cryptography

🔶 mysqlclient

 

위에 세개 설치하기

 

 

 

2.

> 오른쪽 메뉴에서 Database 선택 후 + 선택

 

 

3.

> Data Source -> MySQL 선택

 

4. 

  > 글쓴이는 Host를 localhost로 지정함 > User 작성 후 password 입력 > SSH/SSL 클릭

    

 

 

 

5.

> 설정 클릭

 

 

6. 

 > SSH 창에서 Host에 나의 aws에서 생성한 인스턴스 IP주소 입력

 > Private Key file에서 푸티에서 받은 pem 파일 넣기

 

 

7. 

연결

def connect():
    conn = pymysql.connect(host='나의 aws IP주소 입력', user='user이름 입력', password='나의 패스워드', db='db이름', charset='utf8', autocommit=False)
    cursor = conn.cursor(pymysql.cursors.DictCursor)
    return conn, cursor

 

'컴퓨터 비전 > DBMS' 카테고리의 다른 글

MySQL  (0) 2024.01.18
데이터베이스와 MongoDB  (0) 2023.12.02

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

# 추가, 수정, 삭제, 검색, 목록
# 수정 시 상품명으로 검색하고 새로운 상품명과 가격으로 수정한다(상품명 가격을 따로 수정하지 않고 한번에!)
# 검색 시 상품명, 가격을 따로 검색하도록 구현한다.
# 가격 검색 시 오차 범위는 ±50%로 설정한다.
name_list = []
price_list = []

title = "또와 과일"
menu = "1.추가하기\n2.수정하기\n3.삭제하기\n4.검색하기\n5.목록보기\n6.나가기\n"
search_menu = "1.상품명으로 검색\n2.가격으로 검색\n"
append_message = '추가하실 상품명과 가격을 입력하세요.\n예)상품명 가격'
search_name_message_for_update = '수정하실 상품명을 입력하세요.'
update_message = '새로운 상품명과 가격을 입력하세요.\n예)상품명 가격'
delete_message = '삭제하실 상품명을 입력하세요.'
search_name_message, search_price_message = '상품명: ', '가격: '

result_message = ""
append_error_message = "추가 실패(중복된 상품명)"
update_error_message1 = "수정 실패(존재하지 않는 상품명)"
update_error_message2 = "수정 실패(중복된 상품명)"
delete_error_message = "삭제 실패(존재하지 않는 상품명)"
search_name_error_message = "검색 실패(존재하지 않는 상품명)"
search_error_message = "검색 결과가 없습니다."
error_message = "다시 입력해주세요."
no_item_message = "목록이 없습니다."

while True:
    # 사용자에게 메뉴를 보여주고 선택한 번호를 choice에 저장
    choice = int(input(title + '\n' + menu))

    # 추가
    if choice == 1:
        # 사용자에게 상품명과 가격을 동시에 입력받는다(구분점은 공백문자).
        new_name, new_price = input(append_message).split()
        # 입력한 상품명이 기존 상품과 중복되지 없다면,
        if new_name not in name_list:
            # 이름 list에 추가
            name_list.append(new_name)
            # 가격 list에 추가
            price_list.append(int(new_price))
            # 오류 메세지를 출력하지 않기 위해서 continue를 작성해 즉시 다음 반복으로 skip
            continue
        else:
            # 입력한 상품명이 기존 상품과 중복되었다면,
            # 알맞은 메세지를 result_message에 담아서 소스코드 하단의 일괄처리로 보내기
            result_message = append_error_message

    # 수정
    elif choice == 2:
        name = input(search_name_message_for_update)    # 수정할 상품명 입력
        if name in name_list:                           # 만약 name_list(상품리스트)안에 name(상품)이 존재한다면
            new_name, new_price = input(update_message).split()
            # input에 입력한 수정할 상품명과 가격을 split()으로 나누고 new_name와 new_price 변수에 각각 저장
            if new_name not in name_list:        # 만약 new_name과(수정한 상품명)이 name_list(상품리스트)에 존재하지 않는다면,
                index = name_list.index(name)
                # index 변수에 수정할 상품명의 인덱스를 저장함
                # 상품의 인덱스는 상품명과 가격과 index번호가 같으므로 상품명의 인덱스로 index를 뽑아쓰기 위해 저장
                name_list[index], price_list[index] = new_name, new_price
                #name_list[index], price_list[index]에 new_name,과 new_price를 저장
                continue # 오류 메세지를 출력하지 않기 위해서 continue를 작성해 즉시 다음 반복으로 skip
            else: # 입력된 상품명이 중복일때
                result_message = update_error_message2 # 수정실패 : 중복된 상품명 오류메시지
        else: # 상품목록에 수정할 상품명이 존재하지 않을 경우
            result_message = update_error_message1  # 수정실패 : 존재하지 않는 상품명 오류메시지

    # 삭제
    elif choice == 3:
        name = input(delete_message) # input값에 삭제할 상품명을 입력 후 name이라는 변수에 저장.
        if name in name_list:       # 만약 name이 name이 name_list에 존재한다면,
            index = name_list.index(name) # index라는 변수에 삭제할 상품명 인덱스를 저장
            del name_list[index]    #해당 인덱스 번호의 상품명과 가격 삭제
            del price_list[index]
            continue

        else:        #상품목록에 삭제할 상품명이 없다면 에러메세지 출력
            result_message = delete_error_message

    # 검색
    elif choice == 4:
        choice = int(input(search_menu)) # input창에서 1:상품명과 2:가격중 어느 것으로 검색할 지 선택

        # 상품명으로 검색
        if choice == 1:
            name = input(search_name_message) # 검색할 상품 입력
            if name in name_list:   # 만약 입력한 상품이 nmae_list에 존재 한다면,
                index = name_list.index(name) # index라는 변수에 검색할 상품명의 인덱스를 저장
                print(f'{name_list[index]}, {price_list[index]}') # 검색한 상품의 name_list와 pirce_list 출력
                continue

            else: #상품목록에 상품명이 없는경우 -> 검색결과 x
                result_message = search_name_error_message

        # 가격으로 검색
        elif choice == 2:
            price = int(input(search_price_message))
            # 오차 범위는 ±50%로 설정
            # 오차범위 ±50%인 가격목록에서 가격을 하나씩 뽑아 result_index에 인덱스번호 저장
            min = price * 0.5
            max = price * 1.5
            result_index = [price_list.index(i) for i in [price for price in price_list if min <= price <= max]]
            # price_list에서 값을 가져와 if min <= price <= max에 해당한 값들을 price에 담음
            # price 결과가 검색된 가격들을 i에 담고 price_list.index로 몇번째 방에 있는지 연산

            if len(result_index) != 0:          # result_index의 길이가 0이 아니면
                for i in result_index:          # 해당 인덱스에 해당되는 상품명과 가격을 모두 출력
                    print(f'{name_list[i]}, {price_list[i]}')
                    continue

            else:
                result_message = search_error_message   # result_index가 0이면 에러메시지 출력
    # 목록
    elif choice == 5:
        if len(name_list) == 0:         # (상품목록)name_list의 목록이 0인 경우
            result_message = no_item_message    # result_message 목록이 없다는 메시지 출력
        else:                                   # 상품목록이 있는 경우
            for i in range(len(name_list)):     # name_list의 길이를 i만큼 반복
                print(f'{name_list[i]}, {price_list[i]}')     # 반복문으로 상품목록의 개수만큼 반복, 상품목록(상품명, 가격) 출력
                continue

    # 나가기
    elif choice == 6:       #6번을 선택하면
        break               # 종료

    # 그 외
    else:
        result_message = error_message #그외의 에러는 다시 입력해주세요 => 에러 메시지

    print(result_message) # 결과값 출력
    result_message = ""






'컴퓨터 비전 > 실습모음' 카테고리의 다른 글

if_task  (0) 2024.01.03
for_task  (0) 2024.01.03
input_task  (0) 2024.01.03
# 사용자에게 아래의 메뉴를 출력하고 번호를 입력받는다.
# 1. 빨간색
# 2. 검은색
# 3. 노란색
# 4. 흰색

# 사용자가 입력한 번호의 색상을 영어로 출력한다.
title = "색상은 골라주세요!\n"
menu = "1. 빨간색\n" \
       "2. 검은색\n" \
       "3. 노란색\n" \
       "4. 흰색\n"

choice = int(input(title + menu))
choice1, choice2, choice3, choice4 = choice == 1, choice == 2, choice == 3, choice == 4
color1, color2, color3, color4 = "red", "black", "yellow", "white"
result = None

if choice1:
    result = color1
elif choice2:
    result = color2
elif choice3:
    result = color3
elif choice4:
    result = color4

print(result)

'컴퓨터 비전 > 실습모음' 카테고리의 다른 글

list_task  (0) 2024.01.03
for_task  (0) 2024.01.03
input_task  (0) 2024.01.03
#%%
# 1~ 15까지 출력
for i in range(1, 16):
    print(i)
#%%
# 30 ~ 1까지 출력
for i in range(30):
    print(30 - i)
#%%
# 1에서 100까지 중 홀수만 출력
# for i in range(1, 100):
#     if i % 2 == 1:
#         print(i)
# 반복횟수를 죽여야함
#
for i in range(50):
    print(i * 2 + 1, end=' ')
#%%
# 1~10까지 합 합 출력
sum=0
for i in range(0, 10):
    sum += i + 1
print(sum)
#%%
# 1~n까지 합 출력
num = int(input('정수를 입력하세요 : '))

sum=0

for i in range(1, num+1):
    sum += i
print(sum)
#%%
# 3 4 5 6 3 4 5 6 3 4 5 6 출력
for i in range(12):
    print( i % 4 + 3 , end= ' ')
#%%
# '1,235,500'를 1235500으로 출력
data = '1,235,500'
result = ''
for i in data:
    if i != ',':
        result += i

result = int(result)
print(result + 5)

#%%
# 1~10 까지 중 3까지만 출력
# print를 break아래에 작성하면
# i가 2일때 멈춰버려서 3이 출력되지 않음
for i in range(10):
    print(i+1)
    if i == 2:
        break
#%%
# 1~10까지 중 4를 제외하고 출력
for i in range(10):
    if i == 3:
        continue
    print(i+1)
# continue를 사용한다는건 밑에 코드를 사용하지 않기 위해 사용
# 따라서 continue를 만나면 다음 줄은 출력되지 않음
# 그러므로 print(i+1)을 continue 아래에 작성해야 i==3일때 print(i+1)을 출력하지 않고 넘어감

'컴퓨터 비전 > 실습모음' 카테고리의 다른 글

list_task  (0) 2024.01.03
if_task  (0) 2024.01.03
input_task  (0) 2024.01.03
# email을 입력받고 아이디와 도메인을 각각 분리하여 출력한다.

'''
    첫 번째 값으로 야드를 입력받고, 두 번째 값으로 인치를 입력받아서
    각각 cm로 변환하여 다음 형식에 맞추어 소수점 둘 째자리까지 출력한다.

    1yd: 91.44cm
    1in: 2.54cm

    예)
        yard 입력: 10
        inch 입력: 10

        10 yard는 914.4cm
        10 inch는 25.4cm
'''
# round(값, 원하는 자리수) : 소수점이 맞춰진 결과값
#%%
# email을 입력받고 아이디와 도메인을 각각 분리하여 출력한다.
id, domain = input('이메일 입력 : ').split('@')
print(f'아이디 : {id}\n 도메인 : {domain}입니다.')


#%%
yard_message = 'yard 입력: '
inch_message = 'inch 입력: '

yard = float(input(yard_message))
inch = float(input(inch_message))

yard_to_cm = round(yard * 91.44, 2)
inch_to_cm = round(inch * 2.54, 2)

yard_formatting = f'{yard} yard는 {yard_to_cm}cm'
inch_formatting = f'{inch} yard는 {inch_to_cm}cm'

print(yard_formatting, inch_formatting, sep='\n')

'컴퓨터 비전 > 실습모음' 카테고리의 다른 글

list_task  (0) 2024.01.03
if_task  (0) 2024.01.03
for_task  (0) 2024.01.03

ChatGPT
- OpenAI에서 공개한 GPT모델(자연어처리 모델)을 기반으로 만든 ChatGPT
- 인공지능 채팅 서비스
- 2021년까지의 지식까지만 학습됨
- 정보를 빠른시간에 정제된 텍스트로 표현

ChatGPT 프롬프트 엔지니어링
1. 영어로 질문
    - 기본적으로 영어로 세팅
    - 다국어를 이용시 영어에 비해 느리고 정보량이 부족
2. 상황을 구체적으로 기술
    - streamlit에 대해 설명해줘 => 나는 AI개발자야. 직원을 교육하고 있는데 streamlit에 대해 개념을 설명하는 자료를 만들어줘
3. GPT에게 역할을 부여
    - 너는 스타트업에 개발 팀장이야. 팀장처럼 행동해줘 네가 질문을 하면 내가 대답을 할게. 첫번째 질문을 생성해줘

https://wrtn.ai/

 

 

GPTAPI키 받는 순서

https://openai.com/blog/openai-api 에서 로그인 ▶ 왼쪽 메뉴에서 API key에서 키 생성

 

OpenAI API

We’re releasing an API for accessing new AI models developed by OpenAI.

openai.com

 

 

 

# 번역서비스

1_app.py

# 번역 서비스
import streamlit as st
import openai
openai.api_key = '' # 자신의 api키 작성
example = {
    "한국어": ['오늘 날씨가 어때?', '최근 딥러닝 기반의 AI기술이 인기를 끌고 있다'],
    "영어":['How is the weather today?', 'Recently, AI technology based on deep learning is gaining popularity'],
    "일본어":['今日の天気はどう?','最近ディープラーニング基盤のAI技術が人気を集めている']
}
# 함수 생성
def translate_text(text, src_lang, trg_lang):
    def build_fewshot(src_lang, trg_lang):
        src_examples = example[src_lang]
        trg_examples = example[trg_lang]
        fewshot_messages = []

        for src_text, trg_text in zip(src_examples, trg_examples):
            fewshot_messages.append({'role':'user','content':src_text})
            fewshot_messages.append({'role':'assistant','content':trg_text})
        return fewshot_messages


    system_instrunction = f'assistant는 번역앱으로서 동작한다. {src_lang}을 {trg_lang}으로 적절하게 번역하고 번역된 텍스트만 출력한다.'
    
    fewshot_messages = build_fewshot(src_lang=src_lang, trg_lang=trg_lang)
    
    messages = [{'role':'system', 'content':system_instrunction}, *fewshot_messages, {'role':'user', 'content':text}] # 시스템으로 명령/ 예를 두개 정도 보냄
    #print(fewshot_messages)
    
    response = openai.chat.completions.create(
        model='gpt-3.5-turbo',
        messages=messages
    )
    print(response.choices[0].message.content)
    return response.choices[0].message.content



st.title('간단한 번역 서비스')
text = st.text_area('번역할 내용을 입력하세요', '')
src_lang = st.selectbox('번역할 언어', ['한국어','영어','일본어'])
trg_lang = st.selectbox('번역된 언어', ['영어','한국어','일본어'])
if st.button('번역하기'):
    translated_text = translate_text(text, src_lang, trg_lang)
    st.success(translated_text)

 

 

 

# 광고문구 만들기

main.py

import openai
from fastapi import FastAPI
from pydantic import BaseModel
openai.api_key = ''

class AdGenerator:
    def __init__(self, engine='gpt-3.5-turbo'):
        self.engine = engine    # gpt-3.5-turbo
        self.type = self.get_type_engine(engine) # chat
    def get_type_engine(self, engine):
        if engine.startswith('gpt-3.5'):
            return 'chat'
        elif engine.startswith('text-'):
            return 'text'
        raise Exception(f'알려지지 않은 모델: {engine}')
    def using_chatgpt(self, prompt):
        system_instruction = 'assistant는 마케팅 문구 작성 도우미로 동작한다. user의 내용을 참고하여 마케팅 문구를 작성해줘'
        messages = [{'role':'system', 'content':system_instruction}, {'role':'user', 'content':prompt}]
        response = openai.chat.completions.create(
            model=self.engine, messages=messages
        )
        result = response.choices[0].message.content.strip()
        return result
    def generate(self, product_name, details, option):
        prompt = f'제품 이름: {product_name}\n주요 내용: {details}\n광고 문구의 스타일: {option}\n위 내용을 참고하여 마케팅 문구를 작성해줘'
        if self.type == 'chat':
            result = self.using_chatgpt(prompt=prompt)
        return result

app = FastAPI()
class Product(BaseModel):
    product_name: str
    details: str
    option: str
@app.post('/create_ad')
def create_ad(product: Product):
    adGenerator = AdGenerator()
    ad = adGenerator.generate(product_name=product.product_name,
                              details=product.details,
                              option=product.option)
    return {'ad': ad}

 

 

streamlit으로 웹 생성

2_app.py

import streamlit as st
import requests

st.title('광고문구 서비스')
generate_ad_url = 'http://127.0.0.1:8000/create_ad'

product_name = st.text_input('제품 이름')
details = st.text_input('주요 내용')
options = st.multiselect('광고 문구의 느낌', options=['기본','재밌게', '차분하게', '과장스럽게', '참신하게', '고급스럽게'], default=['기본'])

if st.button('광고 문구 생성'):
    try:
        response = requests.post(
            generate_ad_url,
            json = {"product_name": product_name,
                    "details": details,
                    "option": ", ".join(options)} #이렇게 해야 여러개 선택한 것을 다같이 보냄
        )
        ad = response.json()['ad']
        st.success(ad)

    except:
        st.error('오류')