126 개발자를위한 오라클 SQL 튜닝 이경오지음
126 개발자를위한 오라클 SQL 튜닝 이경오지음
표지사진강수진이책의표지는강수진님이보내주신풍경사진을담았습니다. 리얼타임은독자의시선을담은풍경사진을책표지로보여주고자합니다. 사진보내기 ebookwriter@hanbit.co.kr 개발자를위한오라클 SQL 튜닝 초판발행 2016 년 2 월 16 일 지은이이경오 / 펴낸이김태헌펴낸곳한빛미디어 ( 주 ) / 주소서울시마포구양화로 7길 83 한빛미디어 ( 주 ) IT출판부전화 02-325-5544 / 팩스 02-336-7124 등록 1999년 9월 30일제10-1779호 ISBN 978-89-6848-799-6 15000 / 정가 14,000원 총괄전태호 / 책임편집김창수 / 기획 편집정지연 / 교정이미연디자인표지 / 내지여동일, 조판최송실마케팅박상용, 송경석 / 영업김형진, 김진불, 조유미 이책에대한의견이나오탈자및잘못된내용에대한수정정보는한빛미디어 ( 주 ) 의홈페이지나아래이메일로알려주십시오. 한빛미디어홈페이지 www.hanbit.co.kr / 이메일 ask@hanbit.co.kr Published by HANBIT Media, Inc. Printed in Korea Copyright c 2016 이경오 & HANBIT Media, Inc. 이책의저작권은이경오와한빛미디어 ( 주 ) 에있습니다. 저작권법에의해보호를받는저작물이므로무단복제및무단전재를금합니다. 지금하지않으면할수없는일이있습니다. 책으로펴내고싶은아이디어나원고를메일 (ebookwriter@hanbit.co.kr) 로보내주세요. 한빛미디어 ( 주 ) 는여러분의소중한경험과지식을기다리고있습니다.
저자소개 지은이 _ 이경오 광운대학교컴퓨터소프트웨어학과를졸업하였으며 2009년키움증권전산실에서사회생활을시작하였습니다. 이후흥국생명전산실에서 SM 업무를수행하였고, KG모빌리언스에서차세대시스템구축프로젝트를담당하였습니다. 현재는국내유일의오픈소스 DBMS인 CUBRID의벤더사인 ( 주 ) 큐브리드에합류하여 DBMS 컨설팅업무를수행하고있습니다. 6년간의소프트웨어개발경험과 DBMS 시스템에대한심도있는학습을바탕으로대한민국오픈소스 DBMS의확산과발전을위해하루하루최선을다하고있습니다. 보유자격증 SQL 개발자 ( 국가공인 SQL Developer, 한국데이터베이스진흥원 ) SQL 전문가 ( 국가공인 SQL Professional, 한국데이터베이스진흥원 ) 리눅스마스터 1급 (Linux Master 1st, 한국정보통신진흥협회 ) 운영블로그 http://blog.naver.com/dbmsexpert
저자서문 저는지난 2009년 9월키움증권전산실에서 IT 개발자생활을시작하였습니다. 업무를진행하면서정확한고성능 SQL문을작성하는것이프로그래밍언어만큼이나중요하다고생각해왔습니다. 그리하여개발자로일하면서도 SQL 튜닝분야에대한심도있는학습을진행해왔습니다. 대다수 IT 개발자는 SQL문을작성할때업무요건에만충족하면작업을멈추고해당 SQL문을실제운영환경에적용합니다. 결과집합은충족하지만성능을고려하지않은 SQL문이하나둘씩쌓여갈때시스템은걷잡을수없는부하에시달리게됩니다. 정작해당 SQL을튜닝해야할 DBA는해당업무를잘몰라서 SQL 튜닝을하기가쉽지않습니다. 이러한실무환경이나현실을생각해보면해당비즈니스로직을누구보다잘아는사람인개발자가 SQL 튜닝을하는것이맞습니다. 저또한이러한상황에서 SQL 튜닝학습을시작하였습니다. 시중에있는 SQL 튜닝관련책을보고학습하면서다음과같은힘든점이있었습니다. SQL 기초를다루는책은개발자가읽기에는너무쉽습니다. SQL 튜닝을다룬책은개발자가읽기에는너무어렵고, 책에나온내용을실무환경에서실습하기가어렵습니다 ( 권한문제등 ). 즉, 개발자에게최적화된 SQL 튜닝책이시중에는없었습니다. 이러한이유로 SQL 튜닝을학습하는데있어커뮤니티에서만난스터디그룹이나인터넷검색에의존하였으며학습하는과정또한쉽지않았습니다. SQL 튜닝분야를꼭학습해야하거나관심이있는사람들이보기에가장적합한책이있었으면좋겠다고판단하였습니다. SQL문을튜닝하는데화려한 UI를가지고있는성능모니터링툴이나고도의 SQL Tracing 툴이꼭필요한것은아닙니다 ( 물론있으면많은도움이됩니다 ). 실행계획만보
고도 SQL문을튜닝할수있습니다. 실행계획은개발자에게도주어지는권한입니다. 이책의내용은대한민국개발자의업무환경에초점을맞춘책이며이책의이론과실습내용을차근차근학습해나간다면누구나 SQL 튜닝을할수있습니다. 이책의특징을살펴보면다음과같습니다. 개발자에게모든초점과난이도를맞췄습니다. 기초 SQL문을작성할수있는사람이라면누구나이책의내용을학습할수있습니다. DBA 권한이반드시필요한부분이나사용빈도가극히낮고어려운부분은다루지않습니다. 이책에서다루는 SQL 튜닝기법은실무에바로적용할수있으며, 이는전체 SQL 튜닝의 80~90% 를차지합니다. 즉, 이책에서다루고있는이론과실습을모두학습한다면약간의노력과시간투자로엄청난업무효율을발휘할수있습니다 ( 필자의경험입니다 ). 이책에서다루는내용은 SQL 튜닝분야에서가장기초적이면서가장널리쓰이고있는내용입니다. 1장 ~7장까지의모든학습을마무리하면현재개발하는시스템또는유지보수하는시스템에서튜닝이필요한 SQL문이눈에보이게됩니다. 그러한비효율적인 SQL문을튜닝해나가는것이시스템부하를최소화하고안정된시스템을만들어가는과정일것입니다. 이책을학습하는모든개발자가 SQL문을작성할때튜닝적인관점에서접근하여시스템성능을향상시키고더나아가대한민국 IT 시스템이한단계발전할수있는계기가되기를간절히바랍니다.
이책의실습환경 Windows 8.1 K Windows 8.1 K 환경에오라클을설치하여실습을진행하였습니다. Linux 또는 Unix 기반에설치된오라클환경에서도실습할수있습니다. Oracle Database 11g Enterprise Edition Release 11.2.0.1.0-64bit Production 오라클 11g 버전을기준으로기술되었으며오라클 11g가설치된서버또는 PC라면이책의내용을실습할수있습니다. 이책에서는오라클 11g의설치에관한설명은생략합니다. 스크립트다운로드이책에서사용한스크립트는다음에서다운로드할수있습니다. https://www.hanbit.co.kr/exam/2799
차례 chapter 1 SQL 튜닝을위한준비 013 1.1 테이블스페이스및계정생성 013 1.1.1 테이블스페이스생성 013 1.1.2 사용자계정생성 014 1.2 실습테이블구성 015 1.2.1 NOLOGGING 모드설정 015 1.2.2 APPEND 힌트 016 1.2.3 데이터복제 016 1.2.4 RANDOM 함수의사용 017 1.3 실행계획및통계정보생성 018 1.3.1 실행계획 018 1.3.2 실행계획분석 019 1.3.3 통계정보생성 020 chapter 2 인덱스튜닝 021 2.1 인덱스스캔튜닝 021 2.1.1 B-Tree 인덱스 021 2.1.2 인덱스와테이블의관계 023 2.1.3 인덱스스캔튜닝 024 2.1.4 인덱스스캔튜닝관련힌트 025 실습 2-1 인덱스를최대한활용하여원하는결과검색하기 026 실습 2-2 인덱스구성컬럼을추가하여테이블랜덤액세스제거하기 035 2.2 인덱스풀스캔튜닝 041 2.2.1 인덱스풀스캔 041 2.2.2 인덱스풀스캔의종류 042 2.2.3 인덱스풀스캔튜닝 043 2.2.4 인덱스풀스캔튜닝관련힌트 044
실습 2-3 인덱스패스트풀스캔을활용하여집계결과검색하기 045 2.3 테이블풀스캔튜닝 050 2.3.1 선택도 050 2.3.2 인덱스손익분기점 050 2.3.3 테이블풀스캔튜닝 051 실습 2-4 테이블풀스캔을유도하여비효율적인인덱스스캔예방하기 051 chapter 3 조인튜닝 057 3.1 중첩루프조인튜닝 057 3.1.1 중첩루프조인 057 3.1.2 Outer 테이블과 Inner 테이블 058 3.1.3 인라인뷰 058 3.1.4 중첩루프조인튜닝 059 3.1.5 중첩루프조인튜닝관련힌트 060 실습 3-1 효율적인중첩루프조인으로결과도출하기 063 3.2 해시조인튜닝 070 3.2.1 해시조인 070 3.2.2 해시조인의특성 071 3.2.3 Build Input과 Probe Input 071 3.2.4 해시조인을위한메모리관리 072 3.2.5 해시조인튜닝 072 3.2.6 해시조인튜닝관련힌트 072 실습 3-2 해시조인으로성능극대화하기 074 실습 3-3 인라인뷰를이용한해시조인으로성능극대화하기 080 3.3 세미조인튜닝 086 3.3.1 세미조인 086 3.3.2 EXISTS문과 NOT EXISTS문 086 3.3.3 세미조인튜닝 086
3.3.4 서브쿼리 Unnesting 087 3.3.5 세미조인튜닝관련힌트 087 실습 3-4 세미조인기법을이용하여성능극대화하기 090 3.4 아우터조인튜닝 099 3.4.1 아우터조인 099 3.4.2 Left 아우터조인 100 3.4.3 Right 아우터조인 101 3.4.4 아우터조인튜닝 101 실습 3-5 아우터조인으로테이블스캔을최소화하여성능개선하기 102 실습 3-6 아우터조인을스칼라서브쿼리방식으로변환하여성능극대화하기 109 chapter 4 함수튜닝 115 4.1 분석함수튜닝 115 4.1.1 집계함수의한계 115 4.1.2 분석함수의유용성 116 4.1.3 분석함수튜닝 117 4.1.4 주요분석함수 118 실습 4-1 RANK 함수를이용하여반복적인테이블스캔제거하기 121 실습 4-2 SUM 함수를이용하여반복적인테이블스캔제거하기 126 4.2 사용자정의함수튜닝 130 4.2.1 사용자정의함수 130 4.2.2 사용자정의함수의재귀호출부하 131 4.2.3 사용자정의함수튜닝 131 실습 4-3 재귀호출부하최소화하기 132
chapter 5 부분범위처리튜닝 139 5.1 부분범위처리 139 5.1.1 부분범위처리의기초 139 5.1.2 부분범위처리의구현 141 5.2 최대값 / 최소값스캔튜닝 143 5.2.1 최대값 / 최소값스캔튜닝 143 실습 5-1 부분범위처리기법을이용하여최대값 / 최소값검색하기 143 5.3 페이징처리튜닝 149 5.3.1 페이징처리 149 5.3.2 페이징처리튜닝 149 실습 5-2 부분범위처리기법을이용하여페이징처리하기 149 chapter 6 파티셔닝튜닝 157 6.1 파티셔닝 157 6.2 파티션프루닝튜닝 158 6.2.1 파티션프루닝 158 실습 6-1 파티션프루닝이동작하도록조건절튜닝하기 158 6.3 파티션인덱스튜닝 163 6.3.1 파티션인덱스의정의와종류 163 6.3.2 파티션인덱스의생성방식 165 6.3.3 파티션인덱스유형정리 166 6.3.4 파티션인덱스튜닝 166 실습 6-2 파티션인덱스스캔으로성능극대화하기 166
chapter 7 병렬처리튜닝 173 7.1 병렬과병렬처리 173 7.2 병렬스캔튜닝 174 7.2.1 병렬스캔튜닝 174 7.2.2 병렬스캔튜닝관련힌트 174 실습 7-1 대용량의테이블을병렬스캔으로검색하기 175 7.3 병렬인덱스스캔튜닝 179 7.3.1 병렬인덱스스캔 179 7.3.2 병렬인덱스스캔튜닝 180 7.3.3 병렬인덱스스캔튜닝관련힌트 180 실습 7-2 인덱스병렬스캔을유도하여성능극대화하기 181
chapter 1 SQL 튜닝을위한준비 SQL 튜닝실습을진행하기위해서는다음의 3가지가필요합니다. 대용량데이터를저장할저장소 ( 테이블스페이스 ) 와해당저장소를사용할사용자계정 SQL문만으로대용량의테이블을구성하는방법 오라클의통계정보를분석하는방법 이번장에서이 3 가지에대해자세히다루게됩니다. 이번장을완벽히이해한후 본격적인튜닝학습을시작하기바랍니다. 1.1 테이블스페이스및계정생성 1.1.1 테이블스페이스생성테이블스페이스 Table Space 는테이블을저장하는공간입니다. 오라클은테이블스페이스내에테이블을저장하며테이블에는데이터가저장됩니다. 실습을진행하기위해서별도의테이블스페이스를생성합니다. 테이블스페이스의생성방법은다음과같습니다. (1) 관리자권한으로로그인 sysdba 권한으로접속합니다. sqlplus "/as sysdba" 1 SQL 튜닝을위한준비 - 013
(2) 테이블스페이스생성 dbmsexpert 라는오라클인스턴스에총 4GB 용량의테이블스페이스를생성 하였습니다. CREATE TABLESPACE DBMSEXPERT_DATA DATAFILE 'C:\app\dbmsexpert\oradata\orcl\DBMSEXPERT_DATA.DBF' SIZE 4G AUTOEXTEND ON NEXT 1G MAXSIZE UNLIMITED LOGGING ONLINE PERMANENT EXTENT MANAGEMENT LOCAL AUTOALLOCATE BLOCKSIZE 8K SEGMENT SPACE MANAGEMENT AUTO FLASHBACK ON; (3) 임시테이블스페이스생성 dbmsexpert 라는오라클인스턴스에총 1GB 용량의임시테이블스페이스를 생성하였습니다. CREATE TEMPORARY TABLESPACE DBMSEXPERT_TMP TEMPFILE 'C:\app\dbmsexpert\oradata\orcl\DBMSEXPERT_TMP.DBF' SIZE 1G AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED; 1.1.2 사용자계정생성 앞에서생성한테이블스페이스를기본설정으로하는오라클계정을생성합니 다. 생성방법은다음과같습니다. (1) 관리자권한으로로그인 sysdba 권한으로접속합니다. sqlplus "/as sysdba" 014 -
(2) 사용자계정생성 DBMSEXPERT_DATA 와 DBMSEXPERT_TMP 테이블스페이스를 Default로하는 DBMSEXPERT 계정을신규로생성하였습니다. 지금부터 DBMSEXPERT 계정으로로그인하여생성하는테이블및인덱스는모두 DBMSEXPERT_DATA 에생성됩니다. 해당계정으로작업하다임시영역이필요한경우에는 DBMSEXPERT_TMP 영역을사용하게됩니다. CREATE USER DBMSEXPERT IDENTIFIED BY DBMSEXPERT DEFAULT TABLESPACE DBMSEXPERT_DATA TEMPORARY TABLESPACE DBMSEXPERT_TMP PROFILE DEFAULT ACCOUNT UNLOCK; (3) 권한주기 DBMSEXPERT 계정에권한을주었습니다. GRANT RESOURCE TO DBMSEXPERT; GRANT CONNECT TO DBMSEXPERT; GRANT CREATE VIEW TO DBMSEXPERT; GRANT CREATE SYNONYM TO DBMSEXPERT; (4) 생성된계정으로접속 생성된계정으로오라클에접속합니다. 1.2 실습테이블구성 1.2.1 NOLOGGING 모드설정 오라클에서테이블에 NOLOGGING 모드를설정하면해당테이블에 INSERT 작업 시 Redo 로그작업을최소화합니다. 따라서대용량의데이터를 INSERT 작업할 1 SQL 튜닝을위한준비 - 015
때데이터입력시간을줄일수있습니다. 사용법은다음과같습니다. 대용량의데 이터를 INSERT 전에해당테이블을 NOLOGGING 모드로설정합니다. ALTER TABLE 테이블명 NOLOGGING; 1.2.2 APPEND 힌트 오라클이테이블에데이터를입력할때다음단계를거치게됩니다. 1) 데이터버퍼캐시 Data Buffer Cache 를경유합니다. 2) 테이블세그먼트의비어있는블록 Free Block 을검색합니다. 3) 비어있는블록에데이터를저장합니다. APPEND 힌트를사용한다면세그먼트의 HWM High Water Mark 바로뒤부터데이터를입력하게되는데, HWM은세그먼트의가장끝이라고이해하시면됩니다. 또한, 데이터버퍼캐시를경유하지않고바로데이터를저장하게되므로데이터의입력시간을단축할수있습니다. APPEND 힌트를사용하려면다음과같이 INSERT 바로뒤에 APPEND 힌트를입력합니다. INSERT /*+ APPEND */ INTO 테이블명 1.2.3 데이터복제 대용량의테이블을구성하기위해서는데이터복제기법을정확히알아야합니다. 카티션곱조인 (Cartesian Product Join) N 건의데이터로구성된 A 라는테이블과 M 건의데이터를가진 B 라는테이블 을아무런조인조건없이조인하면 N 건 M 건 의데이터를출력하게됩니다. 016 -
다음예제에서테이블 A 에 100 건, 테이블 B 에 1,000 건의데이터가있다고가정 하면, 총 10 만건 (100 건 1,000 건 = 100,000 건 ) 의결과건수가나오게됩니다. SELECT * FROM A, B; 계층형쿼리사용 오라클에서사용하는계층형쿼리를이용하여인위적으로여러개 (N) 의행을출 력할수있습니다. 다음예제는총 1,000 개의행을출력하게됩니다. SELECT * FROM DUAL CONNECT BY LEVEL <= 1000; 카티션곱조인과계층형쿼리의혼용카티션곱조인과계층형쿼리를혼용하면특정테이블의내용을복제할수있습니다. 다음예제에서테이블 A 에 100건의데이터가있다고가정하면, 총 200건 (100건 2 = 200건 ) 의행이생기고테이블 A 의내용을복제합니다. SELECT * FROM A, (SELECT LEVEL FROM DUAL CONNECT BY LEVEL <= 2); 1.2.4 RANDOM 함수의사용 테이블구성시특정값을인위적으로만들기위해서 RANDOM 함수를이용합니다. 랜덤숫자다음은랜덤숫자를발생시키는예제로, 1~100까지의숫자중특정숫자를리턴합니다. 기본으로실수를리턴하기때문에 TRUNC 함수로덮어씌어주면정수를리턴하게됩니다. SELECT TRUNC(DBMS_RANDOM.VALUE(1, 100)) FROM DUAL; 1 SQL 튜닝을위한준비 - 017
랜덤문자열 랜덤문자열을발생시키는예제로, 대문자로된 10 자리의랜덤문자열을리턴합 니다. SELECT DBMS_RANDOM.STRING('U', 10) FROM DUAL; 다음예제는소문자로된 10 자리의랜덤문자열을리턴합니다. SELECT DBMS_RANDOM.STRING('L', 10) FROM DUAL; 1.3 실행계획및통계정보생성 1.3.1 실행계획 오라클의옵티마이저 Optimizer 는사용자가호출한 SQL에대해최적의실행계획을도출해줍니다. 도출기준은 SQL문자체분석과각종통계정보입니다. 실행계획이도출되면해당실행계획대로 SQL문에대한연산을수행하게됩니다. 오라클의옵티마이저는타 DBMS보다월등한성능을자랑하며아무리복잡한 SQL문이라도최소한의비용으로해당결과를도출할수있습니다. 하지만옵티마이저가모든 SQL문에대해서최적의실행계획을도출하는것은아닙니다. 때때로옵티마이저도비효율적인실행계획을도출하며해당 SQL문은 DBMS에과부하의원인이되기도합니다. 실행계획을분석하여옵티마이저가미처최적화하지못한부분을찾아튜닝하는것이이책의주목적입니다 ( 이책은 SQL 기초를다루는책이아니므로실행계획을출력하는방법은다루지않았습니다 ). 018 -
1.3.2 실행계획분석 실행계획분석은다음의두가지기본원칙을바탕으로합니다. Operation 항목중가장오른쪽에있는문자열부터수행합니다. Operation 항목중가장오른쪽에있는문자열이두개이상이라면 ( 즉, 같은 Depth 에있 다면 ) 위에서부터수행합니다. 다음 SQL 문에대한실행계획을분석해보겠습니다. SQL 문 SELECT * FROM EMP A, DEPT B WHERE A.DEPTNO = B.DEPTNO; 실행계획 ID Operation Name Cost 0 SELECT STATEMENT 7 1 HASH JOIN 7 2 TABLE ACCESS FULL DEPT 3 3 TABLE ACCESS FULL EMP 3 수행순서 (ID 기준 ) 2 3 1 0 실행계획설명 ID 설명 2 가로를기준으로가장오른쪽에위치한연산이 2번과 3번입니다. 동일한가로깊이일경우세로를기준으로위부터시작하므로 2번연산이가장먼저시작하고, DEPT 테이블을테이블풀스캔 (TABLE ACCESS FULL) 합니다. 1 SQL 튜닝을위한준비 - 019
ID 설명 3 2번과동일하게가로를기준으로가장오른쪽에있으면서 2번보다아래에있는 3번이수행됩니다. EMP 테이블을테이블풀스캔 (TABLE ACCESS FULL) 합니다. 1 가로를기준으로 2번과 3번바로왼쪽에위치한 1번을수행합니다. 2번과 3번연산을해시조인 (HASH JOIN) 하였습니다. 옵티마이저가 DEPT 테이블과 EMP 테이블의조인연산은해시조인이가장유리하다고판단하였습니다 ( 해시조인에대한설명은 3장 2절참고 ). 0 가로를기준으로 1 번보다왼쪽에있는 0 번이수행됩니다. SELECT 절에대한연산을수행합니다. 1.3.3 통계정보생성 오라클의옵티마이저가최적의실행계획을생성하기위해서는통계정보가미리 생성되어있어야합니다. 통계정보의생성방법은다음과같습니다. (1) 테이블통계정보생성 EMP 테이블에대한통계정보를생성합니다. ANALYZE TABLE EMP COMPUTE STATISTICS; (2) 인덱스통계정보생성 PK_EMP 인덱스에대한통계정보를생성합니다. ANALYZE INDEX PK_EMP COMPUTE STATISTICS; (3) 특정테이블과테이블내의인덱스에대한통계정보생성 EMP 테이블과 EMP 테이블이가지고있는모든인덱스에대한통계정보를생성 합니다. ANALYZE TABLE EMP COMPUTE STATISTICS FOR TABLE FOR ALL INDEXES FOR ALL INDEXED COLUMNS SIZE 254; 020 -
한빛리얼타임 한빛리얼타임은 IT 개발자를위한전자책입니다. 요즘 IT 업계에는하루가멀다하고수많은기술이나타나고사라져갑니다. 인 터넷을아무리뒤져도조금이나마정리된정보를찾기도쉽지않습니다. 또한, 잘정리되어책으로나오기까지는오랜시간이걸립니다. 어떻게하면조금이라 도더유용한정보를빠르게얻을수있을까요? 어떻게하면남보다조금더빨 리경험하고습득한지식을공유하고발전시켜나갈수있을까요? 세상에는수 많은종이책이있습니다. 그리고그종이책을그대로옮긴전자책도많습니다. 전자책에는전자책에적합한콘텐츠와전자책의특성을살린형식이있다고생 각합니다. 한빛이지금생각하고추구하는, 개발자를위한리얼타임전자책은이렇습니다. 1 ebook First - 빠르게변화하는 IT 기술에대해핵심적인정보를신속하게제공합니다 500페이지가까운분량의잘정리된도서 ( 종이책 ) 가아니라, 핵심적인내용을빠르게전달하기위해조금은거칠지만 100페이지내외의전자책전용으로개발한서비스입니다. 독자에게는새로운정보를빨리얻을기회가되고, 자신이먼저경험한지식과정보를책으로펴내고싶지만너무바빠서엄두를못내는선배, 전문가, 고수분에게는좀더쉽게집필할수있는기회가될수있으리라생각합니다. 또한, 새로운정보와지식을빠르게전달하기위해 O'Reilly의전자책번역서비스도하고있습니다. 2 무료로업데이트되는전자책전용서비스입니다 종이책으로는기술의변화속도를따라잡기가쉽지않습니다. 책이일정분량이상으 로집필되고정리되어나오는동안기술은이미변해있습니다. 전자책으로출간된이 후에도버전업을통해중요한기술적변화가있거나저자 ( 역자 ) 와독자가소통하면서보완하여발전된노하우가정리되면구매하신분께무료로업데이트해드립니다.
3 4 독자의편의를위해 DRM-Free 로제공합니다 구매한전자책을다양한 IT 기기에서자유롭게활용할수있도록 DRM-Free PDF 포맷으로제공합니다. 이는독자여러분과한빛이생각하고추구하는전자책을만들어나가기위해독자여러분이언제어디서어떤기기를사용하더라도편리하게전자책을볼수있도록하기위함입니다. 전자책환경을고려한최적의형태와디자인에담고자노력했습니다종이책을그대로옮겨놓아가독성이떨어지고읽기어려운전자책이아니라, 전자책의환경에가능한한최적화하여쾌적한경험을드리고자합니다. 링크등의기능을적극적으로이용할수있음은물론이고글자크기나행간, 여백등을전자책에가장최적화된형태로새롭게디자인하였습니다. 앞으로도독자여러분의충고에귀기울이며지속해서발전시켜나가겠습니다. 지금보시는전자책에소유권한을표시한문구가없거나타인의소유권한을표시한문구가있다면위법하게사용하고있을가능성이큽니다. 이경우저작권법에따라불이익을받으실수있습니다. 다양한기기에사용할수있습니다. 또한, 한빛미디어사이트에서구매하신후에는횟수와관계없이내려받으실수있습니다. 한빛미디어전자책은인쇄, 검색, 복사하여붙이기가가능합니다. 전자책은오탈자교정이나내용의수정 보완이이뤄지면업데이트관련공지를이메일로알려드리며, 구매하신전자책의수정본은무료로내려받으실수있습니다. 이런특별한권한은한빛미디어사이트에서구매하신독자에게만제공되며, 다른사람에게양도나이전은허락되지않습니다.