분류 전체보기 38

백준 1655. 가운데를 말해요

https://www.acmicpc.net/problem/1655 1655번: 가운데를 말해요 첫째 줄에는 백준이가 외치는 정수의 개수 N이 주어진다. N은 1보다 크거나 같고, 100,000보다 작거나 같은 자연수이다. 그 다음 N줄에 걸쳐서 백준이가 외치는 정수가 차례대로 주어진다. 정수는 -1 www.acmicpc.net import java.io.BufferedWriter import java.io.OutputStreamWriter import java.util.* fun main(args: Array) { val BufferedWriter = BufferedWriter(OutputStreamWriter(System.out)) val maxQueue = PriorityQueue(Collection..

algorithm 2023.01.13

백준 12865. 평범한 배낭

https://www.acmicpc.net/problem/12865 12865번: 평범한 배낭 첫 줄에 물품의 수 N(1 ≤ N ≤ 100)과 준서가 버틸 수 있는 무게 K(1 ≤ K ≤ 100,000)가 주어진다. 두 번째 줄부터 N개의 줄에 거쳐 각 물건의 무게 W(1 ≤ W ≤ 100,000)와 해당 물건의 가치 V(0 ≤ V ≤ 1,000) www.acmicpc.net import kotlin.math.max val bags = ArrayList() fun main(args: Array) { val (n, k) = readln().split(" ").map { it.toInt() } repeat(n) { val (w, v) = readln().split(" ").map { it.toInt() } ..

카테고리 없음 2023.01.13

이벤트(Event), CQRS (Command Query Responsibility Segregation)

이벤트 쇼핑몰에서 구매를 취소하면 환불을 처리해야 한다. 이때 환불 기능을 실행하는 주체는 Order 도메인 엔티티가 될 수 있는데, 도메인 객체에서 환불 기능을 실행하려면 환불 기능을 제공하는 도메인 서비스를 파라미터로 받고 취소 도메인 기능에서 도메인 서비스를 실행하게 된다. public class Order { public void cancel(RefundService refundService) { verifyNotYetShipped(); this.state = OrderState.CANCELD; this.refundStatus = State.REFUND_STARTED; try { refundService.refund(getPaymentId()); this.refundStatus = State.RE..

DDD 2023.01.10

도메인 모델과 바운디드 컨텍스트

도메인 모델은 여러 하위 도메인으로 구분되기 때문에 한 개의 모델로 여러 하위 모델을 표현하려고 시도하면 오히려 모든 하위 도메인에 맞지 않는 모델을 만들게 된다. 예를들어 상품이라는 모델을 생각해보면, 카탈로그에서 상품, 재고 관리에서 상품, 주문에서 상품, 배송에서 상품은 이름만 같지 실제로 의미하는 것은 다르다. 카탈로그에서의 상품은 상품 이미지, 상품명, 상품가격과 같은 상품 정보가 위주라면, 재고 관리에서는 실존하는 개별 객체를 추적하기 위한 목적으로 사용한다. 또 논리적으로 같은 존재처럼 보이지만 하위 도메인에 따라 다른 용어를 사용하는 경우도 있다. 카탈로그 도메인에서의 상품이 검색 도메인에서는 문서로 불리기도 한다. 비슷하게 시스템을 사용하는 사람을 회원 도메인에서는 회원이라고 부르지만, ..

DDD 2022.12.27

Vue 라이프사이클

MVVM 패턴은 View, View Model, Model로 구성되어 있다. View는 View Model을 알지만, View Model은 View를 알지 못한다. 또 View Model은 Model을 알지만, Model은 Vew Model을 알지 못한다. 이런 구조를 통해 UI로부터 비즈니스 로직과 프레젠테이션 로직을 분리할 수 있다. View : View의 역할은 UI에 관련된 것을 다룬다. View Model : View Model의 역할은 View가 사용할 메서드와 필드를 구현하고, View에게 상태 변화를 알린다. View Model에서 제공하는 메서드와 필드가 UI에서 제공할 기능을 정의하지만, View에 의해 이 기능을 어떻게 보여줄 것인지 결정한다. Model : Model은 비즈니스 로직..

front-end 2022.12.26

응용 서비스와 표현 영역

표현 영역은 사용자의 요청을 해석한다. 사용자가 웹 브라우저에서 폼에 ID와 암호를 입력한 뒤에 전송 버튼을 클릭하면 요청 파라미터를 포함한 HTTP 요청을 표현 영역에 전달한다. 요청을 받은 표현 영역은 URL, 요청 파라미터, 쿠키, 헤더 등을 이용해서 사용자가 실행하고 싶은 기능을 판별하고 그 기능을 제공하는 응용 서비스를 실행한다. 실제 사용자가 원하는 기능을 제공하는 것은 응용 영역에 위치한 서비스다. 사용자가 회원 가입을 요청했다면 실제 그 요청을 위한 기능을 제공하는 주체는 응용 영역에 존재한다. 응용 서비스는 기능을 실행하는데 필요한 입력 값을 메서드 인자로 받고 실행 결과를 리턴한다. 응용 서비스의 메서드가 요구하는 파라미터와 표현 영역이 사용자로부터 전달받은 데이터는 형식이 일치하지 않..

DDD 2022.12.13

리포지터리와 모델 구현

데이터 보관소로 RDBMS를 사용할 때, 객체 기반의 도메인 모델과 관계형 데이터 모델 간의 매핑을 처리하는 기술로 ORM이 쓰이는데, 그 중 자바 ORM 표준인 JPA를 이용해 리포지터리와 애그리거트를 구현하는 방법에 대해 알아보자 리포지터리 인터페이스는 애그리거트와 같이 도메인 영역에 속하고, 리포지터리를 구현한 클래스는 인프라스트럭처 영역에 속한다. 가능하면 리포지터리 구현 클래스를 인프라스트럭처 영역에 위치시켜서 인프라스트럭처에 대한 의존을 낮추는게 좋다. 아래와 같은 기능을 제공하는 리포지터리를 살펴보자 ID로 애그리거트 조회 애그리거트 저장 두 메서드를 위한 리포지터리 인터페이스는 다음과 같은 형식을 갖는다. public interface OrderRepository { Order findBy..

DDD 2022.12.01

애그리거트

1. 애그리거트 온라인 쇼핑몰 시스템을 개발할 때 아래와 같이 상위 수준 개념을 이용해서 전체 모델을 정리하면 전반적인 관계를 이해하는데 도움이 된다. 만약 백 개 이상의 테이블을 하나의 ERD에 모두 표시하면 개별 테이블 간의 관계를 파악하느라 큰 틀에서 데이터 구조를 이해하는 데 어려움을 겪을 수 있다. 도메인 객체 모델이 복잡해지면 개별 구성요소를 위주로 모델을 이해하게 되고 전반적인 구조나 큰 수준에서 도메인간의 관계를 파악하기 어려워진다. 주요 도메인 요소 간의 관계를 파악하기 어렵다는 것은 코드를 변경하고 확장하는 것이 어려워진다는 것을 의미한다. 상위 수준에서 모델이 어떻게 엮어 있는지 알아야 전체 모델을 망가뜨리지 않으면서 추가 요구사항을 모델에 반영할 수 있는데, 세부적인 모델만 이해한 ..

DDD 2022.11.13