TIL 33

[TIL] 20240322 EXPLAIN 실행계획

1. EXPLAIN 쿼리가 데이터베이스에 의해 어떻게 처리될지에 대한 세부 정보를 알려주어, 성능 문제를 진단하고 최적화할 수 있는 아이디어를 제공함 id: 쿼리 실행 계획에서의 SELECT 문의 순서를 나타냄. 같은 번호를 공유하는 행은 같은 쿼리 또는 조인의 일부 select_type: 쿼리의 종류를 나타냄. table: 참조하고 있는 테이블의 별칭 partitions: 쿼리가 참조하는 테이블의 파티션에 대한 정보 type: 조인 또는 조회 유형 possible_keys: 이 쿼리에서 사용할 수 있는 인덱스 key: 실제로 쿼리 실행에 사용된 인덱스 key_len: 사용된 인덱스의 최대 가능 길이 바이트 단위 ref: 인덱스에서 사용된 컬럼이나 상수 rows: 쿼리나 조인의 각 단계에서 검색되거나 조..

TIL 2024.03.22

[TIL] 20240314 Spring project 최적화

구글 검색을 해본 결과 spring jpa 프로젝트를 최적화 하기 위한 방법들이다. 1. **Choose the Right Fetch Type**: - **Lazy Loading vs. Eager Loading**: Use lazy loading by default to avoid loading unnecessary data. Eager loading can be beneficial for data that is always used together, but it can also lead to performance issues if not used carefully. 2. **Use Spring Data JPA Projections**: - Projections allow you to fetch only..

TIL 2024.03.14

[TIL] 20240313 Propagation / Isolation

1. 전파전략 트랜잭션 전파 행동은 하나의 트랜잭션이 다른 트랜잭션에 참여할 방법을 정의함 (부모, 자식메서드) REQUIRED (기본값): 현재 진행 중인 트랜잭션이 있으면 그 트랜잭션에 참여하고, 그렇지 않으면 새로운 트랜잭션을 시작합니다. SUPPORTS: 현재 진행 중인 트랜잭션이 있으면 그 트랜잭션에 참여합니다. 트랜잭션이 없다면 트랜잭션 없이 실행됩니다(트랜잭션이 필수적이지 않을 때 유용). MANDATORY: 반드시 현재 진행 중인 트랜잭션이 있어야 합니다. 현재 트랜잭션이 없으면 예외가 발생합니다. REQUIRES_NEW: 항상 새로운 트랜잭션을 시작합니다. 이미 진행 중인 트랜잭션이 있으면, 그 트랜잭션을 일시 정지시키고 새로운 트랜잭션을 시작합니다. NOT_SUPPORTED: 트랜잭션 ..

TIL 2024.03.13

[TIL] 20240311 JPA Query dsl - JPAQueryFactory

1. JPAQueryFactory 조인문이나 여러가지 복잡한 쿼리문을 작성할때도 있는데 이때 Querydsl을 사용하면 jpaQueryFactory 객체를 생성하여 쿼리문을 작성할 수 있음 문자가 아닌 코드로 쿼리를 작성함으로써, 컴파일 시점에 문법 오류를 쉽게 확인할 수 있다. 자동 완성 등 IDE의 도움을 받을 수 있다. 동적인 쿼리 작성이 편리하다. 쿼리 작성 시 제약 조건 등을 메서드 추출을 통해 재사용할 수 있다. 2. 사용방법 JPAQueryFactory 에 entityManager 를 주입해서 Bean 으로 등록 -> Q클래스 생성 -> selectFrom(), select() 메서드 활용 - selectFrom() SELECT 쿼리와 FROM 절을 결합한 단축 형태로, 조회할 엔티티의 타입..

TIL 2024.03.11

[TIL] 20240308 JPA Query dsl - QuerydslPredicateExecutor

1. queryDSL이란? QueryDSL은 Java 언어를 사용해 타입 안전(Type-Safe) 쿼리를 생성할 수 있게 해주는 프레임워크 복잡한 검색 조건이나 동적 쿼리를 손쉽게 구현할 수 있으며, 컴파일 타임에 타입 체크가 이루어져 실행 시간에 발생할 수 있는 많은 오류를 사전에 방지가능 2. 사용방법 의존성 추가 -> 코드 생성 -> 쿼리추가/생성 (Q클래스 이용) findOne(Predicate), findAll(Predicate) 주로 이 2개 메소드가 사용된다. findOne = Optional 리턴 findAll = List | Page | Iterable | Slice 리턴 3. Q클래스 엔티티 클래스의 메타 정보를 담고 있는 클래스, 타입 안정성(Type safe)을 보장하면서 쿼리를 작..

TIL 2024.03.08

[TIL] 20240306 JPA N+1 문제

1. N+1 문제란? N+1 문제는 한 번의 쿼리로 N개의 연관된 엔티티를 가져올 때, 각각의 연관된 엔티티를 가져오기 위해 N번의 추가 쿼리가 실행되는 현상 2. 해결방법 Global Fetch @ManyToOne 속성에 fetch 속성으로 LAZY로 설정 엔티티를 생성할 때(컴파일 시점) 결정 되는 연관관계 전략임 Fetch Join JPQL의 fetch join을 사용하면 연관된 엔티티를 한 번의 쿼리로 함께 가져올 수 있음 조인할 때 연관된 엔티티나 컬렉션를 함께 조회하려고 할 때 사용하고, 결과는 EAGER 와 똑같지만 과정은 다름 List posts = entityManager.createQuery( "SELECT p FROM Post p JOIN FETCH p.comments", Post.c..

TIL 2024.03.06

[TIL] 20240305 JPA 페이징 기능

1. 페이징 paging 이란? 페이징 처리는 큰 데이터셋을 작은 '페이지'로 나누고, 각 페이지에는 고정된 수의 데이터 항목이 포함되어 있음 전체 데이터셋에서 일부 데이터만을 조회하여 애플리케이션의 성능을 향상시킬 수 있으며, 사용자 인터페이스에서 데이터를 페이지 단위로 표시가능 사용자 또는 애플리케이션은 한 번에 한 페이지의 데이터만 요청하며, 필요에 따라 다음 페이지나 이전 페이지의 데이터를 요청가능 2. 구현방법 (1) Repository 인터페이스 정의 및 PageRequest 를 사용하여 Pageable 객체화 PageRequest.of(int page int size, Sort sort, Direction direction, String ... props) : (2) Pageable을 Jpa..

TIL 2024.03.05

[TIL] 20240304 JPA 1차캐시 / 2차캐시

캐시는 JPA에서 성능 최적화를 위해 중요한 역할을 한다. 1. 1차 캐시 EntityManager를 통해 엔티티를 조회하면, JPA는 먼저 1차 캐시에서 해당 엔티티를 검색 만약 1차 캐시에 엔티티가 존재한다면, 데이터베이스에 접근하지 않고 캐시된 엔티티를 반환 1차 캐시에 없는 경우에만 데이터베이스에서 엔티티를 조회하고, 조회된 엔티티는 1차 캐시에 저장 이후 같은 EntityManager 범위 내에서 해당 엔티티를 다시 조회하면, 데이터베이스 접근 없이 1차 캐시에서 바로 가져옴 트랜잭션을 시작하고 종료할 때까지만 유효, 객체 동일성보장 2. 2차 캐시 실무에서 적용하기 어려움 -> 라이브러리가 적음 애플리케이션 범위 내에서 공유되는 캐시로, 여러 EntityManager 인스턴스 간에 공유함 2차..

TIL 2024.03.04

[TIL] 20240226 Spring JPA Query method

1. @query 이용 Java Persistence Query Language 인 JPQL이용 Repository method에 @Query Annotation을 사용해서 위의 과정을 SpringDataJPA에 위임 파라미터가 3개 이상이 되거나 order by 절 등을 사용해서 쿼리가 복잡해지면 메서드명이 엄청나게 늘어나 가독성을 저하될때 사용 public interface UserRepository extends JpaRepository { @Query("select u from User u where u.emailAddress = ?1") User findByEmailAddress(String emailAddress); } 2. query method 이용 메서드를 만들어 쓰는 방식을 통해서 서비..

TIL 2024.02.26

[TIL] 20240221 Junit Mock 객체 / Stubbing

1. mock 객체란? 실제 객체를 만들기에는 비용과 시간이 많이 들거나 의존성이 크게 걸쳐져 있어서 테스트 시 제대로 구현하기 어려울 경우 가짜 객체를 만들어서 사용하는 기술 2. 주요 메소드 mock() : Mock 객체를 생성해주는 메소드 ex) Person p = mock(Person.class); -> Person을 Mock 객체로 생성 when() : Mock 객체의 메소드 반환 값을 지정해주는 메소드 ex) when(p.getName()).thenReturn("min"); -> p.getName()이 호출되었을 때 min을 반환하도록 지정 verify() : Mock 객체에서 메소드가 호출 되었는지를 확인해주는 메소드 ex) verify(p).getName(); -> p.getName()이 ..

TIL 2024.02.21