Server 123

DataBase - 시퀀스 전략 설계하기 (+ 성능 문제, 시퀀스 낭비 문제 등)

DB에 데이터를 적재할 때 시퀀스의 개념을 사용할 때가 많다.ID(PK)Request Id카드번호사원번호...시퀀스의 전략에 대해 알아보자. 예시 코드는 Hibernate를 사용했다. AUTO_INCREMENT 전략시퀀스는 DB에서 고유한 값을 순차적으로 생성하는 객체를 말한다.가장 익숙한 것은 아래와 같이 DB의 AUTO_INCREMENT를 사용하는 것이다.public class Member { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id;}위처럼 설정하면 대 부분의 애플리케이션에 문제없이 돌아간다.하지만 추가로 고민해야 될 포인트가 있다. 성능적으로 문제가 없을 지이다.성능이 낭비되는 문제와 시퀀스 전략AU..

Server/Spring JPA 2025.09.21

Hibernate - 맵핑 타입 최적화

지난 번에 게시글로도 작성했었지만, DB에서 Status와 같은 성격을 띄는 컬럼에 대해서 다뤄본적이 있었다.VARCHAR로 관리할 지 vs Enum vs Tinyint, ...최근에 Hibernate를 활용한 새로운 접근(?)을 알게 되었고 꽤 인상깊어서 공유하고자 한다.Hibernate - Mapping ConstructJPA, Hibernate에는 세 가지 매핑 구조가 있다.Basic types (Integer, Long, String, CustomStatus)Embeddable types (@Embeddable 애노테이션처럼 여러 컬럼을 묶은 것)Entity types (테이블과 맵핑)맵핑할 타입이 더 컴팩트할 수록 더 높은 성능을 낼 수 있다.가령, Status라는 Enum이 있다면 String..

Server/Spring JPA 2025.08.31

코루틴에서 @Transactional을 사용하는 방법!

코루틴에서 트랜잭션을 적용하는 데 어려움을 겪는 케이스가 많다.코루틴 + JPA 환경에서 @Transactional 애노테이션이 미동작했고, 해당 부분으로 인해 알게된 내용을 공유한다.Spring I/O 2024에서 언급하는 내용도 참고했다.스프링 - 트랜잭션 관리 방식스프링에서 지원하는 트랜잭션 방식에 따라 크게 2가지로 방식이 있다.선언적 트랜잭션프로그래밍적 트랜잭션선언적 트랜잭션(Declarative Transaction)이란 @Transactional과 같은 애노테이션을 기반으로 트랜잭션을 처리하는 방식을 말한다.프로그래밍적 트랜잭션은(Programmatic Transaction)은 실제 로직에서 트랜잭션을 수행하는 방식을 말한다.선언적 트랜잭션 vs 프로그래밍 트랜잭션공식문서를 보면 아래와 같이..

Server/Spring JPA 2024.09.29

Spring I/O 2024 - 스프링으로 DDD 구현하기! (해석 및 리뷰)

Spring I/O 2024에서 DDD(Domain Driven Design) 관련된 강연을 했다.Implementing Domain Driven Design with Spring by Maciej Walkowiak @ Spring I/O 2024해당 강연은 DDD의 기본부터 Spring을 활용한 구현 방법을 설명한다. 아래는 해당 강연 내용을 해석한 내용이다.DDD마틴파울러는 DDD를 아래와 같이 설명한다.DDD(Domain-Driven-Design) is an approach to software development that centers the development on programming a domain model that has a rich understanding of the process..

Server/Spring 2024.09.27

Spring - 통합(인수) 테스트에서 Web 영역 Mocking하기(+ WireMock)

해당 포스팅에서는 테스트 시 Web 영역을 어떻게 Mocking 할 지에 대해 다룬다.통합테스트요즘은 단위 테스트를 넘어서 통합테스트 / 인수테스트 / E2E테스트를 많이 구성한다.외부 API를 호출하는 코드가 있다. 해당 로직을 Mocking할 때 어떻게 할 지 생각해보자.주문 시스템 (예시 코드)예시를 위해 제작한 주문 시스템의 코드를 보자.아래는 첫 주문 기능의 진입점인 주문 컨트롤러이다.@RestControllerclass OrderController( private val orderService: OrderService,) { @PostMapping("/order") fun order( @RequestBody orderRequest: OrderRequest, )..

Server/JUnit, Spock 2024.06.29

코프링 - runBlocking 모두 제거해야 하나?

runBlocking {} 제거해야 할까코틀린과 코루틴을 처음 접하는 경우가 많을 것이다.코틀린이 익숙하지 않은 프로젝트를 보면 대부분 Controller 메서드의 시작이 runBlocking()이 되어있고, 사실상 코루틴은 runBlocking(), runCatching() 밖에 존재하지 않는 경우가 있다.내가 투입된 프로젝트의 코드도 동일한 상황이었고 그랬고, '코루틴을 사용할 때의 이점을 하나도 못누리고 있는 것은 아닐까..?' 하는 의심을 가지게 되었다.runBlocking은 왜 문제이며, 어떻게 개선할 수 있는 지 알아보자.runBlocking아래는 runBlocking에 대한 docs의 일부이다.Runs a new coroutine and blocks the current thread inte..

Server/Spring 2024.06.16

Spring - Curcuit Breaker 이해하기!

Spring CloudSpring Cloud는 안정적인 Micro Service Architecture를 만들고 외부 환경에 대해 신경을 할애하지 않고 내부 로직에만 집중할 수 있게 도와주는 라이브러리이다.Spring Cloud에서 지원하는 기능 중 Curcuit breaker에 대해 다룬다.Circuit breakerCircuit breaker는 전기 회로의 차단기와 같은 역할을 하는 디자인 패턴을 말한다. 즉, CurcuitBreaker는 기술이 아닌 패턴을 말한다. 주요 목적은 다음과 같다.외부의 장애를 격리하고 시스템 안정성을 유지할 수 있다.장애 복구 시간을 확보할 수 있다.특정 서비스의 과부하나 장애가 발생했을 때 복구가 될 때까지 추가적인 요청을 차단해서 시스템의 안정성을 유지한다.그래서 R..

Server/Spring MSA 2024.06.08

Reactive Streams를 테스트하는 방법 (reactor-test 라이브러리)

Reactive Programming을 사용할 때 Project Reactor를 주로 사용한다.Reactor는 비동기로 동작하기 때문에 일반적인 테스트 방식으로 검증하기 어렵다. 그래서 Reactor-test 라이브러리를 제공한다.Dependency우선 예시 동작을 위해서 아래와 같은 Dependency를 추가해야한다.testImplementation 'io.projectreactor:reactor-test:3.6.5'Reactive Streams 테스트가 어려운 이유1. 강제 동기화아래 테스트 코드를 보자.@Testvoid test() { // given var expected = IntStream.range(0, 10).boxed() .collect(Collectors.toLi..

Server/JUnit, Spock 2024.05.04

Connection Pool Deadlock 해결하기! (feat. REQUIRES_NEW)

해당 포스팅은 서비스를 오픈하면서 겪었던 이슈와 해결에 대해 공유한다.아래 코드 및 내용은 예시를 위해 만든 프로젝트이다!송금 서비스송금 서비스에서 은행 API를 호출해서 송금을 한다고 가정해보자.아래는 예시를 위한 코드이다.@Service@RequiredArgsConstructorpublic class TransferService { private final TransferRepository transferRepository; private final BankingRequestRepository bankingRequestRepository; private final BankingApiAdaptor bankingApiAdaptor; @Transactional public voi..

Server/Spring JPA 2024.03.30

FixtureMonkey 적용 검토해보기!

새로운 팀에서 테스트를 위한 객체를 생성하는 패턴이나 라이브러리가 필요하게 되었다. 팀원 분이 FixtureMonkey를 추천해주셔서 POC를 진행하게 되었다.FixtureMonkeyFixtureMonkey는 Naver에서 만든 테스트 객체를 쉽게 생성하고 조작할 수 있도록 도와주는 Java 및 Kotlin 라이브러리이다.FixtureMonkey는 한국어 docs를 지원한다. 오픈소스 중에 볼륨도 작은 편이라 한번 읽어보는 것도 추천드린다. 포스팅 내용은 요약 및 검토 정도로 봐주면 좋을 것 같다.https://naver.github.io/fixture-monkey/v1-0-0-kor/docs/introduction이전에 사용하지 않았던 이유FixtureMonkey는 2년 전에 한번 봤었고 적용한다는 블..

Server/JUnit, Spock 2024.03.23