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 boot 예제 - 웹 프로젝트 만들기

spring boot 예제

spring boot를 이용하여 웹페이즈를 만드는 샘플 프로젝트를 소개하려한다.

작업한 소스코드 예시는 github에 공유하고있습니다.
https://github.com/HyeonGuJ/demo-spring-boot-web

spring bootspring에서 작업했던 설정들을 보다 쉽게 할 수 있고, 첫 페이지를 만들기까지 시간이 오래걸리지 않는다. spring initializr를 통해 원하는 기능들을 조합하고 IDE를 통해 페이지를 띄우는것까지 진행해보자.

시간이 없다면 3. 프로젝트 생성하기로 넘어가세요.

spring initializr를 통해 프로젝트 생성

spring initializr는 spring으로 application을 만들기 시작할때 필요한 의존성을 자동으로 셋팅하여 구조를 잡아주기 때문에 application을 처음 만들때 사용하면 매우 좋다.

Read more

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

동기

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

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

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

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

ex)

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

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

Read more

Spring boot - local tomcat 에서 ssl 설정하

동기

최근 chrome80 의 cookie 정책변경으로 저자가 서비스하는 모든 서비스들을 https로 운영하기로 했다. 관련 이슈는 여기 (https://hyeonguj.github.io/2020/02/05/chrome80/ ) 에 정리하였다.

기존에는 local환경과 개발서버에서는 http로 통신을 하며 작업을 하였으나 바뀐 정책에서 쿠키를 읽기위해서는 https로 서비스를 해야한다.

개발서버의 경우 apache나 nginx에서 모두 http -> https로 바꾸어주며, 인증서 처리가 되어있기때문에 문제가 되지 않는다. 하지만 local 환경의 경우 tomcat 또는 spring boot application에서 https로 서비스를 할 수 있어야 테스트가 가능하다.

Read more

spring-boot - logback profile 설정하기, 설정전략 (logback-spring.xml)

logback

지난포스트 에서 logback의 기본적인 설정에 관하여 다루었다.
이번 포스팅에서는 logback-spring.xmlprofile로 설정을 나누는 방법, 그리고 그 전략에 대해 다룬다.

logback-spring.xml

spring에서 logback은 설정파일을 아래와같은 순서로 찾는다.

  1. logback.groovy
  2. logback-test.xml
  3. logback.xml
  4. default

spring-boot의 경우 조금 다르게 logback-spring.xml이라는 이름으로 설정한다.
logback.xml 으로 설정하면 spring-boot 가 설정되기전에 로그백설정을 완료한다. 따라서 spring-boot에서 사용하는 properties 나 profile같은 설정값을 사용할 수 없게된다.

profile에 따라 로그설정

기본적인 logback.xml에 관한 설정은 logback 기본설정 포스팅에서 다루고 profile 설정에 관해 알아보자.

필자는 크게 console에 로깅, file에 로깅, 그리고 logstash로 로그를 전송하는 3가지 설정을 하였다.
그리고 profile별로 아래와같이 나누었다.

phase에 따라서 proflies를 나누는 경우에는 아래와같이 설정 할 수 있다

Read more

Spring-boot 주기적으로 코드 실행하기 @Scheduled

스프링 부트에서 일정 시간 주기적으로 작업하는 스케쥴러를 만들어보려고 한다

@EnableScheduling 추가하기

  • @EnableScheduling 주석은 응용 프로그램의 스케줄러를 활성화하는 데 사용된다
  • 기본 스프링 부트 애플리케이션 클래스 파일에 추가해야 한다
1
2
3
4
5
6
7
@SpringBootApplication
@EnableScheduling
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
Read more

spring boot 2.x + jsp +gradle 내장톰켓 셋팅하기

프로젝트 구성 개요

  • jsp를 쓸수밖에 없는 프로젝트에서 gradle을 이용하여 war로 build 후 java -jar app.war 를 사용하여 프로젝트를 띄울수 있게 하는것이 주 목적이다.

  • spring boot 프로젝트러 jar패키징후 내장 톰켓을 사용하는 방식으로는 jsp 를 view template으로 사용할수 없다.

  • 이 셋팅이 필요없는 케이스.

    • 굳이 jsp를 쓰지않아도 되는 경우. war셋팅도 필요없으니 기존 jar 배포구조로 구성하면된다.
    • 내장tomcat을 쓰지않는경우. war로 패키징하여 외부 톰켓을 이용하면 되므로 bootRun, bootWar셋팅까지 할 필요는 없다.

실제로는 프로젝트를 마이그레이션 하는 과정에서 발생한 트러블 슈팅 과정을 정리한 산출물입니다.
본 내용에서는 마이그레이션 과정이 아닌 셋팅만 기술하겠습니다.(결과물위주)

Read more