본문 바로가기

전체 글23

HikariCP Deadlock 이 글은 우아한 기술블로그에 기재된 HikariCP Dead lock에서 벗어나기 (이론편) 을 기반으로 작성된 글입니다. HikariCP Dead lock에서 벗어나기 (이론편) | 우아한형제들 기술블로그 {{item.name}} 안녕하세요! 공통시스템개발팀에서 메세지 플랫폼 개발을 하고 있는 이재훈입니다. 메세지 플랫폼 운영 장애를 바탕으로 HikariCP에서 Dead lock이 발생할 수 있는 case와 Dead lock을 회피할 techblog.woowahan.com 개요 Application단의 Thread 개수, 하나의 Task에서 발생하는 총 Connection의 수, 그리고 HikariCP Connection pool의 크기에는 정말 중요한 연관관계가 존재합니다. 바로 데드락 발생의 유무인.. 2024. 3. 23.
백준 20444번 | 색종이와 가위 (C++ 풀이) 문제 https://www.acmicpc.net/problem/20444 20444번: 색종이와 가위 첫 줄에 정수 n, k가 주어진다. (1 ≤ n ≤ 231-1, 1 ≤ k ≤ 263-1) www.acmicpc.net 풀이 사용 알고리즘 : 파라메트릭 서치 시간 복잡도 : $O(log N)$ 파라메트릭을 활용한 재밌는 문제였습니다. 문제는 굉장히 단순합니다. 색종이를 $N$번 잘랐을 때, $K$개의 색종이를 만들어낼 수 있는가? 를 구하면 되죠. 먼저 생각해 볼 만한 점은, 색종이를 잘랐을 때 몇 개의 색종이가 더 생겨나는지를 일반화시킬 수 있을까? 입니다. 이는 그림을 조금 그려보시면 아시겠지만, 가로로 $x$번, 세로로 $y$번 색종이를 자르면 $(x + 1) * (y + 1)$ 개의 색종이가 생.. 2023. 5. 28.
Repository 계층, 도메인과 영속성 엔티티 사이의 간극 메꾸기 안녕하세요. 이번 글에서는 미션 동안 제가 느낀 도메인과 엔티티의 좁혀지지 않는 간극, 그리고 이를 어떻게 대처하려 했는지에 대해 다뤄보려고 합니다. 먼저, 제가 사용한 도메인과 엔티티의 용어 정리를 하고 갈 필요가 있을 것 같습니다. 도메인: 실제 비즈니스 로직을 정의하는 영역 엔티티: DB 테이블의 정보와 1:1 매핑되는 영속성 엔티티 저는 도메인과 엔티티를 위와 같이 분리하여 생각했습니다. 도메인 객체는 흔히 말하는 객체지향 세상 속에서 살아가는 친구들이었고, 엔티티 객체는 DB 테이블의 컬럼 값들을 필드로 가지는, 일종의 DTO 같은 친구들이었죠. 문제점 여기서 문제는, 객체지향 세상과 RDBMS 세상의 패러다임이 불일치한다는 점이었고, 이는 곧 도메인 객체와 엔티티 객체 사이의 엄청난 괴리감으로.. 2023. 5. 21.
백준 1719번 | 택배 (C++ 풀이) 문제 https://www.acmicpc.net/problem/1719 1719번: 택배 첫째 줄에 두 수 n과 m이 빈 칸을 사이에 두고 순서대로 주어진다. n은 집하장의 개수로 200이하의 자연수, m은 집하장간 경로의 개수로 10000이하의 자연수이다. 이어서 한 줄에 하나씩 집하장간 경 www.acmicpc.net 풀이 사용 알고리즘 : 다익스트라 시간 복잡도 : $O(N*MlogN + N^3)$ 정점 $V_{1}$ 에서 정점 $V_{2}$ 로 향하는 최단 경로 중, 정점 $V_{1}$ 에서 바로 다음 정점이 어디인지 찾아야 하는 문제입니다. 문제를 풀기 위한 메인 아이디어는 최단 경로 역추적입니다. 최단 거리가 계산되는 시점에서 지나쳤던 정점들을 역추적한 뒤, 실제 최단 경로를 구성하고 두 번째.. 2023. 5. 14.
반환형이 void인 메서드, 어떻게 테스트할까? (with 행위 검증) 난관 서비스 계층에 대한 슬라이스 테스트를 작성하던 중, 저는 큰 난관에 봉착했습니다. 바로 void를 반환하는 메서드를 테스트해야하는 상황을 마주한 것이었는데요, 먼저 상황을 같이 볼까요? @Transactional @Service public class ProductService { private final ProductDao productDao; public ProductService(final ProductDao productDao) { this.productDao = productDao; } public void addProduct(final CreateProductRequest request) { final Product product = new Product(request.getName(),.. 2023. 5. 7.