본문 바로가기
728x90

공부158

[RealMysql 8.0]04아키텍처 4.11.1 ~ 4.2.12 어댑티브 해시 인덱스 리두 로그 아카이빙 사전적 의미로 '보관'이라는 뜻을 가진 아카이빙은 개인 및 단체가 활동하며, 남기는 수많은 기록물 중 가치가 있는 것을 선별하여 보관하는 장소, 또는 그 기록물 자체를 이르는 용어를 뜻한다. https://ju-hyung.tistory.com/151 아카이빙 (Archiving) 이란? 아카이빙 (Archiving) - 사전적 의미로 '보관'이라는 뜻을 가진 아카이빙은 개인 및 단체가 활동하며, 남기는 수많은 기록물 중 가치가 있는 것을 선별하여 보관하는 장소, 또는 그 기록물 자체를 이 ju-hyung.tistory.com 8.0 버전부터 innoDb 스토리지 엔진의 리두 로그를 아카이빙할 수 있는 기능이 추가되었다. 데이터베이스의 모든 변경 내용을 기록한 redo 로그를 포함한다... 2023. 2. 3.
[이펙티브자바]item 20.추상 클래스보다는 인터페이스를 우선하라. 자바 8부터는 인터페이스도 디폴트 메서드를 제공할 수 있다. 기존 클래스에서도 손쉽게 새로운 인터페이스를 구현해넣을 수 있다. 인터페이스로는 계층구조가 없는 타입 프레임워크를 만들 수 있다. Singer, Songwiter 의 인터페이스가 있을시 이 두가지를 받은 SingerSongwriter 를 다중 상속 받아 새로운 인터페이스를 만들 수 있다. 디폴드 메서드를 제공해 프로그래머들의 일감을 덜어줄 수 있다. 이럴경우 item19 처럼 @impleSpec 자바독 태그를 붙여 문서화를 하자. 인터페이스와 추상 골격 구현 클래스를 함께 제공하는 식으로 인터페이스와, 추상 클래스의 장점을 모두 취하는 방법도 있다. 인퍼페이스의 강제 구현 요구와 추상 클래스의 기본 구현 제공을 동시에 제공할 수 있기 때문이다... 2023. 2. 3.
[이펙티브자바]item 19.상속을 고려해 설계하고 문서화하라.그러지 않았다면 상속을 금지하라. 상속용 클래스는 재정의할 수 있는 메서드들을 내부적으로 어떻게 이용하는지 문서로 남겨야 한다. 재정의? => public과 protected 메서드 중 final 이 아닌 모든 메서드를 뜻함 @impleSpec 어노테이션으로 자바독을 만들 수 있다. API 의 문서를 만들때는 "어떻게"가 아닌 "무엇"을 하는지 설명하는거에 대비하여 상속을 위한 내부클래스의 문서화는 상당히 내부구조까지 설명을 해야한다. 이는 캡슐화가 이미 깨졌고 내부 구현을 모르면 오작동의 위험이 있기 때문이다. 클래스의 내부 동작 과정 중간에 끼어들 수 있는 훅을 잘 선별하여 protected 메서드 형태로 공개해야 할 수도 있다. 어떤 클래스를 protected 로 노출해야할지 결정하는 방법은 직접 하위 클래스를 3개 정도 만들어 보.. 2023. 2. 3.
[이펙티브자바]item 18.상속보다는 컴포지션을 사용하라. 상속은 많은 문제가 발생할 수 있다. 패키지 경계를 넘어, 즉 다른 패키지의 구체 클래스를 속하는 일은 위험하다. 상속은 캡슐화를 깨뜨린다. 깨뜨린다보다 상속을 받은 자식 클래스가 상위 클래스의 private 멤버에 접근할 수 있기때문에 캡슐화의 의도와 달리 구현이 공개 될 수 있게 된다. 상위 클래스의 구현에따라 동작에 이상이 생길 수 있다. 이를 해결하기 위해 컴포지션(Composition)을 사용하라는 얘기이다. 컴포지션: 기존 클래스를 확장하는대신, 새로운 클래스를 만들고, private 필드로 기존 클래스의 인스턴스를 참조하게 한다. 기존 클래스의 대응하는 메서드를 호출해 그 결과를 반환한다. 이를통해 기존 클래스의 구현이 바뀌거나, 새로운 메서드가 생기더라도 아무런 영향이 받지 않는다. 119.. 2023. 2. 2.
[RealMysql 8.0]04아키텍처 4.2.10 ~ 4.2.11.0 체인지 버퍼 RDMBS에서 레코드가 insert, update 시 파일변경과 인덱스 업데이트 작업도 필요한데, 이는 디스크를 랜덤하게 읽는 작업을 요한다. 이러한 랜덤읽기는 많은 자원을 소모하게되어, Innodb는 버퍼 풀에 인덱스가 있다면 즉시 업데이트를 수행하지만 그렇지 않다면 즉시 실행하지 않고 임시 공간에 저장해 두고 사용자에게 결과를 반환하는 형태로 성능을 향상시킨다. 이때 사용하는 임시 메모리 공간을 체인지 버퍼 라고 한다 사용자에게 결과를 전달하기 전에 반드시 중복 여부를 체크해야하는 유니크 인덱스는 체인지 버퍼를 사용할 수 없다. 체인지 mysql 임시로 저장된 레코드 조각은 백그라운드 스레드에 의해 병합되는데 이를 버퍼 머지 스레드 라고 한다. 리두 로그 및 로그 버퍼 리두로그는 트랜잭션.. 2023. 2. 1.
mysql 트랜잭션 ACID 트랜잭션 데이터베이스의 상태를 변경하는 여러개의 작업을 단위로 묶어서 처리하는 것. 이러한 트랜잭션은 ACID 의 성질에 만족해야 한다 트랜잭션이 시작되면 전체 트랜잭션이 완료될 때까지 작업이 보장되어야 한다. ACID 원자성(Atomicity) 트랜잭션은 완전한 단위이며 하나의 트랜잭션의 작업들은 모두 수행되거나, 수행되지 않거나를 보장한다. 모든 작업이 성공하거나 실패하는 특성입니다. 트랜잭션에 포함된 모든 작업이 정상적으로 완료되거나, 하나의 작업이라도 실패하면 트랜잭션 전체가 롤백되어 모든 작업이 취소됩니다. 일관성(Consistency) 트랜잭션이 수행되면 데이터베이스의 상태는 일관적인 유효한 상태로 변경된다. 데이터의 성질이 변경되지않는다 트랜잭션이 실행된 후에도 데이터베이스가 일관된 상태를.. 2023. 2. 1.
[이펙티브자바]item 17.변경 가능성을 최소화하라 불변 클래스를 쓰면 좋은점은? 불변 클래스는 가변 클래스보다 설계하고 구현하고 사용하기 쉬우며, 오류가 생길 여지도 적고 훨씬 안전하다 클래스를 불변으로 만들려면 다음 다섯 가지 규칙을 따른다. 객체의 상태를 변경하는 메서드(변경자)를 제공하지 않는다 setter 를 열지 않는다. 클래스를 확장할 수 없도록 한다. final 로 상속을 막자 모든 필드를 final 로 선언한다. 모든 필드를 private 로 선언한다. 자신 외에는 내부의 가변 컴포넌트에 접근할 수 없도록 한다. 클래스 내부에 가변 객체가 있다면 접근할 수 없도록 하고, 혹시라도 접근을 허용한다면 방어적 복사를 통해 제공해주오, 실수를 하더라도 원본은 그대로로 유지하도록 하자. 불변 클래스의 장점 함수형 프로그래밍에 적합 불편객체는 단순하.. 2023. 1. 31.
[이펙티브자바]item 16.public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라 class Point { public int x; public int y; } 해당 클래스는 데이터 필드에 직접 접근할 수 있어 캡슐화의 장점을 제공하지 못한다. API 를 수정하지 않고는 내부 표현을 바꿀 수 없고 내부 필드명을 봐꾸더라도 점진적으로 변경할 수 있다. 불변식을 보장할 수 없으며 외부에서 필드에 접근할 때 부수 작업을 수행할 수 없다. 메서드를 통해 접근하면 내부 작업을 수행 후 return 할 수 있다. package-private 클래스 에서도 데이터 필드를 노출해도 하등의 문제가 없다 맞는 말일 수도있는데, 그래도 필드에 직접 접근보다는 메서드를 통해 접근하도록 하자. 2023. 1. 31.
[RealMysql 8.0]04아키텍처 4.2.9 언두 로그 언두 로그 innodb 스토리지 엔진은 트랜잭션과 격리 수준을 보장하기 위해 DML(insert, update, delete)로 변경되기 이전 버전의 데이터를 별도로 백업하는데 이렇게 백업된 데이터를 언두 로그라고 한다. 트랜잭션 보장 트랜잭션 롤백시 언두 로그에 백업된 데이터로 복구한다. 격리 수준 보장 특정 커넥션에서 데이터 변경시 다른 커넥션이 조회할 경우 격리 수준에 맞게 레코드를 읽는다. 언두 로그 레코드 모니터링 5.5 이전 버전에는 mysql 서버에서 한번 증가한 언두 로그 공간은 다시 줄어들지 않았다. 5.7과 8.0 버전에서는 이러한 언두 로그 공간에 대한 문제를 해결하였다. 언두로그를 돌아가면서 순차적으로 사용해 디스크공간을 줄이는 것도 가능, mysql 서버가 필요한 시점에 사용 공간.. 2023. 1. 30.
728x90