DB 41

[MongoDB] 스키마 모델링 기법

개요 기존 게시물(https://jaimemin.tistory.com/2332)에서도 언급했다시피 MongoDB의 스키마가 자유로운 것은 맞으나 관련 없는 데이터들끼리 하나의 컬렉션에 모을 경우 관리도 힘들고 성능 저하를 야기하기 때문에 어느 정도의 모델링은 필요합니다. [MongoDB] MongoDB 개요 개요 현재 진행하고 있는 프로젝트에서는 관계형 데이터베이스와 cache 목적으로 사용하는 Redis만 사용하고 있습니다. 아무래도 agile 방법론을 도입하여 개발을 진행하다 보니 데이터베이스 스키 jaimemin.tistory.com 또한, 하나의 document 사이즈가 최대 16MB로 제한되어 있기 때문에 경우에 따라서 MongoDB 철학인 "data access together, stays t..

DB/MongoDB 2023.12.08

[MongoDB] 인덱스

인덱스 관계형 데이터베이스처럼 인덱스로 지정한 필드 키를 정렬된 상태로 저장하는 Object입니다. 기본적으로 자주 조회되는 필드는 인덱스로 지정하는 것이 좋으나 인덱스를 많이 지정할수록 데이터를 입력할 때마다 후처리로 정렬을 진행해야 하므로 Write 성능이 떨어진다는 단점이 있습니다. 정리하자면 인덱스를 지정하면 Read 성능은 올라가지만 Write 성능이 떨어지는 trade-off 관계이므로 인덱스를 시스템 요구사항에 맞게 적절히 설정할 필요가 있습니다. MongoDB에서 제공하는 인덱스 MongoDB의 장점 중 하나는 아래 나열한 것처럼 다양한 인덱스를 제공한다는 것입니다. Single Field Index: 단일 필드에 부여하는 인덱스 Compound Index: 여러 필드에 부여하는 인덱스 M..

DB/MongoDB 2023.12.01

[MongoDB] Read/Write 제어

Read Preference 읽기 요청 트래픽 분산 및 쓰기 요청 처리하는 primary 멤버 부하 방지를 위한 옵션 종류 Read Preference 종류는 총 5가지가 있으며 앞서 설명했다시피 주목적이 Read 요청 트래픽 분산 및 Write 요청 처리하는 primary 멤버 부하 방지이기 때문에 주로 secondary 혹은 secondaryPreferred로 설정합니다. primary: 무조건 primary 멤버로 읽기 요청 primaryPreferred: 가능하면 primary 멤버로 읽기 요청을 보내고 없으면 secondary 멤버에 요청 secondary: 무조건 secondary 멤버로 읽기 요청 secondaryPreferred: 가능하면 secondary 멤버로 읽기 요청을 보내고 없으면..

DB/MongoDB 2023.11.29

[MongoDB] MongoDB 개요

개요 현재 진행하고 있는 프로젝트에서는 관계형 데이터베이스와 cache 목적으로 사용하는 Redis만 사용하고 있습니다. 아무래도 agile 방법론을 도입하여 개발을 진행하다 보니 데이터베이스 스키마가 지속적으로 변경하는데 제공하는 기능으로 데이터 export/import가 있다 보니 스키마가 변경될 때마다 소스 코드를 직접 수정하고 변경된 DB 스키마를 local, staging, dev 그리고 prod 환경에 모두 반영해야 하는 애로사항이 발생했습니다. 이에 따라 저희 팀에서는 schema가 비교적 자유롭고 고가용성과 수평 확장이 용이한 MongoDB를 도입하는 것을 고려 중이고 내년부터 도입할 것 같아 이 게시물을 통해 MongoDB에 대해 간단히 알아보도록 하겠습니다. SQL vs NoSQL Mo..

DB/MongoDB 2023.11.26

[용어 정리] DAO, DTO, VO, Mapper, Repository, Entity

개요 회의에 들어가면 저를 포함해서 DAO와 Repository, DTO와 VO를 혼용해서 사용하는 사람들이 많습니다. 이번 기회에 위 용어들의 개념을 정리하면서 차이점을 명확하게 짚고 가고자 합니다. * 출처에 남긴 블로그 및 유튜브를 많이 참고했습니다. 보다 자세한 내용은 출처를 확인해 주시면 감사하겠습니다! Entity DB 테이블을 표현하는 객체 (실제 DB와 매핑되는 객체) DB 테이블 내 모든 칼럼을 필드로 갖는 클래스로 비즈니스 로직을 갖는 메서드를 선언 가능 엔티티의 가장 큰 특징은 식별자를 가진다는 것 식별자 외 필드 데이터가 변경된다고 하더라도 식별자는 동일하기 때문에 해당 객체가 다른 객체가 되는 것은 아님 후술 하겠지만 VO와 Entity의 차이점은 Entity의 경우 식별자가 있지..

DB/개념 정리 2023.11.06

[JPA] Hibernate MultipleBagFetchException

개요 JPA 쿼리를 통해 엔티티를 불러올 때 두 개 이상의 @OneToMany 관계를 갖는 엔티티를 함께 EAGER LOADING 할 때 아래와 같은 오류 메시지가 발생했습니다. 저 같은 경우 위와 같이 @OneToMany 관계가 다수인 엔티티를 FETCH JOIN을 통해 한 번에 불러오려고 할 때 MultipleBagFetchException 예외가 발생했습니다. * SampleInput과 SampleOutput을 모두 fetch type EAGER로 변환한다고 해도 동일한 에러가 발생합니다.) 원인 위와 같은 예외가 발생하는 원인을 파악하기 위해서는 우선 Bag의 정의를 살펴봐야 합니다. Bag은 중복된 요소를 허용하는 순서가 없는 컬렉션(MultiSet)이며 Java Collection에서는 Ba..

DB/JPA 2023.06.28

[JPA] 준영속(Detached) 상태 엔티티 수정하는 방법

개요 약 2년 전에 영속성 컨텍스트에 대해 정리했었습니다. https://jaimemin.tistory.com/1898 [JPA] PersistenceContext 간단 정리 개요 이번 게시글에서는 JPA 내부 구조 및 동작 방식을 파악하는데 중요한 개념인 PersistenceContext(영속성 컨텍스트)에 대해 알아보겠습니다. 1. EntityManagerFactory & EntityManager JPA 내부 구조를 살펴보 jaimemin.tistory.com 이후로는 주로 MyBatis가 적용된 프로젝트를 개발하여 JPA에 소홀하다가 최근에 JPA를 적용한 프로젝트를 개발하게 되어 복습을 진행하고 있습니다. 이번 게시글에서는 준영속 상태인 엔티티와 관련하여 중요한 개념인 변경 감지와 병합에 대해 정..

DB/JPA 2023.05.07

[DB] 트랜잭션과 DB Lock 정리

데이터를 DB에 저장하는 이유: 트랜잭션 서비스를 개발하면 자연스럽게 데이터를 데이터베이스에 저장하게 되는데 한 번쯤은 아래와 같은 의문이 들 때가 있습니다. 데이터를 파일에 저장할 수도 있지 않을까? DB를 사용하는 여러 가지 이유가 있겠지만 그중 대표적인 이유는 데이터베이스가 트랜잭션이라는 기능을 지원하기 때문입니다. 트랜잭션은 직독직해하자면 거래라는 뜻이고 해당 기능은 아래에 열거할 ACID 원칙을 따르기 때문에 데이터 정합성 및 안전성을 보장해줘야 합니다. 원자성(Atomicity): 트랜잭션 내에서 실행할 작업들은 마치 하나의 작업인 것처럼 모두 성공하거나 모두 실패하도록 처리 일관성(Consistency): 모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지하며 DB에서 정한 무결성 제약 조..

DB/개념 정리 2023.03.20

[DB] Connection Pool 정리

기존에 작성한 JDBC 정리글을 먼저 읽고 오시면 내용을 이해하는데 도움이 될 것 같습니다. https://jaimemin.tistory.com/2266 JDBC 정리 JDBC란? JDBC(Java Database Connectivity)는 Java에서 DB에 접속할 수 있도록 하는 자바 API입니다. 시중에 다양한 DB가 존재하는데 각각의 데이터베이스마다 연결하는 방법, SQL을 전달하는 방법, 그리고 응답 jaimemin.tistory.com Connection Pool 데이터베이스에 연결을 할 때는 아래와 같이 복잡한 과정을 거쳐야 합니다. 비즈니스 로직이 JDBC 드라이버를 통해 커넥션을 조회 JDBC 드라이버는 DB와 TCP/IP 연결을 진행 (3 way handshake) TCP/IP 연결되면..

DB/개념 정리 2023.03.20

[DB] JDBC 정리

JDBC란? JDBC(Java Database Connectivity)는 Java에서 DB에 접속할 수 있도록 하는 자바 API입니다. 시중에 다양한 DB가 존재하는데 각각의 데이터베이스마다 연결하는 방법, SQL을 전달하는 방법, 그리고 응답을 받는 방법이 모두 상이하므로 기존에는 개발자들이 새로운 DB를 사용할 때마다 위 과정을 새로 학습하며 코드를 수정해야 했습니다. 이러한 애로사항 때문에 JDBC라는 자바 표준이 생겼고 이를 통해 개발자들은 아래의 장점을 얻을 수 있었습니다. DB 변경할 때마다 DB 접근하는 코드를 수정하는 대신 추상화된 JDBC 인터페이스 의존하여 개발 JDBC 표준 인터페이스만 학습하면 학습한 내용을 수십 개의 데이터베이스에 동일하게 적용 가능 JDBC는 대표적으로 아래와 같..

DB/개념 정리 2023.03.17