[SpringBoot] AbstractAggregateRoot로 DomainEvent 발행하기
·
Java,Kotlin,SpringBoot
DDD에서 AggregateRoot와 Domain Event란?도메인 주도 개발(Domain-Driven Design)에는 애그리거트(Aggregate)라는 단위로 도메인을 관리한다.애그리거트는 복잡한 도메인을 관리하기 쉬운 단위로 분리한 것인데 이커머스를 예로 들면 상품이 하나의 애그리거트, 리뷰가 하나의 애그리거트가 될 수 있다.애그리거트는 다른 애그리거트에 관여하지 않고, 생성되고 변경되는 이유가 각자 다르다.AggregateRoot애그리거트는 여러 개의 모델로 이루어져 있을 수 있다. 이 때, 여러개의 모델을 한 번에 관리하는 주체를 AggregateRoot라고 한다.애그리거트의 내부를 변경하기 위해서는 오직 애그리거트 루트만 가능하며, 한 트랜잭션에서는 한 개의 애그리거트만 수정해야 한다.Dom..
[LeetCode] Longest Cycle in a Graph
·
알고리즘/LeetCode
문제https://leetcode.com/problems/longest-cycle-in-a-graph/난이도: Hard토픽: DFS, Graph, Topological sorting그래프가 주어지면 그래프 내의 사이클중 제일 길이가 긴 사이클 길이를 구하는 문제이다. 접근방법그래프에서 사이클을 감지하는 가장 간단한 알고리즘으로 Floyd의 거북이 & 토끼 알고리즘이 있다. Floyd의 거북이 & 토끼 알고리즘거북이와 토끼를 시작점에 놓고 거북이는 한 번에 1칸 움직이고, 토끼는 한 번에 2칸 움직인다.그래프에 사이클이 있다면 토끼와 거북이는 어느 한 지점에서 반드시 만나게 된다.사이클을 감지하는 건 알겠는데, 어떻게 하면 사이클의 길이를 측정할 수 있을까?위의 그래프에서 거북이와 토끼는 4번 이동하여 노..
[LeetCode] Minimum Size Subarray Sum
·
알고리즘/LeetCode
문제문제: https://leetcode.com/problems/minimum-size-subarray-sum/description/난이도: Medium토픽: Array, Binary Search, Sliding Window, Prefix Sum모든 요소가 양수인 배열 nums와 양수 target이 입력으로 주어지고, nums의 서브 배열들 중 서브 배열의 모든 요소를 더한 값이 target보다 크거나 같은 가장 작은 길이의 서브배열을 구하는 문제이다.풀이각 구간사이의 합을 구하는 것이므로 누적합을 사용하면 서브 배열마다 매번 덧셈 연산을 해줄 필요가 없다.아래의 예제와 같이 누적합을 구해주면 각 구간사이의 합은 쉽게 구할 수 있다.[2,3,1,2,4,3] # 입력[0,2,5,6,8,12,15] ..
[LeetCode] Validate Binary Search Tree
·
알고리즘/LeetCode
문제트리가 주어지면 이 트리가 정말 Binary Search Tree가 맞는지 판단하는 문제이다.98.Validate Binary Search TreeBinary Search TreeBST는 아래와 같은 조건을 모두 만족하는 트리이다.해당 노드의 왼쪽 서브 트리의 값은 모두 해당 노드의 값보다 작아야한다.해당 노드의 오른쪽 서브 트리의 값은 모두 해당 노드의 값보다 커야한다.왼쪽 서브 트리, 오른쪽 서브 트리 모두 BST이다.접근 방법처음에는 정말 간단하게 생각해서 왼쪽 자식 노드의 값 def is_valid_bst(self, node:TreeNode): if node.left and node.right: return self.is_valid_bst(node.left) a..
[DB] 인덱스의 수직적 탐색과 수평적 탐색
·
데이터베이스
개발을 하면서 인덱스의 중요성은 알지만 어떻게 동작하는지, 어떤 경우에 유용한지에 대해 깊이 알고있지는 않았다. 창피하지만 면접에서도 제대로 대답하지 못했다.. 이번 기회를 통해 인덱스가 왜 중요한지, 어떻게 인덱스로 테이블 블록에 접근하는지 알아보았다.인덱스가 중요한 이유우리는 테이블 블록 접근을 최소화 하기 위한 목적으로 인덱스를 주로 사용하게 되는데, 잘못 사용하게 되면 Table Full Scan 보다 비효율적이다. 왜냐하면 Table Full Scan은 순차적 I/O를 하고, Index Range Scan은 랜덤 I/O를 하기때문이다.따라서 인덱스의 효과를 보기 위해서는 인덱스 스캔 과정에서의 비효율을 줄이고, 랜덤 I/O를 최소화해야한다.인덱스의 구조인덱스는 기본적으로 B-Tree로 이루어져 ..
[SpringBoot] @Async로 비동기 작업 처리하기
·
Java,Kotlin,SpringBoot
2년전 면접에서 @Async 어노테이션을 사용하면 스레드가 새로 생성되는지, 아니면 사용하고 있던 스레드를 계속 사용하는건지 질문을 받았던 적이 있다. 지금은 당연히 기본으로는 새로운 스레드를 생성해서 사용한다고 답변할 수 있지만, 그 당시에는 멘탈이 나가서 잘 모르겠다고 답변했다. 비동기적으로 실행하는건 아는데, 스레드에 대한 개념이 부족하고 그런것도 신경쓰지 않은채 사용해왔던 것이다. 결과는 당연히 좋지 않았다.오랜만에 스프링을 다시 하는김에, @Async를 어떻게 사용하는지, 어느 사례에서 활용하면 좋을지 정리해보았다.@Async@Async 어노테이션은 스프링에서 비동기작업을 처리하기 위해 제공해주는 메소드로, 순수 자바 코드나 다른 프레임 워크에서 사용할 수 있는 어노테이션은 아니다.@Async ..
[SpringBoot] JPA에서 Enum 값 다루기(AttributeConverter)
·
Java,Kotlin,SpringBoot
모델에 Enum값을 정의하고 싶을 때가 있다. 예를 들어 상태가 될 수도 있고, 타입일수도 있다.예를 들어, Challenge라는 Entity가 있고, status 값은 ChallengeStatus라는 Enum 타입이다.@Entity@NoArgsConstructorpublic class Challenge { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column private String name; @Column private String goal; @Column private ChallengeStatus status; public Challenge(String ..
[Java] ExecutorService와 Future
·
Java,Kotlin,SpringBoot
스레드풀자바에서는 멀티 스레드를 사용해서 여러개의 작업을 병렬로 처리할 수 있다. 만약 매우 많은 작업이 한 번에 들어온다면, 그에 맞게 스레드 를 생성하고, 메모리 사용량이 늘어나 어플리케이션 성능에 영향을 줄 수 있다.만약 미리 스레드를 여러개 만들어 놓고, 작업이 들어올때 스레드에게 하나씩 할당해준다면 스레드 생성, 메모리 비용을 줄일 수 있을것이다.자바에서는 스레드풀을 사용할 수 있도록 ExecutorService를 제공해준다.ExecutorServiceExecutorService는 직접 생성하거나, Executors 클래스의 팩토리 메서드를 사용해서 생성할 수 있다.ExecutorService executor = Executors.newFixedThreadPool(3);CachedThreadPo..
[SpringBoot] h2 테이블 이름 upper_case 해제하기
·
Java,Kotlin,SpringBoot
h2 옵션 추가h2 로 테스트 DB를 사용하면 기본으로 테이블 이름이 모두 대문자가 된다.이 옵션을 해제하려면, application.yml 의 datasource 설정에 DATABASE_TO_UPPER=false 옵션을 추가하면 된다.datasource: driver-class-name: org.h2.Driver url: jdbc:h2:~/testDB;DATABASE_TO_UPPER=false username: sa password:이렇게 설정해주면 /h2-console에 접속했을때 내가 의도한 테이블명이 되어있는 것을 확인할 수 있다.(그냥 기본값이 false이면 안되는 걸까..)참고https://stackoverflow.com/questions/17529384/h2-runscr..
GraphQL DataLoader로 N + 1문제 해결하기
·
기타
목표 GraphQL을 사용하다보면 쉽게 겪을 수 있는 문제인 N + 1 문제와, DataLoader라는 기술로 어떻게 해결할 수 있는지 알아보자.N + 1 문제N + 1 문제란 무엇일까? 예시로 알아보자. 상품(Product)에는 리뷰(Review)들이 존재한다. 그래서 개발자는 product쿼리 안에 reviews를 추가하고 리졸버에 reviews를 가져오는 로직을 추가할 수 있다.query GetProductDetail($productId: ID!) { product(id: $productId) { id title price reviews { id content } }}위의 쿼리를 실행하면 DB에서는 2번의 SELECT가 수행된다.Product(id: ..
togeepizza
'분류 전체보기' 카테고리의 글 목록 (2 Page)