▶ 파트 1 (10시 ~ 11시 10분)
1. 테스트 코드 최종 수정
2. 추후 계획 정리
3. 보건증 발급 및 알바 준비
▶ 파트 2 (3시 ~ 12시)
1. 스프링 부트 프로젝트 생성 후 깃 연동 (이건 이제 안 까먹겠다..)
2. 자기소개서 수정
3. mysql 질문 정리 및 CH 8, 9(9.2.3 전까지) 정리
4. 알고리즘 고득점 키트 - 해시
5. mysql workbench 설치
▶ 최근 이슈
1. 시간 부족
=> 학원 수료해서 시간이 많이 날줄 알았는데 생각보다 적은 것 같다..
> 원인 : 운동 갔다 오는 시간, 알바 시간
> 해결 : 1시간만 더 일찍 일어나 보자, 운동은 짧고 굵게.
2. 테스트 코드
=> 자바 프로젝트 후 테스트 코드를 작성하며 TDD 방식을 조금이나마 깨닫게 되었다.
=> 이미 짜인 코드를 보며 테스트를 하는 것이 아닌 테스트를 만들어 두고 코드를 작성하는 것
> 이번 프로젝트 때 적용할 것
3. 깃 허브 정리
=> 깃허브로 리드미와 위키 정리 미흡
> 이번 주 중 알바 쉬는 날 잡고 하루에 해보자
4. 블로그 정리
=> 프로젝트용 중간 회고 필요
> 이번 프로젝트가 메인이기 때문에 중간중간 회고를 작성하는 것으로 결정
5. DB 공부
=> 어렵다.
> 익숙해질 때까지 반복적으로 보고 질문 답습 필수
6. 알고리즘
=> 고득점 키트로 ㄱㄱ
> 문제의 유형이 비슷하기 때문에 흐름을 읽자
> 코테 보는 곳 지원해서 경험 쌓아보기
▷ DB 정리
1. 관계형 데이터베이스란?
- 행과 열로 이루어진 각각의 테이블을 고유값(Primary Key)을 참조하여 서로 종속되는 관계(=연결하는 것)를 표현하는 데이터 베이스 구조
RDBMS의 장점
- 데이터의 분류, 정렬, 탐색 속도가 빠릅니다.
- 오랫동안 사용된 만큼 신뢰성이 높고, 어떤 상황에서도 데이터의 무결성을 보장해 줍니다.
- 기존에 작성된 스키마를 수정하기가 어렵습니다.
- 데이터베이스의 부하를 분석하는 것이 어렵습니다.
2. MySQL에서 사용하는 엔진
InnoDB
- 트랜잭션 처리 필요, 대용량 데이터를 다루는 부분에서 효율적
- 데이터의 변화가 많은 서비스
MVCC
- 하나의 트랜잭션에서 데이터에 접근하는 경우 데이터의 다중 버전 상태 중 보장되는 버전에 맞는 값을 반환하여 처리하는 방법을 의미
- 언두 영역에 의해 가능
- https://mozi.tistory.com/561
언두 영역이란
- UPDATE 문장이나 DELETE 문장으로 데이터를 변경했을 때 변경되기 전의 데이터(이전 데이터)를 보관하는 곳
- 트랜잭션의 롤백 대비용
- 트랜잭션의 격리 수준을 유지하면서 높은 동시성을 제공
MyISAM
- 트랜잭션 처리 필요 없음, Read only 기능이 많은 서비스일 수록 효율적
- select가 많은 서비스
3. 트랜잭션이란?
- 데이터베이스의 상태를 변경시키기 위해 수행하는 작업 단위
트랜잭션의 4가지 특징
1. 원자성
- 트랜잭션이 DB에 모두 반영되거나, 전혀 반영되지 않거나
- All or Nothing
2. 일관성
- 트랜잭션 작업 처리의 결과가 항상 일관되어야 함
- 데이터 타입의 반환 후와 전이 항상 동일
3. 독립성
- 하나의 트랜잭션은 다른 트랜잭션에 끼어들 수 없고 마찬가지로 독립적임을 의미
- 각각의 트랜잭션은 독립적이라 서로 간섭이 불가능
4. 지속성
- 트랜잭션이 성공적으로 완료되면 영구적으로 결과에 반영되어야 함
- 보통 commit이 된다면 지속성은 만족할 수 있다.
격리수준
- 트랜잭션의 격리 수준이란 여러 트랜잭션이 처리될 때, 트랜잭션끼리 얼마나 서로 고립되어 있는지 나타내는 것
- 특정 트랜잭션이 다른 트랜잭션에 변경한 데이터를 볼 수 있도록 허용할지 말지를 결정하는 것
- https://velog.io/@sa1341/트랜잭션-격리-수준 Isolation-Level이란
1. READ uncommitted
- 어떤 트랜잭션 변경 내용이 COMMIT이나 ROLLBACK과 상관없이 다른 트랜잭션에서 보임
- 데이터 정합성에 문제가 많으므로, RDBMS 표준에서는 격리 수준 인정 안 함
- Dirty Read 이슈 : 커밋되지 않은 전 데이터를 조회하는 경우
2. READ committed
- 어떤 트랜잭션의 변경 내용이 COMMIT 되어야만 다른 트랜잭션에서 조회 가능
- 오라클에서 기본적으로 사용하고, 온라인 서비스에서 가장 많이 사용하는 격리 수준
- NON-REAPEATABLE READ 부정합 문제 발생 : 자신의 트랜잭션 번호보다 낮은 트랜잭션에서 변경된(커밋된) 것만 보게 되는 것
3. REPEATABLE READ
- 트랜잭션이 시작되기 전에 커밋된 내용에 대해서만 조회할 수 있음
- MySQL에서 기본적으로 사용하고, NON-REAPEATABLE READ 부정합 발생하지 않음
- 언두 영역 이용
- Phantom Read 이슈 : 한 트랜잭션 내에서 같은 쿼리 두 번 실행 시 첫 번째 없던 유령 레코드가 나타나는 경우 - Insert 시 발생
4. SERIALIZABLE
- 가장 단순하고 가장 엄격한 격리 수준
- InnoDB에서 기본적으로 순순한 SELECT 작업은 아무런 잠금을 걸지 않고 동작하는데, 읽기 작업에도 공유 잠금을 설정하게 된다. 이러면 동시에 다른 트랜잭션에서 이 레코드를 변경하지 못하게 됨
- 동시처리 능력이 다른 격리 수준보다 떨어지며, 성능 저하가 발생하게 된다
4. 인덱스란?
- 데이터베이스 테이블에 대한 검색 성능의 속도를 높여주는 자료구조
- 해당 칼럼 데이터 정렬 및 별도의 메모리 공간에 데이터의 물리적 주소와 함께 저장됨 - 검색 속도의 향상
- 책에 있는 목차 같은 것
클러스터 인덱스와 넌 클러스터 인덱스
두 인덱스의 특징적 차이
- 데이터를 어떤 식으로 조회하는가?
- 클러스터 : 페이지를 알기 때문에 바로 그 페이지를 펴는 것
- 넌 클러스터 : 뒤에 목차에서 찾고자 하는 내용의 페이지를 찾고 그 페이지로 이동
- 클러스터 인덱스는 데이터 위치를 바로 알기 때문에 그 데이터로 바로 접근할 수 있고, 넌 클러스터 인덱스는 인덱스 페이지를 한번 거쳐서 데이터에 접근하는 방식이다.
- 읽기, 쓰기, 삭제 등에서 어떤 게 더 유리한가?
- 넌 클러스 인덱스(인덱스 자체의 리프 페이지는 데이터가 아니라 데이터가 위치하는 포인터(RID)이므로 검색은 느리지만 입수삭은 빠르다.
인덱스에서 사용되는 자료구조
왜 인덱스는 Tree 구조를 사용할까? Hash를 사용하는 게 더 좋지 않을까?
- Hash는 (O(1)) Big-O 표기법상 가장 빠른 탐색의 특징을 가진 자료구조이다.
- 하지만 이것은 명백히 단일 행 조회 시만 해당 - 범위 검색은 해당되지 않음
B-Tree
- 하나의 노드에 여러 데이터가 저장 가능한 트리
B-Tree를 사용하는 이유
- 트리 내 모든 데이터가 항상 정렬된 상태로 유지되기 때문에,
등호(=) 연산뿐만 아니라 부등호(>, <) 연산 처리도 가능하다.
- 포인터 접근 방식이 적어 매우 많은 데이터가 있어도 속도 이슈가 적다.
- 데이터 탐색뿐 아니라, 삽입 및 수정 및 삭제에도 항상 O(log N)의 시간 복잡도를 가진다.
반응형
'레거시' 카테고리의 다른 글
2022.05.02 「자기소개서, 프로젝트 수정」 (0) | 2022.05.02 |
---|---|
2022.04.27의 기록 (0) | 2022.04.26 |
2022.04.25의 기록 (0) | 2022.04.25 |
2022.04.24의 기록 (0) | 2022.04.24 |
2022.04.23 의 기록 (0) | 2022.04.23 |