전체 글 361

DDD - 응용 서비스 제대로 구현하기!

해당 포스팅은 "도메인 주도 개발 시작하기" 라는  내용을 정리한 글입니다. 해당 도서는 아래 Link에서 확인할 수 있습니다. - http://www.yes24.com/Product/Goods/108431347 표현 영역과 응용 영역 도메인 영역을 잘 만들었어도 도메인이 제 기능을 하려면 사용자와 도메인을 연결해주는 매개체가 필요하다. 응용 영역과 표현 영역은 사용자와 도메인을 연결해 주는 매개체 역할을 한다. 표현 영역은 사용자의 요청을 해석한다. 해석된 메시지를 이용해서 사용자가 실행하고 싶은 기능을 제공하는 것은 응용 서비스가 담당한다. 즉, 실제 사용자가 원하는 기능을 제공하는 것은 응용 영역에 위치한 서비스이다. 응용 서비스의 역할 응용 서비스는 사용자(클라이언트)가 요청한 기능을 실행한다..

Programming/DDD 2022.06.23

Spring - JpaRepository와 Querydsl 연결하기! (사용자 정의 리포지토리)

우리는 자바 스프링으로 웹 서버를 개발할 때 Spring Data JPA와 QueryDSL을 동시에 사용하게 된다. 문제는 JpaRepository는 인터페이스이고, QuerydslRepository는 클래스이다. 그래서 흔히 아래의 두 클래스를 따로 구현하곤 한다. UserJpaRepository UserQuerydslRepository 이를 해결하기 위한 방법을 알아보자. 사용자 정의 리포지토리 사용자 정의 리포지토리를 사용하면 이런 문제를 해결할 수 있다. 사용자 정의 리포지토리는 다음과 같이 사용한다. 사용자 정의 인터페이스 생성 (상속 X) 사용자 정의 인터페이스 구현 JpaRepository에 사용자 정의 인터페이스 상속 Class Diagram으로 아래와 같이 표현할 수 있다. 구현 먼저..

Server/Spring 2022.06.18

Effective Java - 빌더 패턴 안전하게 사용하기 (+Use Lombok)

점층적 생성자 패턴 점층적 생성자 패턴은 필수 매개변수만 받는 생성자를 만들고, 선택 매개변수가 더 필요할 때마다 추가로 생성자를 구현하는 방식이다. 점층적 생성자 패턴은 안전하게 객체를 생성할 수 있다는 장점이 있다. public class NutritionFacts { private final int servingSize; private final int servings; private final int calories; private final int fat; private final int sodium; public NutritionFacts(int servingSize, int servings, int calories, int fat) { this.servingSize = servingSize..

Language/Java 2022.06.18

DDD - JPA를 이용한 Repository, Entity 매핑 제대로 구현하기!

해당 포스팅은 "도메인 주도 개발 시작하기" 라는  내용을 정리한 글입니다. 해당 도서는 아래 Link에서 확인할 수 있습니다. - http://www.yes24.com/Product/Goods/108431347 모듈 위치 리포지터리 인터페이스는 애그리거트와 같이 도메인 영역에 속하고, 리포지터리를 구현한 클래스는 인프라스트럭처 영역에 속한다. 이는 DIP에 따라 리포지터리의 구현체를 인프라스트럭처 영역에 위치시켜서 인프라스트럭처 영역이 도메인 영역을 의존하도록 한다. Spring Data JPA 스프링 데이터 JPA는 다음 규칙에 따라 작성한 인터페이스를 찾아서 해당 인터페이스의 구현체 프록시를 빈으로 등한다. org.springframwork.data.repository.Repository 인터..

Programming/DDD 2022.06.16

SpringBoot - 프로퍼티를 안전하게 가져오는 방법!

개발을 하다보면 클래스에서 프로퍼티(Properties)를 가져오는 일이 종종 생긴다. 더 효율적이고 안전한 방법에 대해 알아보자. 예제를 위한 application.yml 상태는 다음과 같다. directory: root-path: /app/ temp-path: /temp/ @Value 가장 간단하게 값을 주입받는 방식이다. @Value 애노테이션에 프로퍼티 경로를 적으면 값이 주입된다. @Getter public class DirectoryProperties { @Value("${app.directory.root-path}") private String rootPath; @Value("${app.directory.temp-path}") private String tempPath; } 이 방식은 간단하..

Server/Spring 2022.06.14

Spring Boot - Chaos Monkey를 활용한 운영 이슈 테스트!

이번 포스팅에선 카오스 엔지니어링을 할 수 있게 도와주는 라이브러리 Chaos Monkey For Spring Boot (CM4SB)에 대해 알아보자. 카오스 엔지니어링 아무리 훌륭한 기업이라도 운영 중인 어플리케이션에 장애 발생은 불가피하다. 이는 자주 접하는 장애일 수도 있고 뜬금없는 장애일 수도 있다. 이러한 장애를 미리 테스트해서 방지하거나 대책을 찾는 것을 카오스 엔지니어링이라고 한다. 카오스 엔지니어링 툴은 로컬에서는 경험하기 힘든 아래와 같은 이슈를 미리 확인해 볼 수 있는 툴이다. 네트워크 지연 서버 장애 디스크 오작동 메모리 누수 Chaos Monkey For Spring Boot (CM4SB) 란 ? Chaos Monkey For Spring Boot (CM4SB)란 Netflix에서..

Server/JUnit, Spock 2022.06.11

Spring Boot - 커넥션 풀 상태 확인하기!

Spring Boot 2.0 이상에서는 DBCP(DataBase Connection Pool) 구현체를 default로 HikariCP를 사용하고 있다. 다음의 HikariCP의 프로퍼티를 수정해서 현재 커넥션풀의 상태를 확인할 수 있다. application.properties logging.level.com.zaxxer.hikari=TRACE logging.level.com.zaxxer.hikari.HikariConfig=DEBUG application.yml logging: level: com.zaxxer.hikari: TRACE com.zaxxer.hikari.HikariConfig: DEBUG 결과 아래와 같은 로그를 확인하는 것이 가능하다. 예제 앱에서는 데이터 소스를 4개 사용하고 있다. 하..

Server/Spring JPA 2022.06.11

Apache JMeter란 무엇인가? (+ 사용 방법 with 성능 및 부하 테스트)

Apache JMeter Apache JMeter는 서버가 제공하는 성능 및 부하를 측정할 수 있는 테스트 도구이다. JMeter는 순수 Java 애플리케이션 오픈소스이며 서버나 네트워크 또는 개체에 대해 과부하를 시뮬레이션하여 강도를 테스트하거나 다양한 부하 유형에서 전체 성능을 분석하는 데 사용할 수 있다. 비슷한 부하테스트 도구로는 Apache Benchmark, Ngrinder, Pinpoint, Gatling등이 있다. 다음은 Apache JMeter가 가진 특징을 나열한 것이다. 다양한 프로토콜/서버를 테스트할 수 있다. 웹 - HTTP, HTTPS SOAP / REST 웹 서비스 FTP 데이터베이스 (JDBC 사용) Mail (SMTP, POP3, IMAP) ... CLI 지원 CI 또는 C..

DDD - 애그리거트(Aggregate)를 잘 사용하는 방법들!

해당 포스팅은 "도메인 주도 개발 시작하기" 라는  내용을 정리한 글입니다. 해당 도서는 아래 Link에서 확인할 수 있습니다. - http://www.yes24.com/Product/Goods/108431347 애그리거트 온라인 쇼핑몰 시스템을 개발할 때 다음 그림과 같이 상위 수준의 개념을 이용해서 전체 모델을 정리하면 전반적인 관계를 이해하는데 도움이 된다. 아래 그림을 보면 주문은 회원, 상품, 결제와 관련이 있다는 것을 쉽게 파악할 수 있다. 다음은 상위 수준 모델을 개별 객체 단위로 다시 그린 것이다. 해당 그림은 상위 수준에서의 개념 이해 없이 도출하려면 시간이 더 오래 걸린다. 더 많은 코드를 보고 도메인 전문가와 더 많은 대화를 나눠야 비로소 상위 수준에서 모델 간의 관계가 이해되기 ..

Programming/DDD 2022.06.09

JUnit - TestContainers 사용하는 방법! (+ 장단점 비교)

CI / CD 자동화된 테스트 내가 회사에서 개발하는 서비스의 DB 환경은 아래와 같다. test 환경에서는 어떤 DBMS를 사용할 수 있는가? prod, stage -> mysql 5.7 dev -> mysql 5.7 test -> ? test 환경에서 h2 데이터베이스를 많이 사용한다. 이 경우 CI/CD에서 h2 데이터베이스를 사용해서 자동화된 테스트를 어렵지 않게 할 수 있다. 문제는 h2와 mysql은 다른 부분이 적잖게 존재한다. 가령 격리 수준, 전파 속성, 지원하는 SQL 등 차이점이 많이 존재한다. 실제 운영환경과 유사하게 테스트하기 위해서는 test용 db도 mysql로 실행해야 한다. 그래서 고민을 하게 된다. 로컬에서는 도커나 로컬DB를 띄워서 테스트할 수 있지만 CI/CD의 자동화..

Server/JUnit, Spock 2022.06.06