전체 글

Spring

HikariCP Dead Lock 으로부터 비롯된 트랜잭션과 커넥션에 대한 이해

https://techblog.woowahan.com/2663/ HikariCP Dead lock에서 벗어나기 (실전편) | 우아한형제들 기술블로그 {{item.name}} 1부 HikariCP Dead lock에서 벗어나기 (이론편)은 잘 보셨나요? 2부 HikariCP Dead lock에서 벗어나기 (실전편)에서는 실제 장애 사례를 기반으로 장애 원인을 설명하고 해결 사례를 공유하고자 techblog.woowahan.com HikariCP Dead Lock 과 관련한 기술 블로그 포스팅을 흥미롭게 읽었다. 하지만 다 읽고 난 뒤 한가지 의문점이 남아서, 이를 제대로 이해하고 넘어가고자 한다. 여기서 Sub Transaction 이란 무엇일까? Spring Framework 기준 @Transaction..

JPA

웹 애플리케이션과 영속성 관리

도입 김영한님의 자바 ORM 표준 JPA 프로그래밍 책 13장 웹 애플리케이션과 영속성 관리를 읽고, 추가적으로 공부한 내용을 스터디에서 발표하였습니다. 우선, 발표전 연습겸 발표 내용을 녹화한 영상입니다. https://youtu.be/bF3k2XdYscE 실제 발표중에는 많은 질문과 피드백이 들어왔고, 이를 통해 더 많은 것을 배워갈 수 있었습니다. 따라서, 추가적으로 공부한 내용과 함께 이를 글로 다시한번 정리하려고 합니다. 웹 어플리케이션과 영속성 관리 스프링을 컨테이너 환경에서 JPA를 활용하면 컨테이너가 트랜잭션과 영속성 컨텍스트를 관리해주므로 애플리케이션을 손쉽게 개발할 수 있습니다. 하지만 컨테이너 환경에서 동작하는 JPA의 내부 동작 방식을 이해하지 못하면, 문제가 발생 했을 때 해결하기..

디자인패턴

템플릿 메소드 패턴

개발하고 있던 서비스 기능 중, 여러가지 템플릿에 따라 전자문서를 생성하는 기능이 존재했습니다. 각각의 템플릿에 적용되는 변수가 상이하기 때문에, 이에 따른 validation, convertion 이 따로 진행되어야 했습니다. 다만, 여러가지 템플릿에 공통으로 적용되는 validation, convertion 또한 존재하였고, 이를 최대한 공통으로 처리하는 방향이 코드의 확장성, 반복 제거에 좋을 것 같다고 판단하였습니다. 단순 상속 구현 가장 처음 떠올린 방법은 부모 클래스에서 공통 validation, convertion 을 진행하는 방식으로, 다음과 같습니다. public abstract class ParentValidator { public void validate() { System.out.p..

에러기록

DB 업데이트시 동시성 문제

Issue 서비스에 00시를 기준으로 통계를 위한 데이터를 업데이트 하는 배치를 Amazon EventBridge 를 통해 동작시키고 있는 중이었습니다. 약 일주일간은 전혀 문제없이 동작하고 있었습니다. 그런데, 어느날 통계가 제대로 되지 않는 것 같다는 이슈가 보고되었고, 저는 이를 살펴보기 시작했습니다. 실제로 살펴보니 약 3일간 통계가 제대로 계산되지 않고 있었습니다. 문제는, 배치 로그에는 로직이 정상적으로 실행되었다고 남아있다는 점입니다. 골치 아파질 것을 예감하면서, 원인을 파악하기 시작했습니다. Problem 원인을 파악하는데 예상보다 꽤 시간이 걸렸습니다. 로직에는 수정사항이 전혀 없었는데 일주일 정도는 문제없이 통계 데이터를 계산했고, 그 후 3일간은 지속적으로 통계가 제대로 계산하고 있..

Java

[Spring] Custom Annotations for Spring Integration Tests

Introduction Annotations are one of the powerful features in Java and Spring that allow for declarative behavior without boilerplate code. They're especially useful in configuring integration tests in Spring applications. This article aims to unpack a custom annotation, @SpringIntegrationTest, designed to streamline Spring integration tests. By the end of this read, you will understand each of i..

Java

[Java] lambda expression 에서 local variable 값을 변화시킬 수 없는 이유

Problempublic class Main { public static void main(String[] args) { List someList = List.of(0, 1, 2); int counter = 0; someList.forEach(something -> { counter++; }); }}위 코드의 build 는 fail 됩니다. 에러메세지는 다음과 같습니다.java: local variables referenced from a lambda expression must be final or effectively finallambda expression 에선 final or ef..

GraphQL

GraphQL 을 왜 써야할까?

GraphQL 은 페이스북에 의하여 REST API 의 문제를 해결하기 위해 만들어졌습니다. 기본적으로 REST API 여러개의 URL을 활용하여 작동합니다. 모든 URL 은 각각 고유하고, 각기 다른 데이터를 제공합니다. 하지만, 이러한 REST API 는 2가지 큰 문제점을 가지고 있습니다. Problems 1. Over Fetching 클라이언트가 필요한 것보다 더 많은 데이터를 가져오게 되는 경우를 Over Fetching 이라고 볼 수 있습니다. 예를 들어, 영화 목록에서 제목만 필요하지만, 영화 목록을 가져오는 API 는 제목, 내용, 사진 url 등 더 많은 정보를 돌려주게 구현되어있는 경우가 있을 수 있죠. 만약 조금이라도 다른 응답의 데이터를 가지고 오고 싶다면, 새로운 엔드포인트 API..

클린코드

인자의 개수는 적을수록 좋다 (+ 실무 경험)

열심히 기능을 짜다보면, 인자가 2~3개 넘어가는 일이 다반사입니다. 로버트 C. 마틴의 클린코드에서 말하듯이, 3개 이상의 인자는 죄악입니다. (이렇게 까지 강하게 표현했는지 정확하게 기억은 나지 않지만.. 어쨌든 확실히 나쁩니다) 3개 보다 나은 것은 2개, 2개보다 나은 것은 1개의 인자, 가장 좋은 것은 0개의 인자를 활용하는 것입니다. 0개의 인자가 어떻게 가능한지 처음 들으면 의아할 수 있는데, 객체를 생성하고 객채의 메소드로 기능을 구성하라는 말입니다. 가장 좋은건 0개가 맞지만, 열심히 비지니스 로직을 짜다보면 2개 정도의 인자까지는 봐줄만 한 것 같습니다. 하지만, 이 때도 최대한 메서드명을 잘 지어서 실수를 방지해야 합니다. 예를 들어, 게시글의 그룹명과 카테고리명이 따로 존재하고, 이..

sjoonb
sjoonblog