728x90
반응형
SMALL

hyper link 하이퍼링크

    - 다른페이지, 사이트로 연결하는 링크(문자 또는 이미지)

    - 인라인태그이다.


    <a href='이동할 사이트or문서의 경로'>링크에 사용할 문자또는 이미지</a>

728x90
반응형
LIST

'HTML' 카테고리의 다른 글

HTML- <Table>  (1) 2023.03.24
HTML- 책갈피 만들기(hyper link 이용)  (0) 2023.03.24
HTML- 호스팅  (0) 2023.03.24
HTML- 태그  (0) 2023.03.23
HTML- 기본편  (0) 2023.03.23
728x90
반응형
SMALL

HTML의 특수 태그

< : &lt;
> : &gt;
띄워쓰기 : &nbsp;


줄바꿈 태그

<br> = </br>


주석

<!-- --> 한줄 또는 여러줄


문단 태그 <p> ~ </p>

- 문단을 나타내는 태그
- 블록 태그(한 라인을 다 차지한다)


제목 태그 <h1> ~ <h1>

- h1 ~ h6 까지 크기
- 블록 태그
- 검색엔진에서 제목으로 표현됨


Auto Rename Tag

- 시작태그와 종료태그가 변화하면 태그를 동일하게 변경해줌


서식 태그

- 글자를 꾸며주는 태그
- <b>: 텍스트를 굵게 표현
- <strong): 텍스트를 굵게 표현, 리더기에서 거센 발음으로 읽어줌
- <i>: 텍스트를 이탤릭체로 표현
- <em>: 텍스트를 이탤릭체로 표현, 리더기에서 거센 발음으로 읽어줌


웹 표준

- 웹에서 표준적으로 사용되는 기술이나 규칙
- w3c가 권고한 표준안에 따라 웹사이트를 작성할때 이용하는 HTML, CSS, JavaScript등에 대한 규정


웹 접근성

장애인, 고령자 등이 웹사이트에서 제공하는 정보에 비장애인과 동등하게 접근하고 이해할수 있도록 보장


목록 태그 

- <ul>: 순서가 없는 목록 태그, 블록태그

    · 김사과
    · 오렌지
    · 반하나

    <ul>
     <li>김사과</li>
     <li>오렌지</li>
     <li>반하나</li>
    </ul>


에밋(emmet)

- html, xml, xsl 문서 등을 편집할때 빠른 코딩을 위해 사용되는 플러그인
- 원래 부르던명칭은 젠코딩


- <ol>: 순서가 있는 목록 태그, 블록태그

    1. 김사과
    2. 오렌지
    3. 반하나

    <ol>
     <li>김사과</li>
     <li>오렌지</li>
     <li>반하나</li>
    </ol>


vscode 코드정렬

전체선택: 컨트롤 + a 
코드정렬: 컨트롤 + k,f


- <dl>: 정의 목록 태그, 블록 태그

해바라기반 선생님
    김사과 학생
    오렌지 학생
    반하나 학생

    <dl>
        <dt>해바라기반 선생님</dt>
            <dd>김사과 학생</dd>
            <dd>오렌지 학생</dd>
            <dd>반하나 학생</dd>
    <dl>


이미지 태그

1. 비트맵 이미지
- 픽셀이 모여서 만들어진 정보의 집합
- 레스터 이미지라고 부름
- 픽셀 단위로 화면에 렌더링함
- 그림판, 포토샵 등 툴로 편집
2. 벡터 이미지
- 수학적 정보의 형태들이 만들어내는 결과물
- 이미지가 가지고 있는 점, 선, 면의 위치, 색상정보를 가지고있음
- 확대 및 축소를 해도 이미지가 깨지지 않음
- 일러스트 같은 툴로 편집



jpg(jpeg)

- 압축률이 훌륭하여 사진이나 예술분야에 많이 사용
- 가장 널리 쓰이는 이미지 포멧
- 손실 압축
- 표현 색상(24비트, 약 1600만개 색상)이 뛰어나 고해상도 표시장치에 적합


gif

- 이미지 파일내에 이미지 및 문자열 같은 정보를 저장할 수 있는 파일
- 여러장의 이미지를 한 개의 파일에 저장할 수 있음(움짤, 애니메이션)
- 8비트(256색상)
- 비손실 압축


png

- gif 대체 포멧으로 개발
- 8, 24bit 컬러 이미지 처리
- 알파 채널 지원(투명도 0이면 투명 1로갈수록 불투명)
- w3c 권장 포멧


webp

- jpg, png, gif를 모두 대체할수 있는 구글이 개발한 이미지 포멧
- gif 같은 애니메이션 지원
- 알파채원 지원(손실, 비손실)
- 가장 완벽한 포멧


이미지 태그

- 이미지를 브라우저에 출력
- 인라인 태그(컨텐츠 크기 만큼만 영역 사용)

    <img src='이미지가 위치하는 주소or파일 경로' alt='이미지를 대신할 문장'>
https://www.iconfinder.com/
무료로 png이미지를 얻을수 있는곳


속성

태그를 보완하는 역할

<!DOCTYPE html>: HTML 버전
<html lang="en">: lang="en", 리더기(장애인분둘을 위한)의 언어를 설정(en: 영어, ko: 한국어)

<head>
    <meta charset="UTF-8">: 케릭터 셋이 utf-8 인코딩방식, 전세계의 모든국가의 os, 브라우저에서 모든 언어셋에 대해 설정
    <meta http-equiv="X-UA-Compatible" content="IE=edge">: 익스플로어에서 엣지 웹 호환하게 해주는것
    <meta name="viewport" content="width=device-width, initial-scale=1.0">: 모바일 브라우저에서 가장 최적의 크기로 페이지를 보여주고, 확대/축소를 금지
    <title>목록 태그</title>
</head>


메타 태그

- HTML 문서에 대한 정보를 정의 할때 사용
- <head> </head> 사이에 적용
- name, content, http-equiv, author, viewport, keyword, description....등 여러가지 속성

 

파일 경로 작성 방법


1. 절대경로
- 물리적 경로
    - URL주소: https://t1.daumcdn.net/b2/creative/97194/9b05b283fc19c06a3fee05c8baf5748b.jpg
    - 드라이브: C:\eadgnus\html\day1\sea1.png (웹사이트 개발시 사용하지 않음)


2. 상대경로
    이미지가 HTML문서와 같은 디렉토리에 있는경우:
        <img src="파일명">, <img src="./파일명">

    이미지가 하위 디렉토리에 있는 경우:
        <img src="디렉토리명/파일명">, <img src="./디렉토리명/파일명">

    이미지가 상위 디렉토리에 있는 경우:
        <img src="../파일명">, <img src="./../파일명">

    이미지가 상위 디렉토리의 다른 하위 디렉토리에 있는경우:
        <img src="../하위 디렉토리명/파일명">, <img src="./../하위디렉토리명/파일명">

728x90
반응형
LIST

'HTML' 카테고리의 다른 글

HTML- <Table>  (1) 2023.03.24
HTML- 책갈피 만들기(hyper link 이용)  (0) 2023.03.24
HTML- 호스팅  (0) 2023.03.24
HTML- 하이퍼링크(Hyper link)  (0) 2023.03.24
HTML- 기본편  (0) 2023.03.23
728x90
반응형
SMALL

클라이언트(Client)

서버로부터 서비스나 데이터를 요청하는 컴퓨터


서버(Server)


데이터를 포함하거나 네트워크의 다른 컴퓨터에서 액세스 하는 기능을 제공하는 컴퓨터



HTML(Hyper Text Markup Language)


HyperText(웹페이지에서 다른페이지로 이동할수 있는것) 기능을 가진 문서를 만드는 언어


CSS, JavaScript

 


최초의 웹사이트


http://info.cern.ch/

HTML 문서 만들기


- HTML 문서는 확정명을 .html로 저장
- 대소문자를 구별하지 않음
- 문서를 작성할수 있는 에디터라면 어디든지 작성이 가능(메모장도 가능)
- 띄워쓰기, 줄바꿈을 구별하지 않음
- 명령어(태그) 형태로 괄호를 (ex: <명령어>) 사용하여 표현
- 시작태그, 종료태그로 구성되어 있음 (ex: <명령어> ... </명령어>)

스켈레톤(기본 뼈대)

<html>
    <head> 
    
    </head>
    <body> 
    
    </body>
</html>

 

 

vscode에서 편하게 사용하는 팁

live server 설치
html문서를 선택 -> Alt + L 누르고, o

가로 스크롤 없애기
파일 -> 기본설정 -> 설정 -> wrap검색 -> word wrap을 on으로 바꾸기

728x90
반응형
LIST

'HTML' 카테고리의 다른 글

HTML- <Table>  (1) 2023.03.24
HTML- 책갈피 만들기(hyper link 이용)  (0) 2023.03.24
HTML- 호스팅  (0) 2023.03.24
HTML- 하이퍼링크(Hyper link)  (0) 2023.03.24
HTML- 태그  (0) 2023.03.23
728x90
반응형
SMALL

1. mysqlclient

  • 파이썬에서는 MySQL 서버와 통신할 수 있는 파이썬용 데이터베이스 커넥터의 종류가 여러가지 있음
  • PyMySQL, mysqlclient를 가장 많이 사용함
  • 사용법은 비슷하나 속도가 빠른 mysqlclient를 권장하고 있음
 

 

!pip install mysqlclient
 
Requirement already satisfied: mysqlclient in c:\users\administrator\appdata\local\programs\python\python38\lib\site-packages (2.1.1)
WARNING: You are using pip version 20.2.1; however, version 23.0.1 is available.
You should consider upgrading via the 'c:\users\administrator\appdata\local\programs\python\python38\python.exe -m pip install --upgrade pip' command.

 

import MySQLdb
 
 

 

# host: IP주소, localhost, 127.0.0.1
# user: 유저, root
# password: 비밀번호, 1234
# db: 데이터베이스, kdt
db = MySQLdb.connect(host='localhost', user='root', password='1234', db='kdt')
# db = MySQLdb.connect('localhost', 'root', '1234', 'kdt')
 

2. cursor 생성하기

  • 하나의 DataBase Connection에 대하여 독립적으로 SQL문을 실행할 수 있는 작업환경을 제공하는 객체
  • 하나의 connection에 동시에 한 개의 cursor만 생성할 수 있으며, cursor를 통해 SQL문을 실행하면 실행결과를 튜플 단위로 반환

 

cur = db.cursor()
sql = 'select userid, username, hp, email, gender from member'
cur.execute(sql)
# cur.execute('select userid, username, hp, email, gender from member')
 
9

3. SQL문 결과 가져오기

  • fetchall(): 한번에 모든 tuple을 가져옴. 검색 결과가 매우 크다면 메모리 오버헤드가 발생할 수 있음
  • fetchone(): 한번에 하나의 tuple을 가져옴. 다시 메서드를 호출하면 다음 데이터 하나를 가져옴
 

 

row = cur.fetchall()
print(row)
 
(('apple', '김사과', '010-1111-1111', 'apple@apple.com', '여자'), ('avocado', '안카도', '010-0000-0000', 'avocado@avocado.com', '남자'), ('banana', '반하나', '010-2222-2222', 'banana@naver.com', '여자'), ('berry', '배애리', '010-9999-9999', 'berry@berry.com', '여자'), ('grapes', '표도르', '010-5555-5555', 'grapes@grapes.com', '남자'), ('mango', '마앙고', '010-0000-0000', 'mango@mango.com', '남자'), ('melon', '이메론', '010-4444-4444', 'melon@melon.com', '남자'), ('orange', '오렌지', '010-3333-3333', 'orange@orange.com', '남자'), ('peach', '피이치', '010-0000-0000', 'peach@avocado.com', '여자'))

 

cur.execute(sql)

row = cur.fetchone()
print(row)
 
('apple', '김사과', '010-1111-1111', 'apple@apple.com', '여자')

 

# fetchone()을 이용하여 루프를 돌면서 모든 데이터를 출력하기
cur.execute(sql)

while True:
    row = cur.fetchone()
    if row:
        print(row)
    else:
        break
 
('apple', '김사과', '010-1111-1111', 'apple@apple.com', '여자')
('avocado', '안카도', '010-0000-0000', 'avocado@avocado.com', '남자')
('banana', '반하나', '010-2222-2222', 'banana@naver.com', '여자')
('berry', '배애리', '010-9999-9999', 'berry@berry.com', '여자')
('grapes', '표도르', '010-5555-5555', 'grapes@grapes.com', '남자')
('mango', '마앙고', '010-0000-0000', 'mango@mango.com', '남자')
('melon', '이메론', '010-4444-4444', 'melon@melon.com', '남자')
('orange', '오렌지', '010-3333-3333', 'orange@orange.com', '남자')
('peach', '피이치', '010-0000-0000', 'peach@avocado.com', '여자')
 

 

# cursor에 dictionary 형식으로 row를 유지하도록 내부 타입을 명시
cur = db.cursor(MySQLdb.cursors.DictCursor)
cur.execute(sql)

while True:
    row = cur.fetchone()
    if row:
#         print(row) # 딕셔너리
        print(f"아이디: {row['userid']}, 이름: {row['username']}, 전화번호: {row['hp']}, 이메일: {row['email']}, 성별: {row['gender']}")
    else:
        break
 
아이디: apple, 이름: 김사과, 전화번호: 010-1111-1111, 이메일: apple@apple.com, 성별: 여자
아이디: avocado, 이름: 안카도, 전화번호: 010-0000-0000, 이메일: avocado@avocado.com, 성별: 남자
아이디: banana, 이름: 반하나, 전화번호: 010-2222-2222, 이메일: banana@naver.com, 성별: 여자
아이디: berry, 이름: 배애리, 전화번호: 010-9999-9999, 이메일: berry@berry.com, 성별: 여자
아이디: grapes, 이름: 표도르, 전화번호: 010-5555-5555, 이메일: grapes@grapes.com, 성별: 남자
아이디: mango, 이름: 마앙고, 전화번호: 010-0000-0000, 이메일: mango@mango.com, 성별: 남자
아이디: melon, 이름: 이메론, 전화번호: 010-4444-4444, 이메일: melon@melon.com, 성별: 남자
아이디: orange, 이름: 오렌지, 전화번호: 010-3333-3333, 이메일: orange@orange.com, 성별: 남자
아이디: peach, 이름: 피이치, 전화번호: 010-0000-0000, 이메일: peach@avocado.com, 성별: 여자

4. Cursor와 Connection 닫아주기


 

cur.close() # 커서 닫기
db.close() # 커넥션 닫기
 

5. 데이터 삽입하기

 

 

sql = "insert into member(userid, userpw, username, hp, email, gender, ssn1, ssn2) values (%s, %s, %s, %s, %s, %s, %s, %s)"
data = ('avocado', '0000', '안카도', '010-0000-0000', 'avocado@avocado.com', '남자', '000000', '0000000')
cur.execute(sql, data)
db.commit()
 

 

sql = "insert into member(userid, userpw, username, hp, email, gender, ssn1, ssn2) values (%s, %s, %s, %s, %s, %s, %s, %s)"
data = [('mango', '0000', '마앙고', '010-0000-0000', 'mango@mango.com', '남자', '000000', '0000000'), ('peach', '0000', '피이치', '010-0000-0000', 'peach@avocado.com', '여자', '000000', '0000000')]
cur.executemany(sql, data)
db.commit()
 

문제

  • '회원가입' 프로그램을 만들어보자
 

 

import MySQLdb

db = MySQLdb.connect('localhost', 'root', '1234', 'kdt')
cur = db.cursor()

while True:
    try:
        userid = input('아이디를 입력하세요: ')
        userpw = input('비밀번호를 입력하세요: ')
        username = input('이름을 입력하세요: ')
        hp = input('휴대폰번호를 입력하세요: ')
        email = input('이메일을 입력하세요: ')
        gender = input('성별을 입력하세요: ')
        ssn1 = input('주민번호 앞자리를 입력하세요: ')
        ssn2 = input('주민번호 뒷자리를 입력하세요: ')
        zipcode = input('우편번호를 입력하세요: ')
        address1 = input('주소를 입력하세요: ')
        address2 = input('상세주소를 입력하세요: ')
        address3 = input('참고사항을 입력하세요: ')
        
        sql = "insert into member(userid, userpw, username, hp, email, gender, ssn1, ssn2, zipcode, address1, address2, address3) values (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"
        data = (userid, userpw, username, hp, email, gender, ssn1, ssn2, zipcode, address1, address2, address3)
        cur.execute(sql, data)
        db.commit()
        print('가입되었습니다')
        break
    except:
        print('다시 입력하세요')

cur.close()
db.close()
 
 

6. 데이터 수정하기


 

db = MySQLdb.connect('localhost', 'root', '1234', 'kdt')
cur = db.cursor()
 

 

sql = "update member set zipcode='11122', address1='서울시', address2='강남구', address3='역삼동' where userid='avocado'"
result = cur.execute(sql)
db.commit()

print(result)
 
1

 

sql = "update member set zipcode='22222', address1='서울시', address2='강남구', address3='역삼동' where userid='avocado'"
result = cur.execute(sql)
db.commit()

if result > 0:
    print('수정되었습니다')
else:
    print('에러!')
 
에러!

문제

  • 로그인 프로그램을 작성해보자
 

 

import MySQLdb
 
아이디를 입력하세요: apple
비밀번호를 입력하세요: 1111
로그인 되었습니다
728x90
반응형
LIST

'파이썬' 카테고리의 다른 글

DAO,DTO,VO  (0) 2023.03.22
폴더 관리(이동, 복사, 정렬)  (0) 2023.03.14
파일 입출력 라이브러리  (0) 2023.03.14
데코레이터(Decorator) - 함수 꾸며주기  (0) 2023.03.13
클로저(Closure)  (0) 2023.03.13
728x90
반응형
SMALL

1. DAO(Data Access Object)

  • DataBase의 data에 접근하기 위한 객체로 직접 dataBase에 접근하여 데이터를 삽입, 조회, 변경, 삭제등을 조작할 수 있는 기능
  • DataBase 접근을 하기 위한 로직과 비즈니스 로직을 분리하기 위해 사용
 

✔ 비즈니스 로직

  • 업무에 필요한 데이터처리를 수행하는 응용 프로그램의 일부
  • 데이터의 입력, 수정, 조회, 삭제 및 처리 등을 수행하는 각종 처리를 의미
  • 유저의 눈에는 보이지 않지만, 유저가 원하는 행위를 잘 전달하기 위해 짜여진 코드 로직
 

2. DTO(Data Transfer Object)

  • 데이터 전송(이동) 객체라는 의미
  • 로직을 가지지 않는 순수한 데이터 객체이며 getter/ setter 메소드만 가진 클래스를 의미
 

3. VO(Value Object)

  • Read-Only속성을 가진 오브젝트
  • DTO와 유사하지만 V0는 setter를 가지고 있지 않아 값을 변경할 수 없음
  • DTO는 인스턴스 개념이라면 VO는 리터럴 개념
  • DTP는 Layer간의 통신 용도로 사용하는 객체이며, VO는 특정한 비즈니스 로직의 값을 담는 객체
 

4. DAO, DTO를 활용한 단어장 만들기

 

 

# DTO 역할의 클래스

class Words:
    def __init__(self, eng, kor, lev=1): # 매개변수 객체로 받아주기 lev 기본값은 1로 설정됌
        self.eng = eng
        self.kor = kor
        self.lev = lev

    def setEng(self, eng): # 영단어 받아주는부분과 리턴해주는 부분을 나눠서 활용하기 위해 나눠주기
        self.eng = eng
    
    def getEng(self):
        return self.eng

    def setKor(self, kor): # 마찬가지
        self.kor = kor
    
    def getKor(self):
        return self.kor

    def setLev(self, lev): # 여기도 마찬가지
        self.lev = lev
    
    def getLev(self):
        return self.lev

    def printWord(self): # 전체 출력해주는 부분
        print(f'단어:{self.eng}, 뜻:{self.kor}, level{self.lev}')
 
 

 

word = Words('apple', '사과', 1)
 
 

 

word.printWord()
 
단어:apple, 뜻:사과, level1
 

 

# word.lev = 2
word.setLev(2)
 
 

 

word.printWord()
 
단어:apple, 뜻:사과, level2
 

 

# DAO 역할을 하는 클래스

class WordsDao:
    def __init__(self):
        self.datas = []
    
    def insert(self, word):
        self.datas.append(word)

    def update(self, word):
        for i in self.datas:
            if i.getEng() == word.getEng(): # 기존의 저장된 단어와 수정할 단어가 같다면
                i.setKor(word.getKor()) # 기존의 저장된 뜻에 수정할 단어의 뜻을 설정
                i.setLev(word.getLev())

    def search(self, eng): # 뜻과 레벨 출력
        for i in self.datas:
            if i.getEng() == eng:
                return i
    
    def selectAll(self):
        return self.datas
    
    def delete(self, word):
        self.datas.remove(word)
            
 
 

 

# Service를 담당하는 클래스
class WordsService:
    def __init__(self):
        self.dao = WordsDao()
    
    def insertWord(self):
        eng = input('단어를 입력하세요: ')
        kor = input('뜻을 입력하세요: ')
        lev = input('Level을 입력하세요: ') # 입력받고
        word = Words(eng, kor, lev) # 객체를 생성해서
        self.dao.insert(word) # insert메소드의 word 부분에 매개변수로 입력

    def printALL(self):
        datas = self.dao.selectAll() # 모든 데이터 리턴 메소드
        for i in datas:
            i.printWord() # 모든데이터를 i 에 대입해가며 프린트 해주는 메소드 사용

    def searchWord(self):
        eng = input('검색할 단어를 입력하세요: ') 
        word = self.dao.search(eng) # self.dao가 WordsDao() 클래스를 받아주게 설정해놓아서 그안의 서치 메소드를 사용
        if word == None:
            print('찾는 단어가 없습니다.')
        else:
            word.printWord() # 서치한 단어 출력해주기

    def editWord(self):
        eng = input('수정할 단어를 입력하세요')
        word = self.dao.search(eng)
        if word == None:
            print('수정할 단어를 찾지 못하였습니다.')
        else:
            kor = input('새로운 뜻을 입력하세요: ')
            lev = input('새로운 레벨을 입력하세요: ')
            word = Words(eng, kor, lev)
            self.dao.update(word)

    def delWord(self):
        eng = input('삭제할 단어를 입력하세요:' )
        word = self.dao.search(eng)
        if word == None:
            print('삭제할 단어를 찾지 못했습니다.')
        else:
            self.dao.delete(word)
 

 

# View 역할을 하는 클래스
class Menu:
    def __init__(self):
        self.service = WordsService()
    
    def run(self):
        while True:
            try:
                menu = int(input('1. 등록하기 2. 출력하기 3. 검색하기 4. 수정하기 5. 삭제하기 6. 종료하기'))
                if menu == 1:
                    self.service.insertWord()
                elif menu == 2:
                    self.service.printALL()
                elif menu == 3:
                    self.service.searchWord()
                elif menu == 4:
                    self.service.editWord()
                elif menu == 5:
                    self.service.delWord()
                elif menu ==6:
                    break
            except:
                print('다시 입력하세요.')

 
 

 

start = Menu()
start.run()
 
1. 등록하기 2. 출력하기 3. 검색하기 4. 수정하기 5. 삭제하기 6. 종료하기1
단어를 입력하세요: ㅁ
뜻을 입력하세요: ㅁ
Level을 입력하세요: 
1. 등록하기 2. 출력하기 3. 검색하기 4. 수정하기 5. 삭제하기 6. 종료하기2
단어:ㅁ, 뜻:ㅁ, level
1. 등록하기 2. 출력하기 3. 검색하기 4. 수정하기 5. 삭제하기 6. 종료하기3
검색할 단어를 입력하세요: ㅁ
단어:ㅁ, 뜻:ㅁ, level
1. 등록하기 2. 출력하기 3. 검색하기 4. 수정하기 5. 삭제하기 6. 종료하기6

5. MVC패턴

  • 디자인 패턴중 하나
  • M(Model), V(View), C(Controller)의 약자
  • 사용자가 view를 통해 controller를 조작하면 controller는 model을 통해 데이터를 가져오고, 그 정보를 통해 시각적인 담당을 하는 view를 다시 제어해서 사용자에게 전달됌
  • Model
    • 애플리케이션의 정보, 데이터를 나타냄
    • 사용자가 편집하길 원하는 모든 데이터를 가지고 있음
    • 뷰나 컨트롤러에 대해서 어떤 정보도 알지 말아야 함
    • 변경이 일어나면 변경 통지에 대한 처리방법을 구현해야함
  • View
    • 텍스트, 체크박스 등과 같은 사용자 인터페이스 요소를 나타냄
    • 모델이 가지고 있는 정보를 따로 저장해서는 안됌
    • 모델이나 컨트롤러와 같이 다른 구성요소들을 몰라야 함
  • Controller
    • 데이터와 사용자 인터페이스 요소들을 연결하는 다리 역할을 함
    • 모델이나 뷰에 대해 알고 있어야 함
    • 모델이나 뷰의 변경을 모니터링 해야 함
    • 애플리케이션의 메인 로직은 컨트롤러가 담당

✔ 디자인 패턴

  • 프로그램이나 어떤 특정한 것을 개발하는 중에 발생했던 문제점들을 정리해서 상황에 따라 간편하게 적용하여 쓸 수 있는 것을 정리한 '규약'을 통해 형태로 만든 것
728x90
반응형
LIST

'파이썬' 카테고리의 다른 글

MySQL client 라이브러리  (0) 2023.03.22
폴더 관리(이동, 복사, 정렬)  (0) 2023.03.14
파일 입출력 라이브러리  (0) 2023.03.14
데코레이터(Decorator) - 함수 꾸며주기  (0) 2023.03.13
클로저(Closure)  (0) 2023.03.13
728x90
반응형
SMALL

인덱스(index)란?

    - 테이블의 동작속도(조회)를 높여주는 자료구조
    - 데이터의 위치를 빠르게 찾아주는 역할
    - MYI(MySQL Index)파일에 저장
    - 인덱스를 설정하지 않으면 Table Full Scan이 일어나 성능이 저하되거나 장애가 발생할 수 있음
    - 조회속도는 발라지지만 update, insert, delete의 속도는 저하될 수 있음
    - MySQL에서는 primary key, unique 제약조건을 사용하면 해당 컬럼에 index가 적용됌
    - 인덱스는 하나 또는 여러개의 컬럼에 설정할 수 있음. 
    - where절을 사용하지 않고 인덱스가 걸린 컬럼을 조회하면 성능에 아무런 효과가 없음 ★★★★★
    - 가급적 업데이트가 안되는 값을 설정하는것이 좋음 

   

order by, group by와 index

    - order by 인덱스 컬럼, 일반컬럼: 복수의 키에 대해 order by를 사용한 경우 효과x
    - where 일반컬럼1='값' order by 인덱스컬럼: 연속하지 않은 컬럼에 대해 order by를 실행한 경우  효과x
    - order by 인덱스컬럼1 desc, 인덱스컬럼2 asc: desc와 asc를 혼합해서 사용한 경우 효과x
    - group by 일번컬럼1 order by 인덱스컬럼: group by와 order by의 컬럼이 다른경우 효과x
    - order by 함수(인덱스컬럼): order by 절에 컬럼이 아닌 다른표현을 사용한 경우 효과x
    

인덱스 문법

create index 인덱스명 on 테이블이름(필드이름)
create index 인덱스명 on 테이블명(필드명1, 필드명2, ...)
    
    
create index ix_hp on member(hp); # 인덱스 걸기
show index from member;



인덱스 조회하기 

show index from 테이블명; 

    
인덱스 삭제하기    

alter table 테이블명 drop index 인덱스명;

 

 

예시)

select * from member;
show index from member;
create index ix_hp on member(hp); # 인덱스 걸기
show index from member;

alter table member drop index ix_hp; # 인덱스 삭제하기

728x90
반응형
LIST

'DBMS > MySQL' 카테고리의 다른 글

MySQL- 트랜젝션(Transaction)  (0) 2023.03.21
MySQL- View  (0) 2023.03.21
MySQL- 사용자 추가하기  (0) 2023.03.21
MySQL- 데이터 조작(select)  (0) 2023.03.16
MySQL- 연산자  (0) 2023.03.16

+ Recent posts