Real MySQL - 읽는이에게 충격과 경악을... 책 이야기

개발자와 DBA를 위한 Real MySQL - 10점
이성욱 지음/위키북스

오랜만에 만나 본 정말 좋은 우리나라 책이다. DBA 뿐만 아니라 MySQL 기반 웹 애플리케이션 개발자도 필수적으로 읽어봐야 할 책이다.

이 책을 읽으면서 함께 읽은 사람들이 "세상에.. 이걸 모르고 우리가 계속 개발하고 있었단 말인가?"를 연발했다.

이는 두 가지를 의미하는데, 이 책이 가려운데를 잘 긁어줬다는 얘기이고, 또 하나는 DBA가 아닌 애플리케이션 개발자들이 DB를 너무 대충 보고 개발한다는 점이다.

MySQL일반 뿐만 아니라 JDBC를 통한 연동 부분에서도 상당히 충격적(?)인 내용들이 있다. 예를들면 MySQL의 JDBC는 특별한 설정을 하지 않으면 PreparedStatement가 기본으로 꺼져 있고(PreparedStatement 객체로 쿼리를 날려도 소용없다. 일반 Statement로 강제 변환된다), setFetchSize()를 모두 무시하는 등 개발자의 예상을 빗나가는 행동을 많이 한다. 그 외에 MySQL 기반 웹 애플리케이션의 필수 항목인 Replication에 관련된 ReplicationDriver도 필독 사항이다(아래에 부가 설명).

예전에 SI가 주를 이루던 시대에는 Oracle이 중요했지만, 요즈음 일반 서비스 웹 애플리케이션 개발이 주를 이루는 현 시점에서는 MySQL이 더욱 중요해진 느낌이다.

MySQL 쿼리만 알고 대충 개발하는 개발자라면 모두 필독해야할 책이다.

단, MySQL에 완전히 무지한 경우에는 초보자 책을 먼저봐야한다. 이 책은 좋은 내용을 풍성하게 담고 있지만, 결코 완전한 SQL 초보자를 위한 책은 아니다. MySQL 서버를 다운로드해 설치하고 DB/테이블을 만들고 쿼리 정도는 날릴 줄 알아야 볼 수 있다.

http://www.wikibook.co.kr/wiki/Wiki.jsp?page=RealMySQL에서 소스를 다운로드하여 모두 압축을 풀고 다음 명령을 실행하면 예제 테이블과 데이터가 생성된다. 이제 책의 예문을 따라 해 볼 수 있게 된다.

$ mysql -uroot -p -t < employees.sql
$ mysql -uroot -p -t < test_employees_sha.sql
$ mysql -uroot -p -t employees < 예제DB\ employees_schema_modification.sql

책 455쪽에 보면 Delayed Join에 대한 내용이 나오는데, 실제로 이를 테스트 하면 결과가 어떻게 나오는지 궁금해서 테스트 코드를 짜 보았다. https://gist.github.com/kwon37xi/5652026 에서 소스를 볼 수 있고, 내 PC에서의 실행 경과는 다음과 같다.
  • 일반 Join : 19209 ms
  • Delayed Join : 8005ms

즉, 책의 말대로 지연된 조인(delayed join)이 훨씬 빠르다.

그리고, 책에서도 나오고, 이미 많이 알려져 있는 Replication Driver가 정말 잘 작동하는지 테스트도 해 보았다. MySQL Replication Driver와 Spring의 @Transactional(readOnly=true/false)을 조합하면 별도의 코딩작업 없이 MySQL Master/Slave DB 접속과 쿼리가 쓰기 트랜잭션에서는 자동으로 Master로, 읽기 트랜잭션에서는 자동으로 Slave로 가도록 만들 수 있다.

그래서 그게 진짜로 되는지 예제를 만들어 보았다(물론 잘 된다).

먼저 mysqlreplicationdriver.groovy 를 실행하여 일반 커넥션에 대해 setReadOnly() 에 따라 제대로 master/slave로 가는지 확인 해보고 그 다음에 ProductService.java에 @Transactional 애노테이션이 잘 작동하는지 확인해보면 된다.

Gradle이 설치 돼 있다면 별도의 IDE에 설치할 필요없이 프로젝트 문서에 나온대로 실행해서 확인해 볼 수 있다.

Replication Driver @Transactional 예제 소스 코드 : https://github.com/kwon37xi/jdbc-mysql-test


궁금한 사항이 있으면 저자의 Real MySQL 까페에 들러서 물어보면 친절히 답해주신다.


공유하기 버튼

 
 

덧글

  • 지돌스타 2013/06/26 13:13 # 삭제 답글

    좋은 책과 내용 소개해주셔서 감사합니다.
    덕분에 저도 책을 사서 보고 있습니다.
    근데.. 여기 내용상에 제가 아는 지식과 다른 부분이 있어서요.

    "예를들면 MySQL은 특별한 설정을 하지 않으면 PreparedStatement가 기본으로 꺼져 있고(PreparedStatement 객체로 쿼리를 날려도 소용없다. 일반 Statement로 강제 변환된다)"

    이 말은 "MySQL은"이 아니라 "JDBC는"이 아닌가 생각합니다. ^^
  • 권남 2013/06/26 13:29 #

    네, 정확히 말하면 "MySQL의 JDBC는"입니다.
    제 블로그에 오시는 분들이 대부분 Java 쪽이다보니, 별 생각없이 Java라고 가정하고 써서요.. ^^
    본문 내용 수정해두었습니다.
댓글 입력 영역