데이터 관리
Docker로 Redis 설치하기
Docker로 Redis 설치하기
2021.12.17신규 서비스 개발환경 구성을 위해 AWS EC2에 Docker로 Redis를 설치했다. 사실 AWS ElastCache를 쓰면 오토스케일링이 가능하고 튼튼해서 좋은데, VPC 내에서만 접근이 가능하기 때문에 런칭 전까지는 EC2에서 Redis를 설치해서 사용하기로 했다. 도커 설치 $ sudo apt-get update && sudo apt-get upgrade // Set up Docker Repository $ sudo apt-get install apt-transport-https ca-certificates curl software-properties-common $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dear..
복합키 VS 대표 ID PK
복합키 VS 대표 ID PK
2021.08.31데이터를 식별하기 위해 키(PK)를 이용합니다. 복합키는 데이터를 대표하는 키가 여러 개의 컬럼으로 구성된 것을 의미합니다. 데이터를 더욱 효과적으로 찾기 위해 키에는 기본적으로 PK 인덱스가 생성됩니다. 인덱스는 키의 위치를 정리해둔 것으로 키가 등록/삭제 되었을 때 키의 위치 기록을 하는 수고를 감수하고, 조회할 때의 성능 이점을 얻기 위해 사용됩니다. 이때 PK를 대상으로 인덱스가 자동으로 생성되는데, 이것을 PK 인덱스라고 합니다. 복합키의 경우 조회 조건의 컬럼 조합에 따라 쿼리 성능이 많이 달라지게 됩니다. 복합키 내에서는 일반적으로 카디널리티가 낮은 순에서 높은 순으로 인덱스를 구성하면, 사용하는 쿼리에서도 무난하게 사용이 가능합니다. 하지만 상황에 따라 인덱스의 컬럼 순서를 변경하거나 추가..
Spring Data JPA Stream으로 대용량 데이터 조회하기 (100만 건 이상)
Spring Data JPA Stream으로 대용량 데이터 조회하기 (100만 건 이상)
2021.04.16Java 8 에서부터 제공되는 Stream을 Srping Data 1.8부터 지원하게 되면서, JPA를 통해 100만 건 이상의 대용량 데이터 효율적으로 조회할 수 있게 되었다. JPA가 Stream을 지원하기 이전에는 대용량 데이터 조회를 위해 아래와 같은 방법을 사용하였다. 이 포스팅은 하단 참고문헌에 링크해둔 글을 이해하고 학습하기 위해 의역하며 샘플코드를 작성하였다. 정확한 정보 슥듭을 확인하고 싶으신 분들은 아래 링크를 꼭 확인하도록 권한다. High-performance data fetching using Spring Data JPA Stream High-performance data fetching using Spring Data JPA Stream Java 8 has brought a nu..
DBCP(Database Connection Pool) 이해
DBCP(Database Connection Pool) 이해
2021.04.07Connection pool 이란? Connection pooling 은 데이터 접근 패턴 중 하나로, 주 목적은 데이터베이스 접속하여 작업하는 데에 과부하를 줄이는 것이다. 사용자의 요청에 따라 Connection을 생성하다 보면 동시에 많은 수의 연결이 발생했을 때 서버에 과부하가 걸리게 된다. 이러한 상황을 방지하기 위해 미리 일정수의 Connection 을 만들어 pool에 담아 뒀다가 사용자의 요청이 발생하면 연결을 해주고 연결 종료 시 pool 에 다시 반환하여 보관하는 것이다. DBMS로의 연결이 오래 걸리며 DB 작업을 할 때마다 Connection ~ Close 까지의 반복 작업이 비효율적이기 때문에 Connection pool에 Connection 객체를 생성해 놓고 DB 작업 시 po..
Mac OS 오라클 설치하기
Mac OS 오라클 설치하기
2021.02.28간단 요약 (모든 설치파일은 오라클 공홈 다운 가능) JDK 8 이상 설치 Oracle VM Virtual Box 다운로드 Oracle DB Developer VM 다운로드 및 실행(Oracle 접속) Virtual Box 접속 후 Oracle VM 실행(power off 상태) 맥북에서 oracle sql developer tool 설치 후 접속 발생한 에러 Mac에서 설치 시 DB connection 시 Locale 문제로 연결되지 않는 이슈 Mac Locale not recoginized 블로그를 통해 해결 설치 참고 문서 추천문서 : 공식문서보다 친절하며 다음스텝까지 안내되어 있음 공식문서 : 최소 요구 사양, 최신 정보 확인은 공식문서를 참고하는 것을 추천
JPA 자식 엔티티가 변경되지 않을 때 (feat. cascade)
JPA 자식 엔티티가 변경되지 않을 때 (feat. cascade)
2021.02.05cascade는 특정 Entity의 영속성 상태가 변경되었을 때 이를 연관된 Entity에도 전파시킬 지 선택하는 옵션이다. 특정 Entity에 @ElementCollecion으로 관리되던 하위 컬렉션이 @Entity로 변경되었는데 cascade 옵션이 함께 설정하지 않았다. 컬렉션은 기본적으로 부모 Entity와 한 쌍으로 움직이기 때문에 cascade 옵션이 없어도 부모 Entity와 함께 저장/삭제된다. (cascade 옵션을 ALL로 준 것 처럼 작동함) 하지만 Entity 간의 연관 관계에서는 기본적으로는 아무런 상태도 전이시키지 않기 때문에 연관을 설정할 때 cascade 옵션에 대해 고려해야한다. @ElementCollecion으로 관리할 때에는 부모 Entity를 통해 자식 테이블에 저장이..
JPA @ElementCollection
JPA @ElementCollection
2021.01.29RDB에는 컬렉션과 같은 형태의 데이터를 컬럼에 저장할 수 없기 때문에, 별도의 테이블을 생성하여 컬렉션을 관리해야한다. 이때 컬렉션 객체임을 JPA에게 알려주는 어노테이션이 @ElementCollection이다. JPA는 @Entity가 아닌 Basic Type이나 Embeddable Class로 정의된 컬렉션을 테이블로 생성하며 One-To-Many 관계를 다룬다. 아래에는 스터디그룹과 멤버 구성을 관리하는 Entity이다. 스터디 그룹에 대해 멤버는 1:N 관계로 구성되며, 멤버는 다양한 스터디 그룹에 참여할 수 있다. StudyGroup entity : Entity, 스터디 그룹을 관리 id : PK, 스터디 그룹을 대표하는 값 topicTags : Basic Collection, 스터디 주제 G..
[JPA Error] IllegalStateException: Multiple representations of the same entity
[JPA Error] IllegalStateException: Multiple representations of the same entity
2021.01.201:N 관계의 부모 Entity와 자식 Entity를 동시에 저장할 때 에러가 발생했다. error : java.lang.IllegalStateException: Multiple representations of the same entity 에러 메시지를 토대로 원인을 찾아보니 다음과 같은 Hibernate 이슈글을 발견했다. 원문은 하단 참고문서에 링크해두었다. Hibernate throws IllegalStateException when merging entity 'x' if it has references to 2 detached entities 'y1' and 'y2' (obtained from different sessions), and y1 and y..
Hibernate에서 제공되지 않는 DB 종속 함수 사용(mysql group_concat)
Hibernate에서 제공되지 않는 DB 종속 함수 사용(mysql group_concat)
2020.11.19Hibernate는 특정 데이터베이스에 종속되지 않고 객체지향스럽게 사용할 수 있도록 추상화해준다. 때문에 특정 DB에 종속된 함수(예를 들면 mysql의 group_concat)는 제공하지 않는다. 되도록 DB 확장성을 위해 특정 DB에 종속된 기능 사용은 고려해볼 필요가 있지만, 그 기능이 비즈니스 요구사항을 풀기에 적절하고 필요하다고 판단된다면 확장성에 너무 얽매일 필요는 없다고 생각한다. 물론 DB를 변경할 예정이라면 어차피 바꿔야 하니 사용하지 말자. 어쨌든 특정 데이터베이스에서만 제공하는 함수, 여기에서는 mysql group_concat을 사용하기 위해 Dialect를 확장하여 커스텀 SQL 함수를 등록해보자. CustomMysqlDialect 클래스 생성 import org.hibernat..
카디널리티와 복합키 순서 그리고 PK Index
카디널리티와 복합키 순서 그리고 PK Index
2020.10.12PK 복합키 순서에 따라 인덱스가 타지 않을 수 있다! JPA는 복합키를 생성할 때 컬럼명의 알파벳 순으로 생성한다. Entity Class에 정의된 순서로 생성되는 게 아니기 때문에 조회할 때 기대했던 PK Index가 타지 않을 가능성이 높다. 먼저 PK index 실행 조건에 대해 알아보겠다. PK 인덱스 실행 조건 (MySQL/Oracle) DB에 테이블을 생성할 때 PK Key 들에 대해서 자동으로 Index를 생성해준다. 이를 PK 인덱스라고 한다. 생성된 PK 순서대로 PK Index가 적용되기 때문에 큰 범위에서 작은 범위의 컬럼으로 나열하는 것이 좋다. 아래와 같은 테이블이 있을 때, 조회 조건에 어떤 PK컬럼을 매핑하느냐에 따라 옵티마이저가 PK Index를 탈지 말지 결정한다. PK ..
ORM 뉴비가 바라본 JPA 학습 방법
ORM 뉴비가 바라본 JPA 학습 방법
2020.09.13Springboot + JPA 조합의 시스템을 처음으로 개발하게 되면서 JPA를 어떻게 방식으로 접근해서 공부해야할지 생각해봤다. JPA, 엄밀히 말하면 ORM을 처음 만났을 때의 나의 모습이다. "웹어플리케이션이 실행될 때 마다 테이블을 매번 생성한다고?" (옵션 변경 가능) "단순히 DB 모델링을 @Entity class로 단순히 형상화한게 아니라 DB에 직접 관여하는 객체라고?" "아니, update가 auto commit이라고? commit 시점은 언젠데?" "아, transaction을 잘 설정해야하는구나. 근데 self Invocation에서는 안된다고ㅠㅠ?" (Spring AOP는 proxy기반이라 Self Invocation 상황에서는 proxy 객체를 가르키는게 아니라 this를 가르키기..
Elasticsearch 유사도 알고리즘(similarity) BM25과 TF/IDF
Elasticsearch 유사도 알고리즘(similarity) BM25과 TF/IDF
2020.05.16유사도 검색 - https://12bme.tistory.com/479?category=737765 Elasticsearch 버전 5.0부터는 _score 점수를 계산하는 기본 유사도 측정 알고리즘이 바뀌었다. TF/IDF(classic)에서 BM25로 바뀐 이유는, BM25가 검색의 정확도가 더 정교하다는 판단을 내렸을 것이다. [링크 : 왜 BM25가 더 정확한 지에 대한 내용] 하지만 각자 서비스하는 시스템이 다르기 때문에, 이 두 알고리즘이 어떤 차이가 있는지 알아야 더 적합한 알고리즘을 선택할 수 있을 것이라 생각한다. BM25와 TF/IDF의 차이점은 바로 아래에 써두었다. BM25와 TF/IDF의 차이점 단어의 빈도수 알고리즘 설명 TF/IDF common words can still infl..