개인 공부89 [이펙티브 자바] 아이템 4 : 인스턴스화를 막으려거든 private 생성자를 사용하라 ✍️ 학습 목표 정적 클래스 인스턴스화 방지 📌 정적 클래스 정적 메서드와 정적 필드만 담은 클래스를 정적 클래스라고 한다. 객체 지향성을 살리지 못하는 방법이지만 나름 쓰임새가 존재한다. 🤔 정적 클래스의 쓰임새 대표적인 쓰임새로는 java.lang.Math, java.util.Arrays 그리고 java.util.Collections 등이 있다. 또, final 클래스와 관련된 메서드들을 모아놓기도 한다. 모두 특정 기능을 모아둔 도구 꾸러미 같은 느낌이다. 그래서 유틸리티 클래스라고도 하나보다. 📌 인스턴스화 방지 애초에 유틸리티 클래스는 인스턴스로 만들어 쓰라고 설계한 게 아니다. 따라서, private 생성자를 선언해서 인스턴스화를 방지해야 한다. 🧐 왜 private 생성자? private 지.. 2023. 1. 2. [이펙티브 자바] 아이템 3 : private 생성자나 열거 타입으로 싱글턴임을 보증하라 ✍️ 학습 목표 싱글턴 이해하기 싱글턴 vs 정적 클래스 📌 싱글턴 이해하기 싱글턴이란, 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다. 🛠️ 싱글턴 만들기 1️⃣ private static final 필드 방식 class Pokemon { public static final Pokemon INSTANCE = new Pokemon(); private Pokemon() { } } 싱글턴임을 확실하게 알 수 있고 간결하다. 하지만 리플랙션 API를 사용해서 private 생성자에 접근하면 제 2의 인스턴스가 만들어질 수도 있다. 추가적인 인스턴스가 생성되려고 할 때 예외를 던지는 방식으로 이런 공격을 방어할 수 있다. 2️⃣ 정적 팩토리 메서드 방식 class Pokemon { private sta.. 2022. 12. 21. [이펙티브 자바] 아이템 2 : 생성자에 매개변수가 많다면 빌더를 고려하라 ✍️ 학습 목표 객체 생성하기 (feat. 생성자) 각각의 장단점 이해하기 📌 객체 생성하기 (feat. 생성자) 생성자를 사용해서 객체를 사용하는 방법은 3가지가 존재한다. 각 방식의 사용법들은 다음과 같다. 1️⃣ 점층적 생성자 매개변수가 다른 생성자를 여러 개 구현하는 방식이다. 필수 매개변수가 들어가는 생성자부터 선택 매개변수를 하나하나 추가되는 생성자를 점층적으로 구현하는 방식이다. class Pokemon { private final int attack, defense, hp; public Pokemon(int attack) { this(attack, 0, 0); } public Pokemon(int attack, int defense) { this(attack, defense, 0); } p.. 2022. 12. 21. TIL : Random VS SecureRandom (19) 🛠️ Random과 SecureRandom 난수 생성을 위해서 보통 Random을 사용하는데, SecureRandom을 권장하더라! 왜 그럴까? 🤔 Random 우선 Random은 난수를 만들기 위해 사용하는데, 정말 무작위 숫자를 만들지 않고 의사 난수를 생성한다. 의사 난수란? 무작위의 숫자처럼 보이는 규칙적으로 만들어진 숫자이다. Random을 조금 써본 사람이라면 같은 seed라면 같은 값이 나오는 것을 알고 있을 것이다! 이게 바로 의사 난수라서 그렇다. 😮 SecureRandom 이름에서부터 느껴지듯이 보안성이 더 좋을 것만 같다. 그렇다면 정확하게 어떤 점이 다를까? 1️⃣ 크기 Random은 48 비트까지 지원하지만 SecureRandom은 128 비트까지 지원한다! 같은 값이 나올 확률이.. 2022. 12. 20. [자바 ORM 표준 JPA 프로그래밍] 고급 매핑 (7장) 📌 상속 관계 매핑 관계형 데이터베이스에는 상속이 없다. 그나마 '슈퍼타입-서브타입 관계' 모델링 기법이 상속과 비슷하다. 즉, ORM에서의 상속 관계 매핑은 이 모델링 기법이고 3가지 방법으로 구현할 수 있다. 조인 전략 : 각각을 모두 테이블로 만들고 조회 시 조인을 사용한다. 단일 테이블 전략 : 테이블을 하나만 사용해 통합한다. 구현 클래스 테이블 전략 : 서브 타입마다 하나의 테이블을 만든다. 1️⃣ 조인 전략 모두 테이블로 만들고 자식 테이블이 부모 테이블의 기본 키를 받아 기본 키 + 외래 키로 사용한다. 테이블은 타입의 개념이 없어 타입을 구분하는 칼럼을 추가해야 한다. @Entity @Inheritance(strategy = InheritanceType.JOINED) // 상속의 부모 클.. 2022. 12. 12. TIL : N+1 문제, Fetch 전략 (18) ☄️ N+1 문제 N+1 문제란? JPA를 사용할 때 흔히 발생하는 문제 중 하나이다. 1번의 쿼리로 N개의 데이터를 가져왔는데, 그 데이터들을 처리하기 위해서 N번의 쿼리가 더 발생하는 문제이다. 🧐 언제 발생하는 문제일까? 몇몇 블로그에서 Fetch 전략에 따라 발생하는 문제라고 작성되어있다. EAGER와 LAZY는 실제 데이터를 가져오는 시점의 차이이지 N+1 문제에 궁극적인 원인이 아니다. JpaRepository에 정의한 메서드를 실행하면 JPA는 메서드 이름을 분석해서 JPQL 쿼리를 생성해 실행한다. JPQL 객체지향 쿼리 언어로 테이블을 신경 쓰지 않고 엔티티와 필드만으로 쿼리를 생성한다. 따라서, N+1 문제는 JPQL이 연관관계를 무시하고 해당 엔티티만을 기준으로 쿼리를 조회하기 때문에.. 2022. 12. 7. 이전 1 ··· 3 4 5 6 7 8 9 ··· 15 다음