JPA-DDD 2 (readonly로 관계 맺기 / N+1 / ...)

readonly?

  • department - line 관계를 맺고싶을때?

  • 어떤 department가있다. 이department가 포함된 market - factory의 어떤 생산 line에서 제품을만든다

  • 강결합정도에 따라

    • 상호 참조 하지않고 service에서 로직으로 연관데이터 조합
    • readonly로 데이터 참조
    • read & write가능 (-> 지양하기, 하위 도메인취급이 되어버림)
  • 보수적으로 설계 -> 필요할때 하나씩 열어주는 방식으로 고려하면 :+1:

Read more

JPA-DDD 1 프로젝트 시작하기 - 1

시작하기전에


DDD / JPA기반의 프로젝트를 처음 도입하며 고민한 내용을 모아보았습니다.

모든 예제를 자세하게 다루지는 않습니다.
구체적인 예시보다는 방향성을 중점으로 봐주시면 감사하겠습니다.
같이 작업한 전OO님과 많은 의논을하며 공부했습니다. 감사합니다

의존성

1
2
3
4
5
dependencies {
...
compile("org.springframework.boot:spring-boot-starter-data-jpa")
...
}

DOMAIN 모델링 - 방향설정하기 ★★★★

  • 방향을 잘못정하면 관계가 복잡해진다 -> DDD의 의도와 맞지않음
  • 책임 관계가 모호해진다
  • ….
  • 자세한 권한설정및 방향은 뒤에서 다룸.

예제

공장에서 만든 제품을 매장공급한다고 가정

Read more

QueryDsl 적용 가이드 (SpringBoot-gradle-멀티모듈-JPA)

spring boot2.x / gradle /jpa 환경을 가정하였습니다.

//TODO : 자세한설명추가

Plugin 추가하기

멀티모듈 프로젝트로 가정했습니다
상위 프로젝트에서 플러그인을 셋팅했습니다.

build.gradle (멀티모듈 상위 에다가 셋팅함)

1
2
3
4
5
6
7
8
9
10
ext {
springBootVersion = '2.0.5.RELEASE'
querydslPluginVersion = '1.1.7' //이부분
}
...

dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
classpath("gradle.plugin.com.ewerk.gradle.plugins:querydsl-plugin:${querydslPluginVersion}")
}
Read more

spring - multiple implements : interface - 인터페이스의 구현체를 동적으로 선택하는 방법

동기

본 글은 interface 란? spring 주입받아 사용하기 에서 이어집니다.

동적으로 구현체를 선택하는 방법을 알아보자

여러 판매자가 판매하는 상품을 장바구니에 담고 결제를 하였다고 가정해보자.
각 판매자에게 구입 요청을 해야할것이다.

이때 판매자에게 할수 있는 행위들이 interface로 정의되어있고, 실제로 요청해야하는 판매자에 따라서 구현체를 바꾸어야한다면?? 어떻게 될까? 예시를 확인해보자

ex)

1
2
3
라면 + 노트북을 장바구니에넣고 한번에 주문 -> 내부적으로는 오뚜기 / LG전자에 구매 요청을 해야야한다
주문, 주문취소, 환불이라는 행위자체는 동일하지만 요청해야하는 도메인정보등 세부정보는 다를것이다
그리고 이공통점을 판매자라는 인터페이스로, 달라지는 세부적인 부분을 오뚜기/LG전자라는 구현체로 구현했다면?

각 판매자에 해당하는 구현체를 선택하여 요청 로직을 실행해야할것이다.

Read more

대용량 데이터 다운로드시 oom 방지 가이드

웹서비스를 하다보면 데이터를 조회하고, 그데이터를 일괄 다운로드하는 니즈가 생긴다.(특히 어드민)
이런경우 서버 성능에따라 oom(out of memory)이 발생할 수 있다.
자주 생기는 상황으로는 대량의 데이터를 조회한 다음, 이를 엑셀파일로 내려받는경우가 있다.
이 경우를 예시로 원인과 해결법을 알아보고자 한다.

원인

  1. db에서 데이터를 가지고와서 객체로 들고있는 단계에서 OOM
  2. workbook을 생성해 데이터체우다가 OOM
  3. 메모리에 담고있는것을 전송하는 단계까지 메모리를 계속 holding! - OOM 확률 up!

개선포인트

A. db에서 한번에 가지고오는 데이터 크기(fetch size)를 조절한다
B. db에서 가지고온 데이터를 통체로 들고있지 않고 나누어 처리한다.
C. 엑셀에 내용을 체우다가 일정 사이즈 이상 되면 Disk에 쓰도록 한다 (기존에도 되어있음)
D. 임시파일은 바로바로 삭제하도록한다 (삭제를 명시적으로 하지 않으면 tomcat 내려갈때 삭제됨. 강제종료시는 삭제 안될 가능성)
E. 다운로드 중복클릭 방지

Read more

Maven Profile 을 통해 설정 관리하기 / Spring profile

필요성

아주 작은 프로젝트, 절대로 변하지 않을 프로젝트라면 상관없다.

하지만 단순히 서비스를 어느서버에서 하느냐, 디비를 어느것을 이용하느냐, 인증을 어디것을 사용하느냐에 따라 코드를 바꿔야 한다.
자주 바뀌는 코드, 코드말고 다른 의존성에 의한 설정값 등의 셋팅이 코드에 있다면 어떤 일이 발생할까? 기존값을 주석처리하고 원하는 값으로 수동으로 바꾸는등 수작업이 필요하며 이런 데이터가 많을수록 작업 효율이 떨어진다.

  • maven profile
  • spring profile

두가지를 활용해 원하는 리소스를 활용하는 방법에 대해 알아보자.

Read more