본문 바로가기

분류 전체보기411

[토비의 스프링] 오브젝트와 의존관계 (1장) 1.2 dao의 분리 객체지향의 꽃은 결국 관심사를 분리하는 것 (Seperating of Concerns) 왜? 자유로운 변경, 발전, 확장을 위해서 어떻게? 관심이 다른 것을 가능한 분리하여 서로 영향을 주지 않게 템플릿 메소드 패턴 : 슈퍼 클래스에 기본적인 기능을 구현하고 기능의 일부를 서브 클래스에 필요에 맞게 구현할 수 있도록 하는 패턴. (protect로 선택 가능하게, 추상 메서드로는 꼭 구현하게) 여기서 템플릿 메소드란? 기본 알고리즘 골격을 담은 메소드, 애플리케이션의 run() 같은게 템플릿 메서드이다. 훅 메서드 : protect로 구현된 선택적으로 오버라이드가 가능한 메서드 팩토리 메서드 패턴 : 서브 클래스에서 구체적인 오브젝트 생성 방법과 클래스를 결정하게 하는 패턴. 슈퍼클래.. 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 : 생성자 대신 정적 팩토리 메서드를 고려하라 ✍️ 학습 목표 객체 생성하기 정적 팩토리 메서드의 장점 정적 팩토리 메서드의 단점 📌 객체 생성하기 객체를 생성하는 가장 흔한 방법은 public 생성자를 사용하는 것이다. 정적 팩토리 메서드를 사용해서도 객체를 생성할 수 있다. 차이는 다음과 같다. 🧐 public 생성자 class Pokemon { private int attack, defense, hp; public Pokemon(int attack, int defense, int hp) { this.attack = attack; this.defense = defense; this.hp = hp; } } public class Item1 { public static void main(String[] args) { Pokemon 피카츄 = new .. 2022. 12. 7.
[Java] 멀티쓰레드 프로그래밍 (22.12.05 updated) ✍️ 학습할 것 Thread 클래스, Runnable 인터페이스 Thread의 상태 Thread의 우선순위 Main Thread 동기화 데드락 📌 Thread 클래스, Runnable 인터페이스 Java는 멀티쓰레드 프로그래밍을 지원하는 언어이다. 멀티쓰레드 환경은 어떤 쓰레드가 문제가 발생하면 다른 쓰레드에도 영향을 미친다. 따라서 쓰레드에 대한 이해는 필수적이고 다른 실행 환경을 제공하는 프로세스에 대한 이해도 같이 해보자. 🧷 프로세스, Process 메모리 상에 올라간 프로그램을 프로세스라고 한다. 자체적인 실행환경을 가지고 있다. 모든 프로세스는 적어도 하나의 쓰레드를 가진다. 둘 이상일 때 멀티쓰레드 프로세스라고 부른다. 🧷 쓰레드, Thread 쓰레드는 일종의 실행환경의 단위로 실제 작업을 .. 2022. 12. 5.