
🚀 풀이 후기오랜만에 알고리즘을 푸니까 BufferedReader, InputStreamReader로 인풋을 만드는 방법을 까먹었더라고요. 🥲🌒 문제 설명🌓 문제 풀이import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class Main { // 변수 A, B, C를 정의합니다. static int a, b, c; public static void main(String[] args) throws IOException { // BufferedReader를 이용해 A, B, C 를 입력받습니다. BufferedReader br = new Buffere..

🚀 풀이 후기정답인지 검사할 때, 함수의 반환 자료형인 int 의 값과, 인풋이었던 nums 를 모두 확인한다는 부분이 신기했습니다.🌒 문제 설명Given an integer array nums sorted in non-decreasing order, remove the duplicates in-place such that each unique element appears only once. The relative order of the elements should be kept the same. Then return the number of unique elements in nums.Consider the number of unique elements of nums to be k, to get ac..

프록시 심화 주제 영속성 컨텍스트와 프록시 영속성 컨텍스트는 자신이 관리하는 영속 엔티티의 동일성(==)을 보장한다. 그럼 프록시로 조회한 엔티티의 동일성도 보장할까? @Test public void 영속성컨텍스트와_프록시1() { Team team1 = Team.builder() .name("team1") .build(); em.persist(team1); em.flush(); em.clear(); Team refTeam = em.getReference(Team.class, team1.getId()); // 프록시를 이용한 방법 Team findTeam = em.find(Team.class, team1.getId()); // 영속성 컨텍스트 이용한 방법 System.out.println("refTeam..

👊 시작하기 이번 글을 통해 JPA Page와 Pageable interface 비교해보고, Paging 최적화 방법에 대해 알아보겠습니다. JPA 페이징 API TypedQuery query = em.createQuery("SELECT m FROM Member m ORDER BY m.username DESC", Member.class); query.setFirstResult(10); query.setMaxResults(20); query.getResultList(); JPA 는 페이징을 2개의 API로 추상화합니다. setFirstResult(int startPosition) : 조회 시작 위치(0부터 시작) setMaxResults(int maxResult): 조회할 데이터 수 setFirstResu..

이번 장을 읽으면서 em.find() vs JPQL select 차이와 JPA flush에 대해 정리한다. em.find() vs JPQL select em.find(Member.class, 1L); em.find(Member.class, 1L); 이 코드를 실행하면 데이터베이스에 쿼리가 몇 번 실행될까? 답은 한 번이다. JPA 의 em.find() 를 실행하면 영속성 컨텍스트에 해당 엔티티가 있는지 검사한다. 영속성 컨텍스트에 엔티티가 있으면 그 엔티티를 반환하고, 없으면 데이터베이스에 조회 쿼리를 실행 > 영속성 컨텍스트에 저장 > 반환한다. em.find(Member.class, 1L); em.createQuery("select m from Member m where m.id = 1") .getS..

기본값 타입 값 타입: 식별자가 없고, 숫자 또는 문자 속성만 있다. int, double, Integer, String... 같은 자료형을 값 타입이라고 한다. 임베디드 타입(복합 값 타입) 기존에 있는 값 타입(int, String)이 아니라 새로운 값 타입을 개발자가 직접 정의해서 사용할 수 있다. 이렇게 새롭게 만든 값 타입을 엔티티 클래스 내부에서 사용할 수 있는데 이를 임베디드 타입, 복합 값 타입이라고 한다. 임베디드 타입을 사용하면 엔티티 클래스를 깔끔하게 만들 수 있다. Member 클래스 내부에 (id, name, startDate, endDate, city, street, zipcode)를 모두 쓰지 않고 (id, name, workPeriod, homeAddress) 만 썼다. 그리..

프록시 프록시 객체: 실제 엔티티 객체 대신에 데이터베이스 조회를 지연할 수 있는 가짜 객체다. 프록시 객체를 만들어서 조회하기 위해서는 아래와 같이 사용하면 된다. Member member = em.getReference(Member.class, "member1"); 프록시 클래스는 실제 클래스를 상속받아서 만들어진다. 프록시 객체는 실제 클래스의 참조를 보관하고 있기 때문에 프록시 객체의 메소드를 호출하면 실제 객체의 메소드를 호출하게 된다. 프록시 객체의 특징 - 처음 한 번만 초기화된다. (초기화: 영속성컨텍스트에 DB에서 가져온 엔티티 저장하는 작업) - 영속성 컨텍스트에 이미 찾는 엔티티가 있으면 em.getReference()를 호출해도 실제 엔티티를 반환한다. 프록시 객체는 PK를 보관하고..

이번 장에서는 - 상속 관계 매핑 - @MappedSuperclass - 복합키와 식별 관계 매핑 - 조인 컬럼 vs 조인 테이블 - 엔티티 하나에 여러 테이블 매핑 에 대해 공부한다. 상속 관계 매핑 슈퍼타입-서브타입 논리모델을 실제 테이블로 구현하기 위한 방법 1. 각각의 테이블로 변환: 모두 테이블로 만들고, 테이블끼리 조인하는 전략 2. 통합 테이블로 변환: 단일 테이블만 사용하는 전략 3. 서브타입 테이블로 변환: 서브 클래스마다 테이블을 생성하는 전략 조인 전략 엔티티 각각을 테이블로 만들고 테이블끼리의 조인을 사용해서 조회한다. 슈퍼타입의 DTYPE 컬럼을 이용해서 서브타입 종류를 구분한다. // 슈퍼타입 @Entity @Inheritance(strategy = InheritanceType...