전체 글(152)
-
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 -
[아이템3] 직렬화된 인스턴스를 역직렬화할 때마다 새로운 인스턴스가 만들어진다.
싱글턴 클래스는 생성자를 private으로 만들기 때문에 인스턴스를 하나로 유지할 수 있는 것인데 역직렬화는 생성자를 사용하는 것이 아니라 직렬화된 객체의 정보를 읽어 그대로 복원하는 것이기 때문에 별도의 조치를 취하지 않으면 새로운 인스턴스가 생기는 것을 막을 수 없음readResolve 메서드는 직렬화된 데이터를 역직렬화할 때 호출되는 특별한 메서드로, 해당 메서드를 사용하여 역직렬화된 객체를 임의로 대체하거나 수정할 수 있는 기능을 제공public class Elvis { private static final Elvis INSTANCE = new Elvis(); private Elvis() {...} public static Elvis getInstance() {return INSTANCE;}..
2024.07.01