본문 바로가기

Database & ORM

(12)
MongoTemplate으로 Aggregation 사용하기 Map-Reduce MongoDB의 Document를 다른 형태로 Mapping하는 것을 Map 이라고 한다. Document나 Mapping한 데이터 내 여러 값을 취해 합계나 평균 등을 만드는 작업을 Reduce라고 한다. 이렇게 Doucment의 데이터를 매핑하고 취합하는 것을 Map-Reduce 작업이라고 한다. Aggregation MongoDB에서는 MapReduce보다 향상된 Aggregate라는 기능을 제공한다. aggregate는 일종의 리눅스와 비슷한 pipeline을 가지면 각 단계별로 진행을 마친 후에 result을 가져오게 된다. 아래와 같은 순서로 pipeline을 진행한 후에 결과값을 가져오게 된다. collection > $project > $match > $group > $..
MongoDB에서 JPA 상속 관계 설정 - @Inheritance, @DiscriminatorColumn, @DiscriminatorValue 결론부터 말하자면, - MongoDB에서 JPA의 상속관계 설정인 @Inheritance, @DiscriminatorColumn, @DiscriminatorValue는 적용되지 않는다. - JAVA로 MongoDB에서 데이터 조회할 때, 자식 클래스 중 어떤 클래스와 매핑할 지 결정하는 것은 Document 내 저장되어 있는 _class이다. _class는 JAVA에서 데이터 저장 시, Document에 자동으로 같이 저장된다. - _class로 구분하기 때문에, 자식 클래스의 클래스명은 변경하면 안된다. 변경 시, 기존 저장된 데이터를 매핑해서 가지고오지 못한다. - @TypeAlias를 이용해 _class에 들어갈 값을 정해줄 수 있다. JPA 상속관계 설정 JPA에서 상속 관계는 부모 엔터티에 @I..
MongoDB 선택 이유 및 MongoDB에서 RDB+MongoDB로 변경 회사 이직한지 1개월 째, 화주와 포워더 간 물류 플랫폼 서비스인 ZIMGO 개발에 참여하게 되었다. ZIMGO에서 서류함을 개발하게 되었는데, 서류함은 Packing List, Commercial Invoice 등 수/출입에 필요한 문서를 유저가 생성 및 관리하는 기능이었다. MongoDB 선택 이유 서류함 개발에 MongoDB를 사용하기로 했는데, 이유는 문서의 특징 때문이었다. - 문서의 종류가 여러가지이다. (비정형 데이터) - 검색할 때는 여러 종류의 문서가 함께 조회되어야 한다. - RDB로 하면 하나의 문서를 조회할 때, 여러 테이블 간의 복잡한 Join이 필요하다. - 문서마다 데이터 형태가 다르므로, 테이블 설계가 어렵다. - 반면, MongoDB는 문서의 내용 전체를 JSON으로 저장할..
9. 스프링 데이터 JPA 적용 스프링 데이터 JPA 스프링 데이터 JPA는 스프링 프레임워크에서 JPA를 편리하게 사용할 수 있도록 지원하는 프로젝트이다. Repository에서 지루하게 반복되는 CRUD를 처리하기 위해 공통 인터페이스를 제공한다. Repository를 개발할 때 인터페이스만 작성하면, 실행 시점에 스프링 데이터 JPA가 구현 객체를 동적으로 생성해서 주입해준다. 아래와 같이 JpaRepository를 상속받은 Interface를 구현해주면 아래와 같은 구현체를 실행 시점에 스프링 데이터 JPA가 생성해서 주입해준다. 따라서 개발자가 직접 구현체를 개발하지 않아도 된다. JpaRepository 스프링 데이터 JPA는 간단한 CRUD 기능을 공통으로 처리하는 JPA Repository를 제공한다. JpaReposiz..
8. 도메인, 객체 지향, 비즈니스 로직 어디서 비즈니스 로직을 처리해야 할까? 서비스가 아니라 도메인에서 비즈니스 로직을 처리해야 한다. JPA로 Domain을 사용하기 이전에, 비즈니스를 처리하는 곳은 Service 계층이었다. 이러한 방식을 트랜잭션 스크립트라고 한다. 트랜잭션 스크립트 모든 로직이 Service 클래스 내부에서 처리 된다. 그러다 보니 서비스 계층이 무의미하며, DAO로 값을 전달하는 VO 객체는 단순히 데이터 덩어리 역할만 하게 된다. 객체 지향적 개발이라기 보다는 절차지향적인 개발에 가깝게 볼 수 있다. @Transactional public Order cancelOrder(int orderId) { //1) 데이터베이스로부터 주문정보 (Orders), 결제정보 (Billing), 배송정보 (Delivery) 조회 O..
7. Querydsl 적용 JPQL과 Querydsl JPQL은 JPA에서 제공하는 가장 중요한 객체지향 쿼리 언어이다. JPQL 특징 테이블이 아닌 객체를 대상으로 검색하는 객체지향 쿼리다. SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않는다. 예를 들면 아래의 select문과 같다. Item이란 테이블이 아니라, Item 객체를 대상으로 검색한다. Querydsl은 JPQL을 편하게 작성할 수 있게 도와주는 JPQL 빌더 역할을 한다. 오픈 소스이므로 라이브러리를 설치해야 한다. Querydsl 라이브러리 Gradle로 설치 build.gradle에 아래 부분을 추가해준다. implementation 'com.querydsl:querydsl-jpa' annotationProcessor "com.querydsl:que..
6. Join, Fetch, Cascade, 연관 관계 주인 도메인 모델과 테이블 도메인 모델 주문 정보(Order)에는 주문한 고객(Member), 배송 정보(Delivery), 주문한 상품 목록(OrderItem List)가 있다. 또한 주문 상태 (OrderStatus)와 주문 날짜(Date)도 있다. Order과 Item은 다대다 관계이다. Order은 여러 Item을 주문할 수 있고, Item은 여러 Order에 쓰일 수 있다. 다대다 관계를 일대다, 다대일 관계로 바꿔주기 위해 Order_Item이라는 연결 테이블 을 사용한다. OrderItem이라는 도메인을 만들어 연결 엔터티로 사용한다. OrderItem은 주문한 상품으로 Order와 Item을 갖고 있다. 또한 주문한 가격 (orderPrice)와 주문한 상품 개수(count)도 정보로 갖고 있다..
5. JPA 상속 관계 매핑, Enum 사용 도메인 모델과 테이블 Entity에선 Item을 Album, Book, Movie가 상속받는다. 상속 전략으로 하나의 테이블 전략을 사용하여 Album, Book, Movie 정보 모두 Item 테이블에 저장된다. DTYPE으로 Album, Book, Movie를 구분한다. 참고로, 상속 전략에는 아래와 같이 조인 전략도 있다. 조인 전략은 저장 공간을 효율적으로 사용하지만, 조회할 때 조인을 많이 사용하므로 하나의 테이블 전략보단 속도가 느리다. 추천하지 않지만, 아래와 같이 클래스마다 테이블 전략도 있다. Domain 부모 Entity @Inheritance 부모 엔터티에 선언한다. strategy로 상속 전략을 선택한다. SINGLE_TABLE: 단일 테이블 전략 JOINED: 조인 전략 TABLE..
4. Spring 웹 계층 및 CRUD 기능 구현 Spring 웹 계층 Web Layer 흔히 사용하는 컨트롤러(Controller)와 JSP/Freemarker 등의 뷰 템플릿 영역이다. 이외에도 필터(@Filter), 인터셉터, 컨트롤러 어드바이스(@ControllerAdvice) 등 외부 요청과 응답에 대한 전반적인 영역을 의미한다. Service Layer @Service에 사용되는 서비스 영역이다. 일반적으로 Controller와 Dao의 중간 영역에서 사용된다. @Transactional이 사용되어야 하는 영역이기도 하다. Repository Layer Database와 같이 데이터 저장소에 접근하는 영역이다. Dao(Data Access Object) 영역이라고 생각하면 된다. Dtos Dto(Data Transfer Object)는 계층 ..
3. Spring Data JPA 를 이용해 기본 도메인 Entity 생성 도메인 모델과 테이블 설계 김영한 저자의 '자바 ORM 표준 JPA 프로그래밍' 11 챕터의 기능들을 구현했다. 도메인 모델 테이블 설계 Domain 엔터티 생성 Member를 등록, 조회, 수정 하는 기능을 만들기 위해, Member Entity를 만든다. @Entity @Entity @Entity를 선언하면 DB에 있는 테이블과 매핑된다. @Table(name="테이블명")으로 지정해주지 않으면 클래스 이름의 테이블과 매핑한다. Entity 클래스에는 Setter 메서드를 만들지 않고, 만들더라도 updateAddress처럼 명확한 목적을 나타내야 한다. Entity는 기본 생성자가 필수다. 따라서 @NoArgsConstructor로 기본 생성자를 만들어주었다. @ID 컬럼을 PK로 설정한다. @Ge..