분류 전체보기
-
N+1 문제란? 그리고 해결방법 (feat. fetch join)개발/JPA & Hibernate 2021. 7. 18. 15:19
N+1 문제란? 객체 조회(1회)의 결과로 n개의 결과가 나온다고 했을 때, 조회된 객체안에 또 다른 객체가 있을 수 있다. 그렇다면 객체안의 객체를 조회하기 위해 또 다른 쿼리가 발생하는 경우가 있는데, 그러면 처음 조회된 n개의 결과만큼 새로운 쿼리가 발생한다. 즉, 첫 조회 1회 + 첫 조회 결과 n개 만큼의 결과가 증가하는 현상을 놓고 n+1 문제라고 한다. JPA에서 N+1 문제 해결 Fetch Join 사용 가장 일반적인 방법이다. Fetch Join에 관한 설명은 이 글 마지막에 정리했다. 애초에 사용될 데이터라면 지연로딩을 하지않고, 첫번째 쿼리때 Fetch Join 해서 가져오는 것이 좋다. Fetch Join에서도 설명하겠지만, Join이 아닌 Fetch Join의 차이는 Project..
-
JPA의 쓰기지연 기능 확인해보기 (transactional write-behind)개발/JPA & Hibernate 2021. 7. 16. 19:00
JPA의 특징중 하나는 영속성 컨텍스트 (Persistence Context)내에서 쓰기지연(transactional write-behind)이 발생한다는 것입니다. 이 글에서는 JPA와 Mybatis를 이용해 쓰기지연을 했을때와 안했을 때를 비교해보려고 합니다. (Mybatis는 쓰기지연을 하지 않습니다.) 쓰기지연이란? (transactional write-behind) 영속성 컨텍스트에 변경이 발생했을 때, 바로 데이터베이스로 쿼리를 보내지 않고 SQL 쿼리를 버퍼에 모아놨다가, 영속성 컨텍스트가 flush 하는 시점에 모아둔 SQL 쿼리를 데이터베이스로 보내는 기능입니다. 사전 지식 - 영속성 컨텍스트는 동일성(Identity)를 보장한다. - 영속성 컨텍스트는 1차 캐시의 역할을 한다. 즉 객체..
-
스트링을 new 로 생성하는 것과 " " 로 생성하는 것의 차이개발/Java 2021. 7. 13. 01:06
" "로 생성한 스트링의 경우 문자열이 힙 영역에 존재하는 String Pool에 상수로서 저장되고 그 값을 꺼내씁니다. 동일한 문자열이 반복적으로 사용될 때, 문자열을 새로 생성하지 않고 String Pool에서 기존에 존재하는 상수를 꺼내옴으로써 메모리를 절약합니다. 💡 String Pool은 java6 까지는 Non-heap Area에 속한 PermGen에 위치했는데, Java7 부터 heap 으로 이동하였습니다. 반면 new로 생성한 스트링은 다른 객체들처럼 heap 영역에 객체로서 생성됩니다. 아래 테스트를 통과합니다. @Test void StringPool에서_동일한_문자열을_가져온다() { String hello1 = "hello"; // string pool String hello2 = "..
-
주소 DB 로딩 (+ 반복되는 쿼리를 스크립트로 한번에 생성)프로젝트/BLUE DELIVERY 2021. 7. 11. 17:35
목적 프로젝트를 진행하면서 주소DB를 활용할 일이 있었는데, 이 과정에서 하드코딩(?)의 어려움과 팀원이 같은 환경을 구성하는데 어려움을 겪을 수도 있다는 점이 문제점으로 다가왔습니다. 그래서 이 문제를 해결한 과정을 공유하기 위해 작성하였습니다. 개요 배달어플 프로젝트를 진행하다가 주소 정보가 필요해졌습니다. 유저가 카테고리를 선택하면 지정한 주소로 배달이 가능한 가게들을 보여줘야 합니다. 그런데 String 타입으로 주소를 저장하면 같은 이름의 구나 동이 존재하면 구분이 불가능하며 띄어쓰기 하나로 다른 주소가 될수 도 있습니다. 검색해본 결과 이미 여기서 주소관련 데이터베이스를 제공하고 있었습니다. 우선 저에게 필요한 것은 다음과 같습니다. 배달가능지역을 표시하기 위해 '동' 단위의 주소를 구별할 수..
-
카테고리에 캐시를 적용한 경험프로젝트/BLUE DELIVERY 2021. 7. 11. 13:28
배달의민족 서버를 클론하는 프로젝트에서 카테고리를 구현하던 중 ENUM을 통해 카테고리를 관리할지, DB에 저장하여 관리할지 고민했던 적이 있었습니다. 대략 다음의 순서로 정리했습니다. 캐시 적용 전 모습 문제점 캐싱이 적합한가? 캐시 종류 Scale-out 확장시 캐싱 데이터의 정합성 문제 로컬캐시 Eventual Consistency 캐시 적용 전 모습 (ENUM) 기존에 카테고리는 아래와 같이 enum 클래스로 관리하였습니다. public enum Category { KOREAN(1L), CHINESE(2L), JAPANESE(3L), CHICKEN(4L), PIZZA(5L), FAST_FOOD(6L); .... } enum을 관리할 경우 장점과 단점을 생각해보면 장점으로는 자바 코드만 보고 어떤 ..
-
Eventual Consistency 란개발/OOP, Design Pattern 2021. 7. 11. 13:22
Eventual Consistency 분산 시스템을 구성하려면 CAP 이론에 의해서 일관성과 가용성 중 하나를 포기해야하는 상황이 올 수 있습니다. 클라이언트의 요청을 받았을 때, A서버의 데이터가 변경되면 즉시 다른 서버에 반영되지 않습니다. 아래 두가지 경우가 있습니다. 모든 서버가 동일한 데이터를 갖도록 동기화 하는동안 클라이언트의 접근을 막는 경우 (가용성의 문제) 다른 클라이언트들이 변경된 데이터를 요청했을 때 어떤 클라이언트는 최신의 데이터를, 어떤 클라이언트는 오래된 데이터를 받게되는 경우.(일관성의 문제) 그러나 2번의 경우 언젠가는 동기화가 되면, 모든 클라이언트가 동일한 데이터를 받아볼 수 있게 됩니다. 이것이 Eventual Consistency 입니다. Eventual consist..
-
인덱스데이터베이스 2021. 7. 11. 13:18
인덱스가 무엇인지, B-Tree Index, Hash Index 등에 대해 알고있다는 가정하에 작성 인덱스는 왜 쓰는가? 인덱스는 '인덱스가 검색 범위를 제한시켜주기 때문에' 빠르게 데이터를 검색할 수 있게 해준다. 인덱스가 왜 어떻게 검색 범위를 제한해주나? 인덱스는 항상 정렬이 되있기 때문에 라고 생각할 수 있지만, 그건 특정 인덱스에 한정된 이야기다. 검색범위를 제한해주는 방법은 어떤 인덱스를 사용하느냐에 따라 달라진다. B-Tree 인덱스 B-Tree 인덱스는 항상 정렬된 상태를 유지한다. (장점) 항상 정렬된 상태를 유지하기 위해서는 삽입과 삭제시에 정렬이 발생한다. (단점) 이 경우는 정렬된 상태로 검색 범위를 제한시킬 수 있는게 맞다. Hash Index 해시 인덱스는 정렬되어 있다고 볼 수..
-
Select 쿼리는 S락이 아니다. (X락과 S락의 차이)데이터베이스 2021. 7. 11. 13:10
이 글에서 사용한 dbms는 MySQL 8.x 버전이고 innoDB engine 기준입니다. 아~주 기본적인 레벨, 거의 시작점 수준의 이야기이니 감안해주세요. 이 글을 쓰게된 이유 저는 Real MySQL을 통해 DB를 공부하던 중 S-Lock 과 X-Lock에 대해 알게 되었습니다. 그리고 SELECT - FOR UPDATE 쿼리는 해당 레코드의 X-lock을 획득한다는 사실도 알게되었고, 이 사실을 이용해 직접 실습을 해보던 중 저의 뇌가 꼬이기 시작했습니다. '1번 트랜잭션에서 A레코드의 X-Lock을 획득했으니 B트랜잭션에서는 A레코드를 읽을 수 없어야 하지. 1번 트랜잭션의 작업이 끝날때 까지 2번 트랜잭션의 SELECT는 대기상태가 되겠군...?' '아니... 조회가 왜 돼?😯' S-Lock..