2023. 3. 21. 17:42ㆍ학습일지
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
- 데이터와 사용자 인터페이스 요소들을 연결하는 다리 역할을 함
- 모델이나 뷰에 대해 알고 있어야 함
- 모델이나 뷰의 변경을 모니터링 해야 함
- 애플리케이션의 메인 로직은 컨트롤러가 담당
✔️ 디자인 패턴
- 프로그램이나 어떤 특정한 것을 개발하는 중에 발생했던 문제점들을 정리해서 상황에 따라 간편하게 적용하여 쓸 수 있는 것을 정리한 "규약'을 통해 형태로 만든 것
오늘 여러가지일로 머리가 깨질뻔 했다 .
그중에서 코딩이 제일 머리가 덜아팠다.
오늘은 코딩이 재미있었다.
하지만 과제를 해야한다는 생각을 하니 막막하다.
오늘부터 밤샘 공부를 해야겠다.
할수있다 나는.(●'◡'●)
'학습일지' 카테고리의 다른 글
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 |