7

이펙티브 자바 - 직렬화

"이펙티브 자바"의 마지막 챕터는 직렬화이다.  요즘은 대부분 JSON이나 Protobuf 같은 언어에 독립적인 데이터 교환 형식을 사용하는데, 왜 책에서는 여전히 직렬화를 중요한 주제로 다룰까? 자바에서 기본적으로 제공하는 직렬화(Serialization)와 역직렬화(Deserialization)는 JVM 위에서 동작하며, 데이터를 파일이나 네트워크로 전달할 수 있는 형식으로 변환하는 강력한 기능입니다. 하지만 이 메커니즘은 클래스 설계이 유연성 저하, 보안 취약점, 이식성 부족등의 큰 한계가 존재한다. 그렇다면 책에서는 왜 직렬화 파트를 크게 다룰까?여기서는 크게 직렬화를 하게 되면 유의할 점 등 직렬화시 매커니즘과 유의 사항을 알아보자는 취지로 책을 읽어보자! 직렬화의 목적현재 JVM 메모리 상태를..

이펙티브 자바 - 제네릭

아이템26 . 로 타입을 사용하지 말라!로 타입이란?  제네릭 타입에서 타입 매개변수가 정의되지 않을 때를 말한다. 예를 들어 List 의 로 타입은 List 이다.로(raw) 타입을 사용하지 말아야하는 이유는 무엇일까? 즉 매개변수화 타입을 사용하라는 말이다.매개변수화 타입을 사용하면 런타임이 아닌 컴파일 타입에 문제를 찾을 수 있고(안정성 -> 로타임 컬렉션에는 아무원소나 넣은 수 있어 타입 불변식 훼손이 쉽다.)제네릭을 활용하면 이 정보가 주석이 아닌 타입 선언 자체에 녹아든다. (표현력 : ex ) List -> Integer 라는 타입을 넣는다는 사실을 알수 있음)로 타입을 사용하면 안정성과 표현력을 잃게된다.아이템27. 비검사 경고를 제거하라 "비검사(unchecked) 경고 란? "컴파일러가..

[MySQL] B-Tree 인덱스

인덱스를 생성하는 도중 의문에 생겼다.다중컬럼 인덱스를 생성하면 단일컬럼인덱스를 왜 또 생성해주어야할까?다중컬럼 인덱스를 걸어두면 단일컬럼 조회 시에도 인덱스 스캔을 타야 하는 것이 아닐까?B-Tree 인덱스 구조를 파헤쳐보면  이 문제에 대한 해답을 얻을 수 있었다. 인덱스란?테이블을 처음부터 끝까지 검색하는 방법인 FTS(Full Table Scan) 과 달리 인덱스를 검색하여 해당 자료의 테이블에 접근하는 방법입니다.인덱스를 책에 마지막에 있는 인덱스 목록(찾아보기) 에 비유하자면 책의 내용은 데이터 파일이 될 것이고 데이터 파일에 저장된 레코드의 주소는 인덱스 목록에 있는 페이지 번호가 될 것입니다. 인덱스의 장단점인덱스는 항상 정렬된 상태를 유지하기 때문에 원하는 값을 검색하는데 빠르지만, 새로..

[Real Mysql 8.0] 5.2 MySQL 엔진의 잠금

5.2  MySQL 엔진의 잠금 Mysql 에서 사용되는 잠금은 크게 스토리지 엔진 레벨과 MySQL 엔진 레벨로 나눌 수 있다. MySQL 엔진 :MySQL 엔진 레벨의 잠금은 모든 스토리지 엔진에 영향을 미침스토리지 엔진 : 스토리지 엔진 간 상호 영양을 미치지 않음. 5.2.1GLOBAL LOCKFLUSH TABLES WITH READ LOCK 명령으로 획득 할 수 있다.MySQL 에서 제공하는 잠금 가운데 가장 범위가 크다.한 세션에서 글로벌 락을 획득하면 다른 세션에서 SELECT 를 제외한 대부분의 DDL ,DML 문장을 실행하는 경우 글로벌 락이 해제될 때까지 해당 문장이 대기 상태로 남는다.글로벌 락이 영향을 미치는 범위는 MySQL 서버 전체이다.작업 대상 테이블이나, 데이터베이스가 다르..

[2장 객체 생성과 파괴] 아이템2. 생성자에 매개변수가 많다면 빌더를 고려하라

생성자에 매개변수가 많다면 빌더를 고려하라정적 팩터리와 생성자에 선택적 매개변수가 많을 때 적절히 대응하기 어렵다는 제약이 있다. 대안1. 점층적 생성자 패턴 식품포장의 영양정보를 표현하는 클래스를 예를 들어보자. public class NutritionFacts{ // 필드(기본값이 있다면) 기본값으로 초기화된다. private final int servingSize; // (mL, 1회 제공량) - 필수 private final int servings; // (회, 총 n회 제공량) - 필수 private final int calories; // (1회 제공량당) - 선택 private final int fat; // (g/1회 제공량) - 선택 private fina..

[Real Mysql 8.0] 5. 트랜잭션

5.1트랜잭션 트랜잭션은 작업의 완전성을 보장해줍니다. 즉 논리적인 작업셋을 모두 완벽하게 처리하거나, 모두 처리하지 못할 경우에는 원 상태로 복구하여 작업의 일부만 적용되는 현상(Partial update)이 발생하지 않게 만들어주는 기능입니다.트랜잭션은 커밋되거나 롤벡됩니다. 5.1.1 MySql 에서의 트랜잭션트랜잭션은 하나의 논리적인 작업 셋에 하나의 쿼리가 있든 두개이상의 쿼리가 있든 관계없이 논리적입 작업 셋 자체가 100% 적용되거나(commit을 실행했을때) 아무것도 적용되지않아야 (ROLLBACK) 함을 보장해주는 것입니다. InnoDB 스토리지엔진 (트랜잭션 지원) vs MyISAM (트랜잭션 미지원) 트랜잭션 관점에서 InnoDB 테이블과 MyISAM 테이블이 차이를 살펴보자 ..

[2장 객체 생성과 파괴] 아이템1. 생성자 대신 정적 펙터리 메서드를 고려하라.

정적 팩터리 메소드 : 생성자와 별도로 그 클래스의 인스턴스를 반환하는 단순한 정적메서드. public static void main(String[] args) { Boolean bool1 = new Boolean(true); // new 생성자로 인스턴스 생성 // public Boolean(boolean value) { // this.value = value; // } Boolean bool2 = Boolean.valueOf(true); // 정적 팩터리 메소드를 활용한 인스턴스 생성 // public static Boolean valueOf(boolean b) { // ret..