2023년 9월 3주차 주간 기록
주간기록 날짜 2023년 9월 18일 ~ 2023년 9월 24일 계획 책너두 : 클린코드, Real MySQL 8.0 1권, 코딩 인터뷰 완전정복 매일 알고리즘 3문제 9월 20일 : 알고리즘 스터디 9월 24월 : 코딩 테스트 결과 공채시즌이라 너무 바쁘다.. 알고리즘을 놔버렸다. 회고 …
주간기록 날짜 2023년 9월 18일 ~ 2023년 9월 24일 계획 책너두 : 클린코드, Real MySQL 8.0 1권, 코딩 인터뷰 완전정복 매일 알고리즘 3문제 9월 20일 : 알고리즘 스터디 9월 24월 : 코딩 테스트 결과 공채시즌이라 너무 바쁘다.. 알고리즘을 놔버렸다. 회고 …
책너두 5기 42일차 로버트 C. 마틴의 클린코드 p. 388~ p.395 내용정리 17. 냄새와 휴리스틱 일반 26. 정확하라 코드에서 뭔가를 결정할 때는 정확히 결정한다. 결정을 내리는 이유와 예외를 처리할 방법을 분명히 알아야 한다. 코드에서 모호성과 부정확은 의견차나 게으름의 결과다. 검색 결과 중 첫 번째 결과만 유일한 결과로 간주하지 마라. 부동 소수점으로 통화를 표현하지 마라. 갱신할 가능성이 희박하다고 잠금과 트랜잭션 관리를 건너뛰지 마라. List로 선언할 변수를 ArrayList로 선언하지 마라. 모든 변수를 protected로 선언하지 마라. ...
책너두 6기 18일차 백은빈, 이성욱의 Real MySQL8.0 1권 p.185 ~ p.194 내용정리 06 데이터 압축 디스크에 저장된 데이터 파일의 크기는 쿼리의 처리 성능, 백업 및 복구 시간과도 연결된다. 시간과 비용을 절약하기 위해 데이터 압축 기능이 있다. 6.1 페이지 압축 “Transparent Page Compression"이라고도 불린다. 서버가 디스크에 저장하는 시점에 데이터 페이지가 압축되어 저장 서버가 디스크에서 데이터 페이지를 잃어올 때 압축이 해제 페이지 압축 작동 방식 16KB 페이지를 압축(압축 결과를 7KB로 가정) MySQL 서버는 디스크에 압축된 결과 7KB를 기록(이때 MySQL 서버는 압축 데이터 7KB에 9KB의 빈 데이터를 기록) 디스크에 데이터를 기록한 후, 7KB 이후의 공간 9KB에 대해 펀치 홀(Punch-hole)을 생성 파일 시스템은 7KB만 남기고 나머지 디스크의 9KB 공간은 다시 운영체제로 반납 여러 이유로 페이지 압축은 거의 사용되지 않는다. ...
책너두 6기 17일차 백은빈, 이성욱의 Real MySQL8.0 1권 p.176 ~ p.184 내용정리 05 트랜잭션과 잠금 5.4 MySQL의 격리 수준 격리 수준(isolation level)이란 여러 트랜잭션이 동시에 처리될 때 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있게 허용할지 말지를 결정하는 것이다. 5.4.1 READ UNCOMMITTED 각 트랜잭션에서의 변경 내용이 COMMIT이나 ROLLBACK 여부에 상관없이 다른 트랜잭션에서 보인다. 이를 더티 리드(Dirty read)라 한다. 5.4.2 READ COMMITTED 오라클 DBMS에서 기본으로 사용되는 격리 수준. 가장 흔하게 사용된다. ...
책너두 5기 41일차 로버트 C. 마틴의 클린코드 p. 379~ p.387 내용정리 17. 냄새와 휴리스틱 일반 15. 선택자 인수 선택자(selector) 인수는 목적을 기억하기 어려울 뿐 아니라 각 선택자 인수가 여러 함수를 하나로 조합한다. 인수를 넘겨 동작을 선택하는 대신 새로운 함수를 만드는 편이 일반적으로 좋다. 16. 모호한 의도 코드를 짤 때는 의도를 최대한 분명히 밝힌다. 17. 잘못 지운 책임 코드는 독자가 자연스럽게 기대할 위치에 배치한다. 18. 부적절한 static 함수 일반적으로 static 함수보다 인스턴스 함수가 더 좋다. 조금이라도 의심스럽다면 인스턴스 함수로 정의한다. 반드시 static 함수로 정의해야 겠다면 재정의할 가능성은 없는지 꼼꼼히 따져본다. ...
책너두 5기 40일차 로버트 C. 마틴의 클린코드 p. 370~ p.378 내용정리 17. 냄새와 휴리스틱 환경 1. 여러 단계로 빌드해야 함 빌드는 간단히 한 단계로 끝나야 한다. 한 명령으로 전체를 체크아웃해서 한 명령으로 빌드할 수 있어야 한다. 2 . 여러 단계로 테스트해야 함 모든 단위 테스트는 한 명령으로 돌려야 한다. 함수 1. 너무 많은 인수 함수에서 인수 개수는 적을수록 좋고 아예 없으면 가장 좋다. 2. 출력 인수 인수는 출력보단 입력으로 간주할 수 있어야 한다. ...
책너두 6기 16일차 백은빈, 이성욱의 Real MySQL8.0 1권 p.170 ~ p.175 내용정리 05 트랜잭션과 잠금 5.3.2 인덱스와 잠금 InnoDB의 잠금은 레코드를 잠그는 것이 아니라 인덱스를 잠그는 방식으로 처리한다. 즉, 변경해야 할 레코드를 찾기 위해 검색한 인덱스의 레코드를 모두 락을 걸어야 한다. 5.3.3 레코드 수준의 잠금 확인 및 해제 테이블 잠금에서는 문제의 원인이 쉽게 발견되고 해결된다. 하지만 레코드 수준의 잠금은 테이블의 레코드 각각에 잠금이 걸리므로 자주 사용되지 않는다면 오랜 시간동안 잠겨진 상태로 남아 있어도 잘 발견하지 않는다. 읽고 나서 슬슬 어렵다. ...
책너두 5기 39일차 로버트 C. 마틴의 클린코드 p. 363~ p.369 내용정리 16. SerialDate 리팩터링 리팩터링 과정 처음에 나오는 주석을 간단하게 고치고 개선한다. enum을 모두 독자적인 소스 파일로 옮긴다. 정적 변수(dataFormateSymbols)와 정적 메서드(getMonthNames, isLeapYear, lastDayOfMonth)를 DateUtil이라는 새 클래스로 옮긴다. 일부 추상 메서드를 DayDate 클래스로 끌어 올린다. month.make를 Month.fromInt로 변경했다. 다른 enum도 똑같이 변경한다. 모든 enum에 toInt() 접근자를 생성하고 index 필드를 private로 정의한다. plusYears와 plusMonths에 있는 중복을 LastDayOfMonth라는 새 메서드를 생성하여 없앴다. 자주 사용되는 숫자 1을 없앴다. 결론 위와 같은 과정을 통해 버그를 고쳤고, 테스트 커버리지가 증가했으며 코드 크기도 줄고 명확해졌다. 다른 사람은 더욱 쉽게 이해할 수 있다. ...
책너두 6기 15일차 백은빈, 이성욱의 Real MySQL8.0 1권 p.160 ~ p.169 내용정리 05 트랜잭션과 잠금 5.2 MySQL 엔진의 잠금 MySQL에서 사용되는 잠금은 크게 스토리지 엔진 레벨과 MySQL 엔진 레벨로 나눌 수 있다. MySQL 엔진은 서버에서 스토리지 엔진을 제외한 나머지 부분으로 이라 볼 수 있다. 5.2.1 글로벌 락 글로벌 락(GLOBAL LOCK)은 가장 범위가 크다. 한 세션엣 획득하면 다른 세션에서 SELECT를 제외한 대부분의 문장이 대기 상태로 남는다. MySQL 서버 전체에 영향을 미치며 테이블이나 데이터베이스가 달라도 미친다. Xtrabackup이나 Enterprise Backup 과 같은 백업 락: 조금 더 가벼운 글로벌 락. 일반적인 테이블의 데이터 변경은 허용된다. 5.2.2 테이블 락 테이블 락(Table Lock)은 ㄱ별적인 테이블 단위로 설정되는 잠금. 명시적 또는 묵시적으로 획득할 수 있다. 5.2.3 네임드 락 네임드 락(Named Lock)은 GET_LOCK()함수를 이용해 임의의 문자열에 대해 잠금을 설정할 수 있다. 단순히 사용자가 지정한 문자열(String)에 대해 획득하고 반납(해제)하는 잠금이다. 5.2.4 메타데이터 락 메타데이터 락(Metadata Lock)은 데이터베이스 객체(테이블이나 뷰 등)의 이름이나 구조를 변경하는 경우에 획득하는 잠금이다. 명시적으로 획득하거나 해제하지 않는다. 테이블의 이름을 변경하는 경우 자동으로 획득하는 잠금 5.3 InnoDB 스토리지 엔진 잠금 5.3.1 InnoDB 스토리지 엔진의 잠금 잠금 정보가 상당히 작은 공간으로 관리되기 때문에 레코드락 -> 페이지락 or 테이블락 으로 레벨업 되는 경우(락 에스컬레이션)는 없다. 5.3.1.1 레코드 락 레코드 자체만을 잠그는 것(Reocord lock, Record only lock)이라고 한다. 다른 상용 DBMS의 레코드 락과 동일한 역할을 한다. 5.3.1.2 갭 락 갭 락(Gap lcok)은 레코드 자체가 아니라 레코드와의 바로 인접한 레코드 사이의 간격만을 잠그는 것을 의미한다. 레코드와 레코드 사이의 간격에 새로운 레코드가 생성(Insert)되는 것을 의미한다. 5.3.1.3 넥스트 키 락 레코드락과 갭 락을 합쳐 놓은 형태가 넥스트 키 락(Next key lock)이라고 한다. 5.3.1.4 자동 증가 락 읽고 나서 다양한 Lock의 종류가 있다. 알아는 두자 ...
책너두 5기 38일차 로버트 C. 마틴의 클린코드 p. 352~ p.362 내용정리 16. SerialDate 리팩터링 리팩터링의 기술 명명법을 통해 명확히 메서드와 함수의 역할을 파악할 수 있도록 한다. 불필요한 주석은 삭제한다. 변수의 public/private 필요 여부를 파악한다. 변수는 최대한 사용 위치에 가깝에 옮긴다. 읽고나서 JAVA는 어려워.