본문 바로가기
728x90

공부155

[이펙티브자바]item 23.태그 달린 클래스보다는 클래스 계층구조를 활용하라. 태그 클래스란 특정 기능을 구현하기 위해 클래스에 태그값을 추가하여 사용하는 클래스를 의미한다. 태그란? 특별한 종류의 식별자, 보통 추가 정보를 제공하거나 선언의 동작을 변경하기 위해 선언에 나타낸다. 단순 키워드일 수도 있다. 태그의 단점은 많으므로(장황하고, 오류를 내기쉽고, 비효율 등등) 계층구조(상속)을 사용하여 리팩터링을 해보거나 쓰자. 2023. 2. 6.
[이펙티브자바]item 22.인터페이스는 타입을 정의하는 용도로만 사용하라. 인터페이스는 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할을 한다. 상수 인터페이스 같은 경우는 잘못 사용된 예이다. 클래스 내부에서 사용하는 상수는 외부 인터페이스가 아니라 내부 구현에 해당한다. 이러한 경우 몇가지 추천 방법이 있는데 특정 클래스나 인터페이스와 강하게 연관된 상수라면 해당 클래스나 인터페이스에 직접 추가하자. 열거 타입으로 나타내기 적합한 상수라면 열거 타입으로 만들자. 인스턴스화 할 수 없는 유틸리티 클래스에 담아 공개하자 public class PhysicalConstants { private PhysicalConstants() { } // 인스턴스화 방지 public static final double AVOGADROS_NUMBER = 6.022_140_857e23.. 2023. 2. 6.
[이펙티브자바]item 21.인터페이스는 구현하는 쪽을 생각해 설계하라. 인터페이스에 디폴트 메서드를 선언하면, 해당 메서드를 재정의하지 않은 모든 클래스에서 디폴트 구현이 쓰이게 된다. 자바 8 전에는 기존 구현체를 깨뜨리지 않고 인터페이스에 메서드를 추가할 방법이 없었다. 인터페이스에 새로운 메서드 추가는 절대로 없다라고 가정하였으며 디폴트 메서드로 추가하는 길이 열렸지만 기존 구현체들과 매끄럽게 연동되리라는 보장은 없다. 디폴트 메서드는 구현 클래스에 대해 아무것도 모른 채 합의 없이 무작정 "삽입"될 뿐. 디폴트 메서드는 컴파일이 성공하더라도 기존 구현체에 런타임 오류를 일으킬 수 있다. interface MarkerInterface { default void hello() { System.out.println("MarkerInterface.hello"); } } cl.. 2023. 2. 6.
[RealMysql 8.0] 인덱스 8 ~ 8.3.3.4 디스크 읽기 방식 컴퓨터의 CPU나 메모리 처럼 전기적 특성을 띤 장치의 성능은 짧은 시간 동안 매우 빠른 속도로 발전 했지만 디스크 같은 기계식 장치의 성능은 상당히 제한적으로 발전했다. 데이터베이스의 성능 튜닝은 어떻게 디스크 I/O를 줄이냐가 관건일 때가 상당히 많다. 하드 디스크 드라이브(HDD) 솔리드 스테이트 드라이브(SDD) 순차 I/O 에서는 ssd 가 hdd 보다 조금 빠르거나 비슷한 성능을 보이기도 하지만 랜덤 I/O 에서는 ssd 가 훨씬 빠르다 데이터베이스는 순차 I/O 작업은 그다지 비중이 크지않고 랜덤 I/O를 통해 작은 데이터를 읽고 쓰는 작업이 대부분이므로 dmbs용 스토리지에 최적이라 볼 수 있다. 랜덤 I/O와 순차 I/O 하드 디스크 드라이브의 플래터(원판)를 돌려서 읽.. 2023. 2. 5.
[RealMysql 8.0] 데이터 압축 6 ~ 7.5.3 데이터 압축 부터 인덱스전까지는 빠르게 읽어보고 그냥 넘어갈꺼임 추후 업데이트 예정. mysql 서버에서 디스크에 저장된 데이터 파일의 크기는 일반적으로 쿼리의 처리 성능과 직결되며, 백업 및 복구 시간과도 밀접한 관계로 연결된다. 파일이 크면 클수록 쿼리를 처리하기위해서 더 많은 데이터 페이지를 INnoDB 버퍼 풀로 읽어야 할 수도 있고, 새로운 페이지가 버퍼 풀로 적재되기 때문에 그만큼 더티 페이지가 더 자주 디스크로 기록돼야 한다. 더티 페이지: 버퍼 풀에 저장된 데이터가 디스크와 동기화 되지 않은 페이지를 말함. 여튼 이러한 문제점을 해결하기 위해 크게 2가지 방식의 데이터 압축 기능을 제공한다. 1.페이지 압축, 2.테이블 압축. 페이지 압축 추후 예정.볼게 많아서 인덱스 까지 빠르게 넘어 감. 2023. 2. 5.
[RealMysql 8.0] mysql의 격리수준 5.4 ~ 5.4.4 개인적으로 아키텍처 부분보다 역시 트랜잭션 부분이 더 재밌는거 같다... 트랜잭션 특성 ACID https://jeong0427.tistory.com/81 트랜잭션 격리수준(Isolation Level)이란 여러 트랜잭션이 동시에 처리될 대 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있게 허용할지 말지는 결정 하는 것. 격리 수준은 크게 아래와 같이 4가지로 나뉠 수 있다. READ UNCOMMITTED(커밋되지 않은 읽기) READ COMMITTED(커밋된 읽기) REPEATABLE READ(반복 가능한 읽기) SERIALIZABLE(직렬화 가능) 4개의 격리 수준에서 순서대로 뒤로 갈수록 각 트랜잭션 간의 데이터 격리(고립) 정도가 높아지며, 동시 처리 성능도 떨어지는 것이.. 2023. 2. 5.
[RealMysql 8.0]5 트랜잭션과 잠금 5.3 ~ 5.3.3 InnoDB 스토리지 엔진 잠금 InnoDB 스토리지 엔진은 mysql 에서 제공되는 잠금과는 별개로 스토리지 엔진 내부에서 레코드 깁ㄴ의 잠금 방식을 탑재 함 이원화된 잠금 방식 때문에 MyISAM 보다는 훨씬 뛰어난 동시성 처리를 제공할 수 있다. 이원화된 잠금 데이터베이스 트랜잭션이 복수의 레코드에 적용되는 잠금을 말한다. 이로인해 데이터베이스의 일관성을 보장하고, 복수의 사용자가 동시에 동일한 레코드에 접근하려 할 때 충돌을 방지 함. 하지만 이원화된 잠금 처리 탓에 InnoDb 스토리지 엔진에서 사용되는 잠금에 대한 정보는 mysql 명령을 이용해 접근하기 까다롭다. 하지만 최근 버전에서는 InnoDb의 트랜잭션과 잠금, 그리고 잠금 대기 중인 트랜잭션의 목록을 조회할 수 있는 방법이 도입됐다... 2023. 2. 5.
mysql 트랜잭션 잠금 확인 쿼리. InnoDB 스토리지 엔진 잠금 InnoDB 스토리지 엔진은 mysql 에서 제공되는 잠금과는 별개로 스토리지 엔진 내부에서 레코드 깁ㄴ의 잠금 방식을 탑재 함 이원화된 잠금 방식 때문에 MyISAM 보다는 훨씬 뛰어난 동시성 처리를 제공할 수 있다. 이원화된 잠금 데이터베이스 트랜잭션이 복수의 레코드에 적용되는 잠금을 말한다. 이로인해 데이터베이스의 일관성을 보장하고, 복수의 사용자가 동시에 동일한 레코드에 접근하려 할 때 충돌을 방지 함. 하지만 이원화된 잠금 처리 탓에 InnoDb 스토리지 엔진에서 사용되는 잠금에 대한 정보는 mysql 명령을 이용해 접근하기 까다롭다. 하지만 최근 버전에서는 InnoDb의 트랜잭션과 잠금, 그리고 잠금 대기 중인 트랜잭션의 목록을 조회할 수 있는 방법이 도입됐다... 2023. 2. 5.
[RealMysql 8.0]5 트랜잭션과 잠금 네임드락 5.2.3 ~ 5.2.4 네임드 락(Named Lock) GET_LOCK() 함수를 이용해 문자열에 대해 잠금을 설정할 수 있다. 단순히 사용자가 지정한 문자열에 대해 획득하고 반납하는 잠금이다. 자주 사용되지 않는다. 음..보다가 궁금증이 생겨 찾아봤다..굳이 네임드 락을 걸어야할까 그냥 레코드 락 걸면안되나? 레코드 락은 특정 레코드에 대한 접근을 제어하는 것이고, 네임드 락은 특정 테이블 이나 리소스에 대한 접근을 제어하는 것이다. 같은 테이블에서 여러 트랜잭션이 동시에 수행될 경우, 레코드 락은 특정 레코드만 잠글 수 있어서 문제가 발생할 수 있다. 네임드 락 같은 경우 테이블 전체에 대한 접근을 제어하기 때문에 같은 테이블에서 동시에 수행되는 트랜잭션을 모두 제어할 수 있다. 따라서 네임드 락을 설정하는 것은 트랜잭션 .. 2023. 2. 4.
728x90