전체 글 38

Spring Boot with DOCKER

목차 docker-compose를 이용하여 단일 어플리케이션 인스턴스 띄우기 docker-compose를 이용하여 멀티 어플리케이션 인스턴스 띄우기 및 컨테이너간 통신 docker 컨테이너 내부의 인스턴스에 디버그 모드 적용 필요 기술 docker docker-compose gradle 예제 repository https://github.com/rtef23/boot-with-docker docker-compose를 이용하여 단일 어플리케이션 인스턴스 띄우기 프로젝트 디렉토리는 다음과 같이 구성해두었다. 루트 프로젝트 하위에 하위 모듈로 A라는 스프링부트 프로젝트를 생성하였고 이를 docker를 이용하여 인스턴스를 띄워보고자 한다. 해당 A모듈을 docker로 실행하기 위한 docker-compose.ym..

DOCKER 2021.07.01

[DDD Start] 2.1. 아키텍처 개요 (영역 관계)

아키텍처는 크게 4가지 영역으로 구분이 가능하다. 표현 응용 도메인 인프라스트럭처 웹 어플리케이션에서의 표현 영역은 Http 요청과 같은 방식을 통해 사용자로부터 요청을 인입 받게되고, 해당 요청을 응용 영역에서 요구하는 형식으로 변환하여 응용 영역에 전달하게 된다. @RestController @RequiredArgsConstructor public class ProductController { private final InvestmentService investmentService; private final ModelMapper modelMapper; @PostMapping("/v1/products/{productId}/investments") public void addInvestment( @Pat..

DDD 2021.06.15

GC(Garbage Collection)

Java Garbage Collection 용어 설명 stop-the-world GC를 실행하기 위해서 JVM이 애플리케이션 실행을 멈추는 것. stop-the-world가 발생하게 되면 GC를 실행하는 쓰레드를 제외한 나머지 쓰레드는 모두 작업을 중단하고 GC 작업의 완료를 기다리게 된다. GC의 수행 방식 GC는 두가지 전제 조건(weak generational hypothesis)하에 맞추어 설계되었다. 대부분의 객체는 접근 불가능 상태(unreachable)가 된다. 오래된 객체에서 젊은 객체로의 참조는 아주 적게 존재한다. 위의 가설의 장점을 최대한 활용하기위해 GC의 HotSpot VM은 크게 2가지 공간으로 나누어지게 되었다. Young Generation 새롭게 생성한 객체의 대부분이 Yo..

JAVA 2021.04.29

DDD vs Transaction Script

DDD와 Transaction Script를 비교한 글을 발견?하여 정리하는 용도로 글을 작성해보았다. Application Design 방식 DDD 방식과 Transaction Script 방식이 존재 두 방식 모두 잘못된 방식은 아니며, 두 방식중 어느 방식을 사용할지는 비즈니스 로직의 복잡성과 연관이 있다. (단순 query를 하고 조회를 하는 작업에서 도메인 모델을 사용하는 것은 불필요하게 복잡하다. 이 경우, domain layer를 제거하여 infrastructure layer를 직접 호출 하는 것이 좋다.) (over-engineering의 위험 부담 때문에, 복잡한 비즈니스 로직을 해결하기 위해서 transaction script 방식을 사용하는 것은 좋지 않다. transaction sc..

DDD 2021.04.08

[DDD Start] 1. 도메인 모델

도메인 모델 패턴 사용자 인터페이스(; Presentation, 표현 계층) 사용자의 요청을 처리하고 사용자에게 정보를 보여주는 영역 사용자는 소프트웨어를 사용하는 사람 뿐만 아니라 외부 시스템이 될 수도 있다. 응용(; Application) 사용자가 요청한 기능을 실행 비즈니스 로직을 직접 구현하지 않으며 도메인 계층을 조합하여 기능을 실행 도메인(; Domain) 시스템이 제공할 도메인의 규칙을 구현 더보기 example) 주문 도메인의 경우, 출고 전에 배송지를 변경할 수 있다. 의 도메인 규칙이 있는 경우, 해당 규칙을 구현한 도메인은 아래와 같이 구현할 수 있다. public class Order { private OrderState state; private ShippingInfo shipp..

DDD 2021.04.06

조인 수행 원리(NL, Hash, Sort Merge)

NL Join(Nested Loop Join) 중첩된 반복문과 유사한 방식으로 조인을 수행 선행 테이블에서 주어진 조건을 만족하는 행을 하나씩 접근하며 추출된 값으로 후행 테이블에 조인 작업을 수행 반복문의 외부에 있는 테이블을 선행 테이블(=외부 테이블)이라 하고 내부에 있는 테이블을 후행 테이블(=내부 테이블)이라 한다. 수행 방식 선행 테이블에서 주어진 조건을 만족하는 첫번째 행을 찾음 (인덱스를 이용할 수 있는 경우, 인덱스를 사용하여 엑세스 할 수 있음) 선행 테이블에서 찾은 행의 조인 컬럼을 가지고 후행 테이블에 존재하는지 확인 후행 테이블의 인덱스에서 해당 조인 값이 존재하는지 확인 인덱스에서 추출한 레코드 식별자를 이용하여 후행 테이블에 엑세스 및 조인이 성공하는 경우, 추출 버퍼에 저장 ..

DB 2021.04.02

HTTP 메소드와 멱등성

멱등성(idempotent)이란? 연산을 여러번 적용하더라도 결과가 달라지지 않는 성질 ( Non-Idempotent; 비멱등적) HTTP 메소드에서의 멱등성이란? 연산을 여러 번 수행하더라도 서버의 상태가 그대로인 경우, 해당 연산은 멱등적이다. (아닌 경우, 비멱등적이다.) HTTP 메소드 정리 OPTIONS request URI에 의해 구분되어진 request/response에서 사용가능한 통신 옵션을 반환하는 HTTP 메소드 request URI가 asterisk("*")의 경우, 특정 리소스의 통신 옵션을 반환한다기보다는 일반적인 서버의 통신 옵션을 반환 멱등적(idempotent)이다. TRACE 리모트 서버의 application-layer의 loopback을 확인하기 위해서 사용되는 HTT..

WEB 2021.03.22

Request 처리 방법(WebFlux VS MVC)

리액티브 프로그래밍이란? 데이터를 처리 할 때, non-blocking, asynchronous, event-driven 한 접근 방식을 가진 프로그래밍 패러다임 "reactive" 는 데이터의 변화에 반응하도록 구축된 프로그래밍 모델을 의미한다. publisher-subscriber(observer pattern)으로 구현 non-blocking code에서 중요한 점으로는 back pressure(controls of the rate of events)이다. (너무 많은 producer가 destination의 처리 성능을 넘어선 event를 생성하지 않도록 하는 것) Spring Web Flux 어떠한 thread도 wait 상태로 대기하지 않는다. 일반적으로는 request를 받는 1개의 requ..

Spring 2021.03.18

Optimistic Lock vs Pessimistic Lock

DBMS MySQL Storage Engine Inno DB 문제 정의 UPDATE T SET value = :value WHERE id = 1 위와 같이 T 테이블의 값을 수정하는 쿼리가 있는 경우, 여러 트랜잭션에서 해당 쿼리를 실행한다면 id가 1인 row의 값으로는 가장 마지막으로 commit 실행된 트랜잭션에서 수정한 값이 들어가게 된다. (아래의 경우, transaction2에서 실행한 update의 경우, transaction1에서 commit을 수행하기 전까지 block되어 있게 된다. - innoDB row level exclusive lock) # transaction 1 start transaction; # 1 update T # 2 set value = 200 where id = 1..

DB 2021.03.18

[JPA] 28. 기타(다형성 쿼리, 엔티티 직접 사용, Named 쿼리, 벌크 연산)

프로젝트 git url github.com/rtef23/JpaStudy 필요 1. docker 2. docker-compose 프로젝트 정보 mysql : 5.7 - docker image java : 1.8 다형성 쿼리 TYPE 조회 대상을 특정 자식으로 한정 //Item 중에 Book, Movie를 조회해라 //[JPQL] SELECT i FROM Item i WHERE TYPE(i) IN (Book, Movie) //[SQL] SELECT i FROM Item i WHERE i.DTYPE IN ('B', 'M') TREAT (JPA 2.1) 특정 타입의 자식을 대상으로 하는 쿼리 //[JPQL] SELECT i FROM Item i WHERE TREAT(i as Book).author = 'kim'..

JPA 2021.02.16