분류 전체보기(112)
-
16장 복제
문제 1. 레플리카 서버를 구축하는 목적 4가지를 말씀해주세요스케일 아웃데이터 백업데이터 분석데이터 지리적 분산문제 2. 바이너리 로그 파일 위치 기반 복제란?레플리카 서버에서 소스 서버의 바이너리 로그 파일명과 파일 내에서의 위치로 개별 바이너리 로그 이벤트를 식별해서 복제가 진행되는 형태문제 3. GTID를 사용하는 복제 환경에서 안전하지 않은 쿼리 패턴은?트랜잭션을 지원하는 테이블과 지원하지 않는 테이블을 함께 변경하는 쿼리 혹은 트랜잭션create table … select … 구문트랜잭션 내에서 creat temporary table, drop temporary table 구문 사용소스 서버에서 레플리카 서버로 복제되어 적용될 때 단일 트랜잭션으로 처리되지 않을 수 있음GTID는 트랜잭션 단위로..
2024.07.01 -
14장 스토어드 프로그램
문제 1. 스토어드 프로시저의 파라미터 종류와 차이점을 말해주세요.IN 타입 : 입력 전용 파라미터OUT 타입 : 출력 전용 파라미터INOUT : 입출력 모두 가능문제 2. 일회성 이벤트를 등록하려면 ON SCHEDULE (A)를 사용하고, 반복성 이벤트를 등록하려면 ON SCHEDULE (B)를 사용한다.(A) : AT (B) : EVERY문제 3. 스토어드 프로그램의 입력 파라미터, DECLARE로 정의한 로컬 변수, 테이블 칼럼이 같은 이름을 가질 경우 우선순위를 말해주세요.DECLARE로 정의한 로컬 변수스토어드 프로그램의 입력 파라미터테이블 칼럼
2024.07.01 -
13장 파티션
문제 1. 파티션을 사용하는 이유단일 INSERT와 단일 또는 범위 SELECT의 빠른 처리데이터의 물리적인 저장소를 분리이력 데이터의 효율적인 관리문제 2. 다음과 같이 생성된 테이블에 입사 일자가 2001년부터 2005년 이하인 레코드를 가지는 파티션을 추가하는 SQL을 작성해주세요. CREATE TABLE employees ( id INT NOT NULL, first_name VARCHAR(30), last_name VARCHAR(30), hired DATE NOT NULL DEFAULT '1970-01-01’, ... ) PARTITION BY RANGE( YEAR(hired) ) ( PARTITION p0 VALUES LESS THAN (1991), ..
2024.07.01 -
10장 실행계획
문제 1. MySQL 8.0부터 인덱스되지 않은 칼럼들에 대해서도 데이터 분포도를 수집해서 저장하는데 이 정보를 무엇이라고 합니까?히스토그램문제 2. 일부 파티션만 접근해서 읽었을 때, 실행 계획에서 type이 ALL이라고 뜨는 이유는 무엇인가요파티션은 물리적으로 개별 테이블처럼 별도의 저장 공간을 가지기 때문에 해당 파티션을 풀 스캔할 경우 type이 ALL로 나옵니다.문제 3. 실행 계획에서 rows 칼럼이 나타낸 것은 무엇인가요?실행 계획의 효율성 판단을 위해 예측했던 레코드 건수쿼리를 처리하기 위해 얼마나 많은 레코드를 읽고 처리해야 하는지를 의미함문제 4. 이 쿼리는 salary 칼럼으로 만들어진 인덱스를 사용할 수 없습니다. 그 이유와 인덱스를 사용할 수 있도록 튜닝한 쿼리를 알려주세요.sel..
2024.07.01 -
9장 옵티마이저와 힌트
문제 1. 정렬해야 할 레코드 수가 소트 버퍼로 할당된 공간보다 큰 경우 어떻게 처리하나요?메모리의 소트 버퍼에서 정렬을 수행하고 그 결과를 임시로 디스크에 기록다음 레코드를 가져와서 다시 정렬해서 반복적으로 디스크에 임시 저장각 버퍼 크기만큼 정렬된 레코드를 다시 병합하면서 정렬 수행 ⇒ 멀티 머지문제 2. P2. 투 패스 정렬 방식을 사용하는 경우는?레코드의 크기가 max_length_for_sort_data 시스템 변수에 설정된 값보다 클 때BLOB이나 TEXT 타입의 컬럼이 SELECT 대상에 포함될 때문제 3. 조인 버퍼를 사용하면 정렬 순서가 흐트러질 수 있는 이유를 설명해주세요.조인 버퍼를 사용할 경우 드라이빙 테이블에서 조건에 맞는 레코드들을 조인 버퍼에 저장 후 드라이븐 테이블을 읽고 조..
2024.07.01 -
8장 인덱스
문제 1. (dept_no, emp_no) 로 구성된 인덱스가 있을 때 select * from employees where emp_no > 2000; 을 실행했더니 인덱스 풀 스캔 방식을 사용했습니다. 그 이유는 무엇일까요.조건절에 첫번째 칼럼이 아닌 두번째 칼럼을 사용했기 때문에 인덱스 풀 스캔 방식을 사용문제 2.(dept_no, emp_no) 로 구성된 인덱스가 있을 때 select * from employees where emp_no > 2000; 을 실행했더니 인덱스 스킵 스캔 방식을 사용했습니다. dept_no 의 유니크 값은 {1, 2} 입니다. 옵티마이저는 내부적으로 어떤 최적화 과정을 실행했을지 설명해주세요.select * from employees where dept_no = 1 an..
2024.07.01 -
5장 트랜잭션
문제1. InnoDB에서 인덱스 설계가 중요한 이유에 대해 설명해주세요.InnoDB는 MySQL에서 제공하는 잠금과 별개로 스토리지 엔진 내부에 레코드 기반 잠금 방식을 가지고 있습니다. 이 때 변경하려는 레코드 자체에 락을 거는 것이 아니라 검색한 인덱스의 레코드에 잠금을 걸기 때문에 같은 인덱스에 속한 모든 레코드에 락이 걸리게 됩니다. 그렇기 때문에 인덱스 설계를 통해 데이터 변경 시 락이 걸리는 범위를 줄일 수 있도록 해주어야 합니다.문제 2. GAP Lock에 대해 설명해주세요레코드와 바로 인접한 레코드 사이의 간격만 잠그는 것으로 레코드와 레코드 사이의 간격에 새로운 레코드가 생성되는 것을 제어합니다.문제 3. 격리 수준이 READ COMMITTED 인 상태에서 A 트랜잭션이 데이터를 변경 중..
2024.07.01 -
4장 아키텍처
문제1. 쿼리 수행 과정에 대해 설명해주세요쿼리 파서가 쿼리를 토큰으로 분리해 파서 트리를 생성합니다. 이 때 기본 문법 오류가 발견됩니다.이 후 전처리기가 파서 트리를 기반으로 각 토큰을 테이블 이름과 칼럼 이름, 내장 함수와 같은 개체와 매핑하여 구조적 문제가 있는지 확인합니다. 이 때 존재하지 않거나 권한상 사용할 수 없는 개체의 토큰이 걸러집니다.옵티마이저는 쿼리를 가장 최적화된 비용으로 처리할 수 있는 실행계획을 선택합니다. 실행 엔진은 옵티마이저에서 만들어진 계획대로 각 핸드러에게 요청하면 핸들러가 데이터를 디스크에 저장하거나 디스크로부터 읽어옵니다.문제2. MySQL 8.0버전부터는 메타데이터를 InnoDB에 테이블에 저장하도록 바뀌었는데 이렇게 했을 때의 장점은 무엇인가요MySQL 5.7버..
2024.07.01 -
[아이템13] 이 거추장스러운 코드는 CloneNotSupportedException이 사실은 비검사 예외(unchecked exception)였어야 했다는 신호다.
@0verride public PhoneNumber clone() { try { return (PhoneNumber) super.clone(); } catch (CloneNotSupportedException e) { throw new AssertionError(); // 일어날 수 없는 일이다. }}Object의 clone() 메서드와 CloneNotSupportedException: 자바의 모든 객체는 Object 클래스를 상속하며, Object 클래스에는 clone() 메서드가 정의되어 있습니다. clone() 메서드를 호출하면 해당 객체를 복제하는 시도를 합니다. 그러나 clone() 메서드가 복제를 지원하지 않는 경우, 즉 해당 클래스가 Cloneable..
2024.07.01 -
[아이템12] 하위 클래스들이 공유해야 할 문자열 표현이 있는 추상 클래스라면 toString을 재정의해줘야 한다.
대다수 컬렉션 구현체는 추상 컬렉션 클래스들의 toString 메서드를 상속해 쓴다.public class HashSet extends AbstractSet implements Set, Cloneable, java.io.Serializable { ...}public abstract class AbstractSet extends AbstractCollection implements Set { ...}public abstract class AbstractCollection implements Collection { ... public String toString() { Iterator it = iterator(); if (..
2024.07.01 -
[아이템12] 정적 유틸리티 클래스는 toString을 제공할 이유가 없다.
정적 유틸리티 클래스는 일반적으로 정적 메서드만 가지는 클래스이고, 필드가 있더라도 클래스를 나타내는 정보가 아니라 메서드의 기능을 수행하기 위해 필요한 정보를 저장하는 필드이므로 toString으로 보여줄 만큼 유용한 정보가 없기 때문에 toString을 제공할 필요가 없다.정적 유틸리티 클래스란?정적 유틸리티 클래스(Static Utility Class)는 자바에서 유용한 기능을 제공하는 정적 메서드(Static Methods)로 구성된 클래스입니다. 이러한 클래스는 주로 인스턴스 변수를 가지지 않고, 객체를 생성하지 않고도 메서드를 직접 호출하여 작업을 수행합니다. 정적 유틸리티 클래스는 코드의 모듈화와 재사용을 촉진하며, 자주 사용되는 기능을 논리적으로 그룹화하는 데 유용합니다.정적 유틸리티 클래..
2024.07.01 -
[아이템8] finalizer를 사용한 클래스는 finalizer 공격에 노출되어 심각한 보안 문제를 일으킬 수도 있다.
finalizer는 정적 필드에 자신의 참조를 할당하여 가비지 컬렉터가 수집하지 못하게 막을 수 있다.public class Zombie { static Zombie zombie; public void finalize() { zombie = this; }}객체 생성을 막으려면 생성자에서 예외를 던지는 것만으로 충분하지만 finalizer 있다면 그렇지도 않다.public class Zombie2 { static Zombie2 zombie; int value; public Zombie2(int value) { if(value vlaue 값에 대한 유효성 검사가 있지만 finalizer로 인해 무효화
2024.07.01