2022-02-21(월)

Jeongyun Heo·2022년 2월 21일
0

파일을 공유하는 방식에서는 막을 방법이 없음

데이터 관리
• 사용자 인증
• 사용자 권한 관리
• 동기화 관리

데이터 관리 프로그램을 별도로 만들고 파일을 관리하도록 하자
이 프로그램에서 요청해서 처리하도록 하자
누가 접근할 수 있고 누가 접근할 수 없는지
사용자 인증
사용자별로 권한을 정교하게 조정할 수 있다
변경하고 있는 데이터를 함부로 삭제할 수 없다
값을 읽는 용도로 접근하는 건 동시에 접근 가능

✓ 데이터 관리를 학문적으로 체계화 시키자
더 일관된 방식으로 프로그래밍을 할 수 있고
그 프로그램을 만든 사람도 더 일관된 방식으로 관리할 수 있다

데이터 엔지니어링
데이터 공학

공학 : 기술 경험을 학문적으로 체계화시킨 거
소프트웨어 개발 성공 확률을 높이자
S/W 공학

Database : 학문
DBMS : 시스템

경험적으로 얻은 걸 학문적으로 체계화 시켜서 데이터베이스를 만들었고
다시 소프트웨어를 만든 게 DBMS
DBMS : 데이터베이스를 실제적으로 동작되게 하는 소프트웨어

인증된 사용자만 데이터를 꺼내게 하자
사용자마다 레벨을 다르게 하자
데이터를 동시에 변경하게 하려 할 때 순서대로 변경하게 하자

이런 특징들이 있을 때만 이걸 데이터베이스라고 하자

데이터베이스 자료구조
ACID 규칙
• 원자성
• 일관성
• 격리성
• 내구성

통신을 대행해주는 라이브러리
App이 명령어를 보낸다
호출한 App에 리턴한다

SQL 문법

DBMS에서 클라이언트 프로그램을 제공
보통 DBMS 서버를 설치하면 클라이언트를 한 쌍으로 함께 제공

mysql.exe (.exe 생략 가능)

mysql -u root -p : root 관리자 권한으로 로그인

DBMS에서 제공해주는 클래스를 사용

SQL문 문법을 먼저 배워야 함

① DDL : 데이터 구조 정의, 함수/프로시저/리스너 정의
② DML : INSERT, UPDATE, DELETE
③ DQL : SELECT

/Users/nana/git/eomcs-docs/sql/Exam01.sql

148번째 줄

🔹 char(n)
‐ 고정 크기를 갖는다.
‐ 한 문자를 저장하더라도 n자를 저장할 크기를 사용한다.
‐ 0 <= n <= 255
‐ 메모리 크기가 고정되어서 검색할 때 빠르다.

> insert into test1(c1) values('가나다라마'); /* 한글 영어 상관없이 5자 */

🔹 varchar(n)
‐ 한 문자를 저장하면 한 문자 만큼 크기의 메모리를 차지한다.
‐ 메모리 크기가 가변적이라서 데이터 위치를 찾을 때 시간이 오래 걸린다.
  검색할 때 위치를 계산해야 하기 때문에 검색 시 느리다.

Oracle는 varchar(n) 5000자까지 가능

UTF-8로 지정된 경우는 한글은 21844자

메모리 크기가

MariaDB [studydb]> insert into test1(c1) values('가나다라마바');
ERROR 1406 (22001): Data too long for column 'c1' at row 1

c1 char(5),
내부적으로 메모리 5칸
빈문자열을 저장해도 무조건 5자임

그림이 들어간 게시글

바이너리 데이터를 텍스트로 바꾼다
그림을 문자열로 바꾼다

com.eomcs.io.ex15

import java.util.Base64.Encoder;

Base64에 소속된 Encoder는 static 중첩 클래스

배열 크기만큼 복사해야 됨

버퍼에 꽉 안 채울 수도 있음
배열 전체를 바꾸기 때문에
꽉 안 찬 부분은 빼고 바꿔야 됨

copyOf()
값만큼만 담은 새 배열을 만들고 encodeToString()한테 넘긴다

파일에서 1024바이트를 읽어서 텍스트를 바꾼 거

이렇게 바꾼 걸 파일에 저장하겠다

검색 키워드는 기억해야 됨
base64를 검색!!!!!

바이너리 파일
텍스트 파일은 꼭 전용 프로그램이 아니더라도 메모장으로 열어서 수정 가능

텍스트에 바이너리 베이터를 삽입할 수 없음
바이너리 데이터를 서버에 보내는 전용함수가 따로 있음
전용 함수를 따로 쓰지 않고 바이너리 데이터를 텍스트로 바꿔서 저장하는 방법이 있다

이미지

텍스트는 그대로 두고
바이너리 데이터는 텍스트로 바꾼다

🔹 base64 알고리즘
바이너리 데이터를 텍스트로 바꿀 때 사용하는 알고리즘
암호화가 아님

암호
A -----> B
쌍방향
아무런 키 없이 B에서 A로 바꿀 수 있다
암호를 시킬 때 key와 복호화할 때 key가 같으면
암호화 할 때는 key1으로 하고 복호화 할 때는 key2로 하는 방법
공개키, 개인키

바이너리 형식으로 출력할 때 사용할 파일

통째로

파일 크기 모름

length()의 리턴타입은 long 타입

배열 크기는 int 범위를 넘어갈 수 없음

21억 바이트를 다 읽고 싶다고 해서 다 읽어지는 게 아님
운영체제가
실제 운영체제에서 다 읽지 않고 리턴할 수 없음
length
원래는 반복문으로 짜야 됨
원래 파일 크기와 읽은 파일 크기를 비교해서 한 번 더 읽어야 됨

복합 컨텐츠를 저장할 때
그 컬럼의 타입을 텍스트 타입으로 하면 된다
단 게시글에 들어 있는 그림을 텍스트로 바꿀 때는 base64 방법을 쓰면 된다

getting data save

longtext(약 2GB)

보통 게시글 저장할 때 그림 파일도 같이 넣는 경우가 흔함

나중에 자바스크립트랑 연계해서 테스트해보자

date : 년월일만 저장

time : 시분초 저장

datetime : 년월일 시분초

그림을 포함한 게시글인 경우에는 그림을 base64로 인코딩해서

Base64 - 바이너리 데이터를 텍스트로 다루고 싶을 때

🔹 Base64
바이너리 데이터를 텍스트로 변환할 때 사용하는 인코딩 방식

binary ------base64 encoding-----> text
Base64.getEncoder().encode(바이트배열) => String

🔹 Base64의 다른 사용 예
8 bit 문자열 -----> 7 bit 문자열로 변환
네트워크 장비를 통과할 때 8bit를 통과 못 하는 장비에 통과시키고 싶을 때

바이너리 데이터를 html 파일에 꼭 포함해야 되는 경우가 있음

↓ 주소가 아니라 자체가 데이터
data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABA

그림까지 포함할 가능성이 있기 때문에 1메가 이상이 저장될 수 있음

com.eomcs.net.ex10 - java-lang/src/main/java
리얼리티는 떨어지지만 순수한 방법

Base64로 바꾸면 7비트가 넘어가지 않는다
7비트 이하의 코드로 바꿈

잘리는 걸 방지하기 위해서 8비트 문자를 7비트로 바꿀 때도 사용

게시판 안에 글과 그림을 저장할 때
그림을 base64로 인코딩해서 텍스트화 한 다음에 통째로 데이터베이스에 저장하는 방법이 있습니다.

테이블은 서버에서 생성한 거

> create table test1(
  c1 date,
  c2 time,
  c3 datetime
  );

MariaDB [studydb]> insert into test1(c3) values('16:13:33');
ERROR 1292 (22007): Incorrect datetime value: '16:13:33' for column `studydb`.`test1`.`c3` at row 1

재직중 Y / N
임의의 값으로 초기화 시킴
탈퇴한 회원의 게시글은 "이미 삭제된 게시글입니다"

삭제된 게시글입니다 하고 데이터를 가지고 있는지

DBMS에 boolean 라는 타입이 없는 것도 있음

boolean은 tinyint(1바이트)로 저장된다

직접 숫자 주기 말고 true, false로 저장하기

이메일, 주민번호, 휴대폰 번호는 절대 중복이 일어나지 않으니까 키 컬럼 가능

데이터와 데이터를 무엇을 기준으로 구분할 것인가

id: 나를 나타내는 또다른 별명

tel: 집전화

basic_addr

데이터를 구분할 때 사용하는 컬럼들의 집합

key : 데이터를 구분할 때 사용하는 컬럼들의 집합

가능하면 컬럼을 여러 개 하지 말고 줄일 수 있을 만큼 줄여라

최소키

key -> candidate key -> primary key/alternate key, Artificial key

key
name, tel
email
id
jumin
email, name
name, postno, basic_addr

줄이고 줄여서 만든 키

한 번 키로 결정되면 절대 못 바꿈
이메일을 바꿀 일이 없으면 키로 사용해도 되는데 바꿀 일이 있으면

나머지는 후보키
키는 아니지만 키의 대안으로 쓸 수 있는 거
대체 키(Alternate Key)

데이터가 큰 걸 키로 사용하는 건 좀...

기존에 있는 컬럼 중에서 키로 쓸 게 없다..
임의의 컬럼을 만든다!

artificial key (인공키)
기존의 컬럼들 중에서 키로 사용할 만한 컬럼이 없다면 키로 사용할 임의의 컬럼을 추가한다.

현업에 가면 테이블 대부분이 artificial key를 쓴다
정수값을 쓰기 때문에 다루기가 편하다
실제 회원 정보를 담을 때도 회원 일련번호를 사용한다

회원에게 임의로 부여한 일련 번호를 사용한다
나중에 이메일, 전화번호 바꿀 수 있게끔

이렇게 변경될 수 있는 값인 경우, PK로 사용하지 말라.값이 변경할

중복 입력이 돼도 막을 방법이 없다

이름이 중복되지 않는 성적 테이블을 만들어보자

MariaDB [studydb]> insert into test1(name,kor,eng,math) values('aaa', 100, 100, 100);
ERROR 1062 (23000): Duplicate entry 'aaa' for key 'PRIMARY'

pk는 기본이 not null

MariaDB [studydb]> insert into test1(kor,eng,math) values(100, 100, 100);
ERROR 1364 (HY000): Field 'name' doesn't have a default value

constraint 제약조건이름 primary key (컬럼명, 컬럼명, ...)

컬럼 여러 개를 묶어서 하나의 키로 사용할 수 있다.

합격자 조회
수험 번호 입력
수험번호
주문번호
제품번호
접수번호

대체키 (Surrogate key)

유니크 uk

constraint test1_uk unique (name, age)
이름과 나이가 동시에 중복되지 않아야 함

Key에 Unique라고 나오진 않음

index
어떤 테이블을 기준으로 index를 만들지
테이블이 처음에 왕창 데이터를 입력한 다음에
그 다음에 수정이 드물게 일어나는 경우
인덱스를 잘 정의해두면 데이터를 찾는 속도가

적어도 10만건

있냐 없냐에 따라서 조회 속도가 달라짐

mysql console warning message display

https://mariadb.com/kb/en/show-warnings/

SHOW WARNINGS [LIMIT [offset,] row_count]
SHOW ERRORS [LIMIT row_count OFFSET offset]
SHOW COUNT(*) WARNINGS

ALTER TABLE test1
add column to int;

ALTER TABLE test1
modify column age

데이터 타입까지 다시 지정해야 됨

현재 데이터가 바꾼 후의 컬럼에도 들어갈 수 있는가

현재 데이터를 새 컬럼에 넣을 수 있으면 OK

컬럼 값 자동 증가
숫자 타입의 PK 컬럼인 경우 값을 1씩 자동 증가시킬 수 있다.
unipue도 가능

같은 테이블에 있는 걸 게시판마다 다르게 뿌리는 거

보통 카페는 테이블 1개
분류명이 여러 개 만들어짐

일단 기본 테이블을 정의한 다음에

MariaDB [studydb]> alter table test1
    ->   modify column no int not null auto_increment;
ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key

0개의 댓글