독후감/IT 서적

[후기] SQL 첫걸음

kth990303 2022. 11. 12. 16:21
반응형

프로젝트를 진행하면서 SQL, 인덱스, MySQL innoDB 구조 및 원리 공부 필요성을 느끼게 됐다.

이 책은 SQL 첫걸음과 SQL 레벨업이라는 시리즈로 구성돼있다. SQL 레벨업을 읽기 전, SQL 첫걸음을 복습 겸 읽고 간단하게 후기를 남겨보려 한다.


좋았던 점

SQL 작동 결과에 대해 쉽게 이해할 수 있도록 다양한 예시로 어렵지 않게 설명되어있다. 입문자도 편안하게 접근할 수 있고, 숙련자라면 복습용으로 부담없이 읽을 수 있다는 점이 장점이다.

 

직접 찍어서 화질이 별로 좋지 않다...

정규화를 예시로 들어보자.

이 책은 제1 정규화부터 제3 정규화까지 그림과 예시를 들어서 쉽게 설명해준다. 제1 정규화에서 요구되는 `하나의 셀에 여러 데이터가 들어갈 수 없다`는 내용을 테이블 예시를 들어서 설명한다. 중복 데이터를 제거하기 위한 테이블 분할 과정도 보여준다.

 

`제2 정규화에선 ~~와 같이 작동한다`와 같은 예시로 쉽게 설명해준 후에, `제2 정규화는 부분 함수종속성을 찾아내서 테이블을 분할한다`와 같이 어려운 말로 정리해주는 편이다. 쉽게 설명한 후에 어려운 말을 보여주므로 이해하기 편하다.

 

중간중간 나오는 Point로 요약을 해주기도 한다.

 

당연한 얘기지만 RDBMS 내용이 주를 이루며, MySQL 기준으로 설명한다.

하지만 Oracle 등 타 DB에 익숙한 독자들을 위해 표준화된 문법으로 설명하고 있으며, Oracle, MySQL, SQL Server 등의 방언 역시 별도로 추가설명해주는 부분이 있으므로 MySQL이 아닌 타 DB 유저라도 겁내지 않아도 좋을 듯하다.


아쉬웠던 점

아무래도 `SQL 첫걸음`이라는 책 제목답게 깊은 내용은 설명돼있지 않다. 

어렵거나 깊은 내용에 초점이 맞춰져있다기보단, 쉽게 이해할 수 있도록 초점이 맞춰져있는 책이다.

 

예를 들자면 인덱스가 binary-tree 성질을 이용하여 읽기 작업을 O(logN)으로 빠르게 동작할 수 있다는 점 정도는 소개가 되어있지만, b-tree와 b+tree의 차이점을 비교하거나 b-tree의 내부 원리는 소개되어있지 않다. (SQL 레벨업 책에는 소개돼있는 듯하다.)

 

또, MySQL의 버전에 따른 차이점, MyISAM vs innodb 차이점, innodb의 내부 원리, dump를 위한 백업 등에 대한 내용은 모두 빠져있다. 트랜잭션 커밋/롤백 전에 임시로 저장되는 영역인 `롤백 세그먼트`도 `임시영역`이라고 간단하게 언급하며, REDO 또는 UNDO log에 대한 내용은 빠져있다. DB lock에 대한 내용도 모두 빠져있다.

 

사실 어떻게 보면 당연하다.

입문자를 위한 책인데 위와 같은 내용들까지 모두 소개한다면 DB에 대한 흥미를 잃고 도망가지 않을까...?

그래도 간단한 트랜잭션 및 DB 설계, 인덱스에 대한 내용은 모두 포함돼있으며, 집계함수와 서브쿼리 사용법 및 주의점들은 모두 책 속에 내용이 들어가있다.


추천 대상

 

- SQL을 처음 사용해보려 하는 학생 (이 경우, 모든 내용을 이해할 순 없음)

- SQL 문법을 어느 정도 알고 있으며, 인덱스 개념을 알고 있는 대학생 (적정)

- 백엔드 프로젝트에서 쿼리튜닝 및 성능개선을 진행해본 대학생 및 주니어 개발자 (비교적 쉽다고 느낄 수 있음)

 

 

아예 SQL 문법 사용 경험이 없거나, DBA를 준비하는 주니어(2~3년차 이상) 개발자라면 이 책으로부터 얻는 게 없을 확률이 높다. 

 

내가 이 책을 처음 읽었던 것은 2021년이다. 군대에 있을 때 간단하게 읽어본 경험이 있다.

그 때 당시 내 실력은, SQL 문법을 아주 조금 알고 있는 상황이었고 인덱스는 아예 모르는 상황이었다. 그 때 당시에 이 책을 읽었을 때는 서브쿼리, SQL 문법 정도만 이해가 됐었다. 인덱스, DB 설계 및 정규화는 읽어도 크게 와닿지 않았으며, 돌이켜보면 이해를 1도 못하고 넘어갔었다. 이 때에는 이 책을 읽는데 무려 10~15시간 정도가 걸렸다.

 

 

그 다음으로 읽었던 건 최근 우아한테크코스 프로젝트를 진행한 후, 즉 지금 이 글을 쓰는 시점이다. 인덱스를 통한 성능개선, 집계함수 성능차이를 고려한 쿼리튜닝 경험이 있으며, MySQL innoDB의 간단한 동작원리 및 트랜잭션의 이해가 있는 상태다.

이 때 읽으니까 책이 비교적 부담없이 느껴졌으며, 읽는 데는 약 3~4시간 정도가 소요됐다. 약 350 페이지에 가까운 책임에도 불구하고 빠르게 읽을 수 있었던 것이다. 가벼운 복습용으로 읽기 좋았으며, 내실을 다지기에 좋았다. 하지만 마찬가지로 아직 경험이 부족한 주니어개발자 상태이기 때문에 모르거나 까먹은 내용을 습득하는 기회 역시 존재했다.

 

내가 이 책을 읽으면서 습득한 내용 및 복기하면서 유용한 내용을 간단히 소개해보겠다.

예를 들자면, Select Distinct Count(*) 명령어로 중복데이터의 개수를 확인하는 것은 불가능하다. count 명령어가 먼저 진행되기 때문에 distinct 명령어로는 중복데이터를 제거할 수 없기 때문이다. 의도한대로 하려면 select count(distinct *)와 같이 사용해야 했다. 프로젝트 진행할 때에는 이 점을 모르고 계속 삽질한 경험이 있었는데, 이 책을 읽고 다시 한 번 되돌아볼 수 있었다.

당시엔 queryDSL 숙련도 부족으로 발생한 버그인줄 알았는데, 알고보니 distinct 순서 잘못이었음.

이 때 당시에 Spring Data JPA를 queryDSL로 마이그레이션하는 작업을 진행하고 있었는데, distinct를 count 앞에 놓았다가 의도한대로 결과가 나오지 않아 결국 배포 직전에 해당 쿼리만 JPQL로 롤백한 경험이 있다ㅋㅋㅋ

집계함수의 인수로 DISTINCT를 사용해야 한다는 점을 이 때 숙지하고 있었다면 이러한 삽질을 할 필요가 없었을텐데...

다행히 이 책을 읽을 때엔 버그 개선 후 시점이어서 이 내용을 알고 있는 상태였다. 해당 파트를 읽으면서 이 때 상황이 팍 떠올랐다ㅋㅋ

 

 

또, UNION과 UNION ALL에서 성능 차이(UNION ALL은 중복체크를 할 필요가 없어 UNION보다 빠르다)가 존재한다는 점을 이용하여 중복데이터를 제거할 필요가 없거나 중복데이터가 존재하지 않을 경우 UNION ALL을 사용하면 좋다는 쿼리튜닝 관련 내용도 습득할 수 있었다. 그리고 DISTINCT vs GROUP BY 성능에 대해서도 고민해볼 수 있었다.

 

그리고 트랜잭션 커밋/롤백 전에 저장하는 영역을 임시영역이라고만 소개가 되어 있지만, MySQL의 REDO 또는 UNDO를 이용한 스냅샷 과정을 알고 있다면 이 임시영역이 segment와 관련된 내용이라는 것을 떠올릴 수 있다. 이에 나아가 UNDO log를 활용한 데이터 스냅샷 및 ACID의 isolation 성질과 트랜잭션 격리레벨, REDO를 활용한 백업 등등을 복습할 수 있는 기회가 된다. 즉, 복습 및 복기용으로 꽤 괜찮은 책이었다.


작년에 이 책을 읽었을 때에는 이해가 안되는 부분들도 많았지만, 지금 다시 읽으니 이해안되는 부분이 줄어든 게 확실히 느껴졌다.

또한, 작년과 올해 읽을 때의 느낌이 많이 달랐다. 확실히 책이란 것은 아는만큼 보이기 때문에 여러번 읽는 것이 절대 시간낭비가 아니고 오히려 큰 도움이 된다는 것을 느낄 수 있었다.

 

시간이 된다면 SQL 레벨업도 읽고 후기를 작성해봐야겠다.

반응형