20230321 kdt 수업일지

2023. 3. 21. 17:42학습일지

728x90

My SQL 사용자

1. 사용자 추가하기

- My SQL 8.0 Command Line Client 'root' 계정으로 로그인

- 로컬에서 접속 가능한 사용자 추가하기

   create user ' 사용자명'@localhost' identified by '사용자 비밀번호';

   create user 'apple'@'localhost' identified by '1111';

- DB 권한 부여하기

   grant all privileges on *.* to '사용자'@'localhost'; # 모든 DB에 접근 가능

   grant all privileges on 데이터베이스명.*to'사용자'@'localhost;

   flush privileges; # 새로운 세팅을 적용함

  ✔️ 할당 권한 상세 옵션

        create, drop, alter : 테이블에 대한 생성, 삭제, 변경 권한

        select, insert,update,delete: 테이블의 데이터를 조회, 삽입,변경,삭제에 대한 권한

        all: 모든 권한

        usage: 권한을 부여하지 않고 계정만 생성

        ex) grant select on 데이터베이스명. 테이블명 to '사용자'@'localhost'

  ✔️ IP 권한 상세 옵션

        %: 모든 IP에서 접근이 가능

        127.0.0.1: localhost에서 접근이 가능

        ex) grant select on 데이터베이스명. 테이블명 to '사용자'@'%';

        ex) grant select on 데이터베이스명. 테이블명 to '사용자'@'특정IP주소';

2. 사용자 계정 삭제하기 

 - drop user '사용자명'@'localhost'; 

# 문제.
# apple 데이터베이스에 kdt.member 테이블을 복사하고 해당 테이블의 select 권한만 가능한 orange 계정을 만들어보자.
use apple;
create table apple.member(select * from kdt.member);
create user 'orange'@'localhost' identified by '2222';
grant select on apple.member to 'orange'@'localhost';
flush privileges;
​
# orange로 로그인 후 테스트
use apple;
select * from member;
update member set point = 500 where userid='berry'; # Error Code: 1142. UPDATE command denied to user 'orange'@'localhost' for table 'member'
​
# 사용자 목록 조회
use mysql;
select user, host from user;
​
# 사용자 제거
# drop user 계정명; # 추천!
# delete from user where user=계정명;
​
# 사용자 권한 조회하기
# show grants for '계정명'@'localhost';
show grants for 'apple'@'localhost';
show grants for 'orange'@'localhost';
​
# 사용자 권한 제거하기
# revoke 권한명 privileges on 데이터베이스명.테이블명 from '계정명'@'localhost';
revoke all privileges on apple.* from 'apple'@'localhost';

ㄴqㄴㄴㄴㅇㅇㄴㄴ

뷰(VIEW)

-  가상의 테이블을 생성

- 실제 테이블처럼 행과 열을 가지고 있지만, 데이터를 직접 저장하고 있지는 않음

뷰를 만드는 이유

 - SQL 코드를 간결하게 만들기 위함

 - 삽입, 삭제, 수정 작업에 제한 사항을 가짐

 - 내부 데이터를 전체 공개하고 싶지 않을 때

# create view 뷰이름 as 쿼리 ...
use kdt;
select * from member;
select userid, username, hp, gender from member;
create view vw_member as select userid, username, hp, gender from member;
select * from vw_member;
​
# 문제
# member의 userid, username, hp와 profile의 mbti를 출력하는 뷰(vw_memberprofile)를 만들고 select만 할 수 있는 melon 계정을 생성
select m.userid, m.username, m.hp, p.mbti from member as m left join profile as p on m.userid = p.userid;
​
create view vw_memberprofile as select m.userid, m.username, m.hp, p.mbti from member as m left join profile as p on m.userid = p.userid;
select * from vw_memberprofile;
​
create user 'melon'@'localhost' identified by '3333';
grant select on kdt.vw_memberprofile to 'melon'@'localhost';
flush privileges;
​
# melon으로 접속 후 테스트
use kdt;
select * from member; # Error Code: 1142. SELECT command denied to user 'melon'@'localhost' for table 'member'
select * from vw_memberprofile;

 ✔️ 뷰 수정하기

       alter view 뷰이름 as 쿼리...

 ✔️ 뷰 대체

        create or replace viec 뷰이름 as 쿼리...

use kdt;
create or replace view vw_memberprofile as select m.userid, m.username, m.hp, p.mbti from member as m left join profile as p on m.userid = p.userid;

✔️ 뷰 삭제하기

     

# drop view 뷰이름;
drop view vw_member;
​
create view vw_member as select userid, username, hp, gender from member;
select * from vw_member;
​
update vw_member set hp='010-9999-9999' where userid='berry';
select * from vw_member; # 뷰 전화번호 데이터 변경됨
select * from member;
​
# Error Code: 1423. Field of view 'kdt.vw_member' underlying table doesn't have a default value
insert into vw_member values ('avocado', '안가도', '010-8888-8888', '남자'); # 테이블 not null 제약조건으로 인해 데이터 삽입이 안됨

트랜젝션(Transaction)

- 분할이 불가능한 업무처리의 단위

- 한꺼번에 수행되어야 할 연산 모음

   commit : 모든 작업들을 정상 처리하겠다고 화정하는 명령어로서, 해당 처리 과정을 DB에 영구적으로 저장

   rollback : 작업 중 문제가 발생되면 트랜잭션의 처리 과정에서 변경사항을 모두 취소하는 명령어

 

   start transaction

         블록안의 명령어들은 하나의 명령어 처럼 처리됨

         ...

         성공하던지, 실패하던지 둘 중 하나의 결과가 됨

         문제가 발생하면 rollback;

        정상적인 처리가 완료되면 commit;

트랜잭션의 특징

    - 원자성 : 트랜잭션이 데이터베이스에 모두 반영되던가, 아니면 전혀 반영되지 않아야 함

    - 일관성 : 트랜잭션의 작업 처리 결과가 항상 일관성이 있어야 함

    - 독립성 : 어떤 하나의 트랜잭션이라도, 다른 트랜잭션의 연산에 끼어들 수 없음

    - 영구성 : 결과는 영구적으로 반영되어야 함

 

# 자동 커밋 확인
show variables like '%commit%';
# autocommit: ON -> 자동으로 commit 해줌
# set autocommit=0 (off), set autocommit=1 (on)
set autocommit = 0;
​
select * from product;
start transaction;	# 트랜젝션의 시작. commit 또는 rollback으로 끝내야 함
insert into product values ('100005', '고철', '팔아요', 100, now());
select * from product;
commit; # 트랜젝션을 DB에 적용
​
start transaction;
insert into product values ('100006', '공병', '팔아요', 50, now());
select * from product;
rollback; # 트랜젝션을 취소하고 start transaction 실행 전 상태로 롤백함
select * from product;
​
# 트랜젝션의 예외
# DDL문(create, drop, alter, rename, truncate)에 대해 예외를 적용 -> rollback 대상이 아님
​
# truncate
# 개별적으로 행을 삭제할 수 없으며, 테이블 내부의 모든 행(데이터)를 삭제
# rollback이 불가능
# 트랜젝션 로그에 한 번만 기록하므로 delete 구문보다 성능 면에서 빠름
# truncate table 테이블명 = delete from 테이블명
select * from product_new;
start transaction;
delete from product_new;
select * from product_new;
rollback;
​
start transaction;
truncate table product_new;
select * from product_new;
rollback;
​
select * from product_new;
​
set autocommit = 1;
show variables like '%commit%';

인덱스(Index)

- 테이블의 동작속도(조회)를 높여주는 자료구조

- 데이터의 위치를 빠르게 찾아주는 역할

- MYI(MySQL Index)파일에 저장

- 인덱스르르 설정하지 않으면 Table Full Scan이 일어나 성능이 저하되거나 장애가 발생할 수 있음

- 조회속도는 빨라지지만 update, insert, delete의 속도는 저하될 수 있음

- My SQL에서는 primary key, unique 제약조건을 사용하면 해당 컬럼에 inde가 적용됨

- 인덱스는 하나 또는 여러개의 컬럼에 설정할 수 있음

- Where절에 사용하지 않고 인덱스가 걸린 컬럼을 조회하며 성능에 아무런 효과가 없음

- 가급적 update가 안되는 값을 설정하는 것이 좋음

 

order by, group by 와 index

- order by 인덱스컬럼, 일반컬럼: 복수의 키에 대해 order by를 사용한 경우

- where 일반컬럼 ='값' order by 인덱스컬럼: 연속하지 않은 컬럼에 대해 order by를 실행한 경우

- order by 인덱스컬럼1 desc, 인덱스컬럼2 asc: desc와 asc를 혼합해서 사용한 경우

- group by 일반컬럼1 order by 인덱스컬럼: group by와 order by의 컬럼이 다른 경우

- order by 함수(인덱스컬럼): order by 절에 컬럼이 아닌 다른 표현을 사용한 경우

 

인덱스 문법

- create index 인덱스명 on 테이블명(필드이름);

- create index 인덱스명 on 테이블명 (필드이름1, 필드이름2...);

 

인덱스 조회하기

- show index from 테이블명;

 

인덱스 삭제하기

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

select * from member;
show index from member;
​
create index idx_hp on member(hp);
alter table member drop index idx_hp;

1. DAO(Data Access Object)

  • DataBase의 data에 접근하기 위한 객체로 직접 DataBase에 접근하여 데이터를 삽입, 조회, 변경, 삭제 등을 조작할 수 있는 기능
  • DataBase 접근을 하기 위한 로직과 비즈니스 로직을 분리하기 위해 사용 ✔ 비즈니스 로직
  • 업무에 필요한 데이터처리를 수행하는 응용프로그램의 일부
  • 데이터의 입력, 수정, 조회, 삭제 및 처리 등을 수행하는 각종 처리를 의미
  • 유저의 눈에는 보이지 않지만, 유저가 원하는 행위를 잘 전달하기 위해 짜여진 코드 로직

    2. DTO(Data Transfer Object)

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

    3. VO(Value Object)

  • Read-Only 속성을 가진 오브젝트
  • DTO와 유사하지만 VO는 setter를 가지고 있지 않아 값을 변경할 수 없음
  • DTO는 인스턴스 개념이라면 VO는 리터럴 개념
  • DTO는 Layer간의 통신 용도로 사용하는 객체이며, VO는 특정한 비즈니스 로직의 값을 담는 객체
class Words:
    def __init__(self, eng, kor, 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 setcall(self, kor): 
        self.kor = kor

    def getcall(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}, 레벨: {self.lev}')
word = Words('apple','사과',1)
word.printWord()
# word.lev =2
word.setLev(2)
word.printWord()
# 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('레벨를 입력하세요:')
    word = Words(eng,kor,lev)
    self.dao.insert(word)

  def printAll(self):
    datas = self.dao.selectAll()
    for i in datas:
        i.printWord()

  def searchWord(self):
    eng = input('검색할 단어를 입력하세요:')
    word = self.dao.search(eng)
    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)
from IPython.lib.pretty import Breakable
# 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()

5. MVC 패턴

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

✔️ 디자인 패턴

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

 


오늘 여러가지일로 머리가 깨질뻔 했다 .

그중에서 코딩이 제일 머리가 덜아팠다.

오늘은 코딩이 재미있었다.

하지만 과제를 해야한다는 생각을 하니 막막하다.

오늘부터 밤샘 공부를 해야겠다.

할수있다 나는.(●'◡'●)

728x90
반응형

'학습일지' 카테고리의 다른 글

20230323 kdt 수업일지  (0) 2023.03.23
20230322 KDT 학습일지  (0) 2023.03.22
20230317 kdt 시험  (2) 2023.03.20
20230320 kdt 학습일지  (0) 2023.03.20
20230316 kdt 수업일지  (0) 2023.03.16