전체 글 64

Fetch Join(2) - xToOne과 xToMany의 차이

xToOne Fetch Join우리가 기존에 알고있던 Fetch Join이다.  xToMany Fetch JoinxToOne 패치 조인과 다르게 부작용이 생긴다.1. 페이징이 불가능하다. 만약 페이징을 설정하게 되면 모든 데이터를 DB에서 읽어오고 메모리에서 별도로 페이징을 해버린다. 이렇게되면 OutOfMemory 오류가 터질 수 있다. 위험하므로 사용하지 말아야한다. 페이징은 성능에 뛰어난 성능을 보이고 현업에서 많이 사용하므로 xToMany 관계에서는 패치 조인을 쓰면 안되겠다.(페이징이 불가한 이유는 ToMany 관계는 조회 row 수를 늘리기 때문이다. 조회한 데이터에 같은 id의 데이터 수가 많으면 페이징하기 곤란하기 때문이다.) 2. 컬렉션 패치 조인은 1개만 사용할 수 있다. 2개 이상부터..

Java/JPA 2024.08.27

OSIV(OpenSessionInView)

OpenSessionInView (기본값 true)JPA에서는 EntityManager로 DB 커넥션을 유지하지만 JPA의 전신인 Hibernate에서는 Session으로 유지하기에 이름이 이렇게 붙었다.  True true인 경우, 최초의 DB 커넥션 시작 시점부터 API 응답이 끝날 때까지 영속성 컨텍스트와 DB 커넥션을 유지한다. 그래서 OSIV 설정을 따로 변경안했을 때 View Template이나 Controller에서 지연로딩이 가능했던 것이다(1차 캐시 유지). 하지만 현업에서는 이를 False로 막아놓는다. 이유가 뭘까? 그 이유는 API에 블록킹이나 연결이 길어지는 이슈가 생긴다면 DB 커넥션 리소스가 말라버리기 때문이다. 실시간 트래픽이 중요한 애플리케이션에서는 커넥션 리소스가 부족해질..

Java/JPA 2024.08.27

그거 아셨나요? - WHERE와 HAVING의 차이

WHERE와 HAVING은 둘다 조건을 달 수 있는 조건절입니다.그렇다면 WHERE와 HAVING 둘다 아무 조건을 달 수 있는 것 아닌가 하실 수 있는데 차이가 있습니다. WHERE1. 개별 행에 대해 필터링합니다.2. 그룹화(GROUP BY) 이전에 적용됩니다.3. 집계 함수(SUM, MAX, COUNT 등)을 사용할 수 없습니다. HAVING1. 그룹화 이후에 적용됩니다.2. 그룹화한 결과에 대해 필터링합니다.3. 집계 함수를 사용할 수 있습니다. HAVING절이 그룹화 이후에 필터링을 하기 때문에 그룹화 이전에 필터링되어 그룹화를 진행하는 WHERE절에 비해 덜 효율적일 수 있습니다. 그리고 HAVING절은 그룹화를 한 뒤 필터링이 되기 때문에 그룹화 이후 필터링할 수 있는 조건만 다는 것이 좋습..

DB/SQL 2024.08.26

Fetch Join(1) - 개요 및 Join과의 차이점

Fetch Join은 N+1문제를 해결하고 성능을 향상시킬 수 있는 기능이다. 오늘은 어떻게 Fetch Join이 성능을 향상시키는지 알아보자. 우선 Fetch Join에 대해서 정리하고 가야할 것이 있는데 Fetch Join은 DB에서 지원하는 기능이 아닌 JPA의 JPQL에서 제공하는 기능이다. 그렇다면 Join에서 어떤 것이 부족해서 Fetch Join이라는 함수를 따로 만들었을까? 이는 객체와 테이블을 맵핑하려는 데에서 파생된 문제에서 시작되었다. 아래와 같은 Member와 Team이라는 테이블이 있다고 하자.  Member는 Team과 다대일의 관계를 가지고 있다. 만약 Member 전체를 조회하는 JPQL을 짠다면 Team의 ID, 이름, 나이가 영속성 컨텍스트에 저장되고 Team 엔티티는 조..

Java/Spring 2024.08.20

(Java) 백준 2263 트리의 순회

트리의 순회 이진 트리의 인오더와 포스트오더가 주어졌을 때, 프리오더를 구하는 문제이다.인오더는 중위 순회를, 포스트오더는 후위 순회를, 프리오더는 전위 순회를 의미한다.중위 순회는 left -> root -> right 순으로 순회,후위 순회는 left -> right -> root 순으로 순회,전위 순회는 root -> left -> right 순으로 순회하는 것이다. 이 문제는 중위 순회와 후위 순회의 특징을 이용해 트리의 구조를 파악하여 푸는 문제이다.중위 순회와 후위 순회의 공통 부분은 left부터 순회를 시작하는 것. 즉, 순회 시작부분은 둘이 같다. 후위 순회의 경우 가장 마지막 순회 노드가 루트 노드이고,중위 순회는 루트노드가 왼쪽 트리와 오른쪽 트리를 나누는 중간 노드이므로,후위 순회를 ..

알고리즘 2024.08.14

프로그래머스 SQL (SELECT 문제) 서울에 위치한 식당 목록 출력하기

https://school.programmers.co.kr/learn/courses/30/lessons/131118 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr 식당의 정보를 담은 REST_INFO 테이블과 식당의 리뷰 정보를 담은 REST_REVIEW 테이블이 주어진다. 테이블에서 서울에 위치한 식당들의 식당 ID, 식당 이름, 음식 종류, 즐겨찾기수, 주소, 리뷰 평균 점수를 조회하는 문제이다. 이때 리뷰 평균점수는 소수점 세 번째 자리에서 반올림 해야하고, 결과는 평균점수를 기준으로 내림차순 정렬해야하고, 평균점수가 같다면 즐겨찾기수를 기준으로 내림차..

DB/SQL 2024.08.13

그거 아셨나요? - Reflection과 기본 생성자가 필요한 이유

reflection이란?자바의 기능 중 하나로 프로그램 런타임(실행) 중에 자신의 구조와 동작을 검사하고 수정할 수 있게 하는 기능입니다.주로 Spring, Hibernate 프레임워크와 같은 객체관리 시스템에서 런타임 중에 엔티티 클래스의 구조를 분석하고 스프링 빈으로 등록하거나 데이터베이스 조회 결과를 객체에 매핑하는데 사용됩니다.  Spring, JPA가 reflection을 사용할 때 기본 생성자가 필요합니다.Spring에서는 IoC 컨테이너를 통해 bean을 관리합니다. 이 과정에서 reflection을 사용하여 bean을 인스턴스화하고 의존성을 주입합니다.JPA는 데이터베이스에서 데이터를 로드하거나 새로운 인스턴스를 생성할 때 사용됩니다.이 인스턴스를 생성하고 관리할 때 구조를 파악하기 위해 ..

Java/Spring 2024.08.10

Intellij 인텔리제이 live template 만들기

코딩을 하다보면 중복으로 작성되는 코드가 매우 많다.Entity라던지, Test 코드라던지 등등이 경우 Intellij 측에서 제공하는 템플릿 뿐만 아니라 나만의 템플릿을 만들면 좋을텐데라고 한번쯤 생각해봤을 것이다. live template은 본인이 원하는 템플릿을 지정한 명령어로 불러올 수 있는 기능이다. 사용 방법을 알아보자.  1. File -> Settings에 들어간다.  2. Settings에서 live template을 검색한다.  3. Java를 선택한 뒤 상단에 +버튼을 눌러 Live Template을 선택  4. Abbreviation에는 템플릿을 불러올 명령어 이름, Description에는 Live Template 설명, Template text에는 템플릿을 작성해준다.  5. 하..

Java 2024.08.07

트랜잭션(@Transaction) (2) - 트랜잭션 옵션

트랜잭션 옵션value, transactionManager코드로 직접 트랜잭션을 적용할 경우 트랜잭션 매니저를 주입받아서 사용해야 했다. 어노테이션으로 트랜잭션을 적용할 때도 동일하게 지정해줘야 한다. 다만 이 값이 생략되었을 경우 기본으로 등록된 트랜잭션 매니저를 사용하기 때문에 대부분 생략하여 사용한다.트랜잭션 매니저를 별도로 지정해주는 경우는 사용하는 트랜잭션 매니저가 둘 이상이어서 구분할 때 보통 사용한다.public class TxService { @Transactional("memberTxManager") public void member() {...} @Transactional("orderTxManager") public void order() {...}}  rollbackFor예외 발..

Java/Spring 2024.08.07

트랜잭션(@Transaction) (1) - 트랜잭션의 개요 및 프록시 내부 호출 문제

트랜잭션이란?데이터베이스의 상태를 변화시키기 해서 수행하는 작업의 단위를 뜻한다. 메소드에 트랜잭션을 적용시키면 메소드가 수행하는 작업의 단위가 된다. 메소드 실행 중에 생기는 쿼리들은 프록시 객체에 저장되고 완료되면 기존 객체와 변화한 점을 확인 후 데이터베이스에 한꺼번에 커밋한다.   스프링 트랜잭션 사용 방식 선언적 트랜잭션 관리 vs 프로그래밍 방식의 트랜잭션 관리선언적 트랜잭션 관리 : @Transaction 어노테이션 하나만 선언해서 트랜잭션을 적용하는 것프로그래밍 방식의 트랜잭션 관리 : 트랜잭션 매니저 또는 트랜잭션 템플릿 등을 사용해서 트랜잭션 관련 코드를 직접 작성하는 것  프로그래밍 방식의 트랜잭션 관리를 사용하게 되면 애플리케이션 코드가 트랜잭션 코드와 강하게 결합된다.그리고 선언적..

Java/Spring 2024.08.06