본문 바로가기

개발9

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.
Repository 계층, 도메인과 영속성 엔티티 사이의 간극 메꾸기 안녕하세요. 이번 글에서는 미션 동안 제가 느낀 도메인과 엔티티의 좁혀지지 않는 간극, 그리고 이를 어떻게 대처하려 했는지에 대해 다뤄보려고 합니다. 먼저, 제가 사용한 도메인과 엔티티의 용어 정리를 하고 갈 필요가 있을 것 같습니다. 도메인: 실제 비즈니스 로직을 정의하는 영역 엔티티: DB 테이블의 정보와 1:1 매핑되는 영속성 엔티티 저는 도메인과 엔티티를 위와 같이 분리하여 생각했습니다. 도메인 객체는 흔히 말하는 객체지향 세상 속에서 살아가는 친구들이었고, 엔티티 객체는 DB 테이블의 컬럼 값들을 필드로 가지는, 일종의 DTO 같은 친구들이었죠. 문제점 여기서 문제는, 객체지향 세상과 RDBMS 세상의 패러다임이 불일치한다는 점이었고, 이는 곧 도메인 객체와 엔티티 객체 사이의 엄청난 괴리감으로.. 2023. 5. 21.
반환형이 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.
서비스 계층은 왜 필요할까? 미션을 하다가 리뷰어에게 이런 질문을 받은 적이 있습니다. 서비스가 꼭 있어야 할 이유에 대해서도 생각해 보면 좋을 것 같습니다. 컨트롤러에서 도메인과 Dao를 이용해 해결해도 되는데 서비스로 분리한 이유는 무엇일까요? 이번 미션에서 계층 구조를 분리할 때, 저는 Controller → Service → Repository → DAO → DB 의 형태로 계층 흐름을 설계해 주었는데요. 이런 식의 흐름을 만들게 된 이유는 단순히 계층화 아키텍처(Layered Architecture)에서의 Best Practice 라고 생각했기 때문이었습니다. 그러다가 막상 서비스 계층이 왜 필요한지에 대한 질문을 들었을 때, “남들 다 이렇게 만드니까요?” 라는 생각이 먼저 떠오르는 것이 스스로에게 꽤 부끄러웠습니다. 분.. 2023. 4. 23.
public VS private + getter 미션을 하다가, A 도메인이 가지고 있는 상수의 값을 B 도메인에서 필요로 하는 경우가 있었습니다. 지금까지 상수는 당연히 private static final 로 작성해왔는데, 위의 경우때문에 꽤 큰 고민에 빠졌습니다. 결론적으로 제가 생각한 선택지는 크게 3가지가 있었습니다. B 도메인에도 A 도메인이 가지고 있던 상수를 정의해서 사용한다. 이 경우는 좋은 판단이 아니라고 생각했습니다. 해당 상수가 가지는 의미가 B 도메인이 가지는 책임과는 거리감이 있다고 느꼈기 때문입니다. 상수를 도메인 필드로 바꿔서 getter를 연다. 이 경우도 썩 내키진 않았습니다. 이런 형태로 하면 블랙잭 게임 요구사항과는 다른 값(딜러의 이름이 더 이상 “딜러”로 한정되지 않는 것처럼!)들이 들어올 수 있고, 이는 요구사.. 2023. 4. 2.