전체 글

우테코 5기

2023년 돌아보기: 우아한테크코스 5기

2023년이 30시간도 남지 않은 지금, 지난 1년을 되돌아보고자 한다. 내 인생에서 가장 인상 깊은 1년이 2018년(재수학원)이었는데, 2023년으로 갱신된 듯하다. 1. 우테코 합격2022년 12월 28일 오후 3시, 우아한테크코스 5기 BE 과정에 합격했다! 당시 6개월짜리 스타트업 인턴을 합격한 상태여서 굉장히 많은 고민을 했다. 졸업까지 한 학기 남아있었고, 인턴을 할 시 학교를 해결할 수 있었다. 우테코를 입과 하게 되면 2024년에 다시 인턴을 구해야 하는 상황.. 진짜 많은 사람들에게 조언을 구했고, 많은 고민 끝에 우테코를 선택했다. 인생에서 안정이 꽤나 큰 가치였던 내가, 처음으로 도전을 택한 순간이었다. 지금 되돌아보면 최고의 선택이었다! 2. 우테코를 들어가며우테코를 들어가며 목표..

프로그래밍

CATS: MySQL은 락 점유 순서를 어떻게 결정할까?

'페스타고' 서비스에서 선착순 티켓팅 기능을 개발하며 궁금증이 생겼다. X-lock은 요청 순서대로 부여될까? 즉, 트랜잭션 A, B, C가 동일한 자원에 대해 순차적으로 락을 대기하면, 그 순서대로 락을 획득할까? 선착순 티켓팅이 제대로 작동하려면, 먼저 대기열에 등록된 트랜잭션이 먼저 락을 획득하는 것이 보장되어야 한다. 이를 확인하기 위해 MySQL의 '트랜잭션 스케줄링 기법'에 대해 알아보았다. 트랜잭션 스케줄링 기법이란? 트랜잭션 스케줄링은 데이터베이스 시스템에서 여러 트랜잭션이 동시에 실행될 때 이들의 실행 순서를 결정하는 방법이다. 여러 트랜잭션이 동일한 자원에 대한 락을 대기하는 경우, 어떤 트랜잭션이 먼저 락을 할당받아야 할까? 바로 트랜잭션 스케줄링이 트랜잭션이 어떤 순서로 데이터에 접..

프로그래밍

AOP 및 @Retryable를 활용한 낙관적 락 재시도

우아한테크코스 기술블로그 '테코블'의 선착순 티켓 예매의 동시성 문제: 잠금으로 안전하게 처리하기 포스트에서 낙관적 락 재시도에 대해 다루었는데, 해당 내용을 별개의 포스트로 공유하고자 글을 작성한다. 위 포스트에서는 선착순 티켓 예매 상황에서 발생하는 동시성 문제를 해결하기 위한 다양한 시도 과정을 설명하니 관심이 있으면 읽어보길 추천한다. 낙관적 락이란?락(잠금, Locking)은 데이터가 읽힌 후 사용될 때까지 데이터가 변경되는 것을 방지하기 위한 조치이다. 잠금 전략으로는 여러 트랜잭션 간 충돌이 일어나지 않을 것이라 가정하는 낙관적 락(Optimistic Lock) , 여러 트랜잭션 간 충돌이 일어날 것이라 가정하는 비관적 락(Pessimistic Lock) 이 있다. 낙관적 락은 실제로 DB에..

프로그래밍

[Spring] REQUIRES_NEW와 데드락 위험성

Requires_new is king of side effects. c.c) spring-framework 이슈 “REQUIRES_NEW는 부작용 대장이다.”라는 말에는 그 이유가 있다. REQUIRES_NEW 전파 속성은 새로운 트랜잭션을 시작하는 기능을 가지며, 그로 인해 데드락 발생의 위험성이 증가한다. 이미 실행 중인 트랜잭션 내에서 이 전파속성을 가진 메서드를 호출하면 새로운 트랜잭션이 시작된다. 이 과정에서 커넥션 풀의 리소스가 부족해지면 데드락의 위험이 있다. 데드락의 원리 REQUIRES_NEW는 이미 실행 중인 트랜잭션이 있을 때 새로운 트랜잭션을 시작하는 전파 속성이다. 만약 동시에 많은 요청이 여러 트랜잭션을 시작하려 할 때, 사용 가능한 커넥션 리소스가 부족하게 되면 데드락이 발생한..

프로그래밍

[Spring] Mockito 테스트의 중복 given절 줄이기: lenient를 활용한 유틸리티 클래스

들어가며 어플리케이션 계층의 서비스 테스트 코드를 Mockito를 활용해 작성할 때, 아래와 같이 무수한 given절이 중복적으로 생기곤 한다. 이러한 given절 중 대다수는 테스트를 성공시키기 위한 부분이며, 실제로 검증하고자 하는 부분은 일부일 때가 많다. 테스트를 성공시키기 위한 given절들은 여러 테스트 메서드들에서 중복적으로 선언된다. 이렇게 given절이 많아지면, 해당 테스트 메서드에서 어떤 조건을 검증하려는지 파악하기 어려워진다. 따라서 나는 성공 조건들은 @BeforeEach문으로 분리하고, 실제로 검증하고자 하는 조건만 해당 테스트 메서드에 남기기로 했다. given절을 @BeforeEach문으로 분리하기 우선 메서드 단위로 @Nested class를 구성한 후, 해당 클래스의 @B..

프로그래밍

[Spring] TaskScheduler를 활용해 런타임에 동적으로 작업 예약하기

들어가며 대학 축제 티켓팅 서비스 ‘페스타고’에서 입장 안내 푸시알림을 보내는 기능을 개발하게 되었다. 10분 후 입장 가능한 티켓을 소유한 사용자들에게 ‘잠시 후 입장 가능합니다’라는 내용의 푸시알림을 전송하는 기능이다. 여기서 주목할 점은 특정 시간(ex. 자정)이 아닌, 티켓 별로 상이한 입장 시간에 따라 푸시알림을 전송해야 한다. 이 기능을 개발하는 과정을 이번 글에서 공유하고자 한다. 고려한 방법들 푸시알림을 특정 시간에 전송하기 위해 여러 가지 방법들을 고려하였다. 1. Firebase의 함수 예약 기능 활용 Firebase는 특정 시간에 함수를 실행하도록 예약하는 기능을 제공한다. 함수 예약 | Cloud Functions for Firebase Google I/O 2023에서 Firebas..

프로그래밍

Spring Event란?

‘페스타고’에서 모바일 티켓의 상태를 실시간으로 변화시켜 주기 위해 FCM을 연동했다. 스태프 폰에서 티켓을 스캔 완료한 후, 학생 폰에 FCM을 전송하면 화면에 표시되는 QR코드를 비활성화처리한다. 이때, FCM 보내는 과정을 Spring Event를 활용해 처리했는데, 코드 리뷰를 진행하며 내가 @TransactionalEventListener와 @EventListener의 차이를 정확히 모른다는 사실을 깨달았다. 이번 기회에 Spring Event의 개념을 정리하고 넘어가 보고자 한다. 이벤트(Event)란? 이벤트는 특정 트리거나 조건이 충족되었을 때 시작되는 동작 혹은 사건이다. 이벤트 발행은 이벤트를 발생시키는 과정으로, 발행자(publisher)가 이벤트를 발행하면, 이를 구독하고 있던 구독..

프로그래밍

[Java] synchronized란?

Java에서 다중 스레드 환경에서 공유 데이터에 대한 안전한 접근을 하는 방법, 즉 스레드 간 동기화 방식들에 대해 알아보고자 한다. 이번엔 대표적 예시인 synchronized 키워드에 대해 공부해보자. Java에서의 스레드 개념은 아래 포스팅을 참고하도록 하자. [Java] Thread란? 요즘 ‘페스타고’에서 동시성 문제를 해결하며 스레드에 대한 관심이 커졌다. 자바에서 동시에 여러 작업을 수행하기 위해 사용되는 스레드(Thread)에 대해 알아보자. 프로세스와 스레드 프로세 xxeol.tistory.com synchronized 키워드 synchronized 키워드를 사용해 메서드 또는 코드 블록을 임계 영역(critical section)으로 지정할 수 있다. 이렇게 지정된 영역은 스레드 간 공..

프로그래밍

[Java] Thread란?

요즘 ‘페스타고’에서 동시성 문제를 해결하며 병렬 프로그래밍에 대한 관심이 커졌다. 자바에서 동시에 여러 작업을 수행하기 위해 사용되는 스레드(Thread)에 대해 알아보자. 프로세스와 스레드 운영체제가 없던 시절, 컴퓨터는 한 번에 프로그램 하나만 실행했다. 그리고 해당 프로그램은 컴퓨터 내 모든 자원을 직접 접근할 수 있었다. 운영체제가 등장하고, 여러 개의 프로그램을 각자의 프로세스 내에서 동시에 실행할 수 있게 되었다. 프로세스(process)는 각자가 서로 격리된 채로 독립적으로 실행하는 프로그램으로, 운영체제는 프로세스마다 메모리, 파일 핸들, 보안 권한 등의 자원을 할당한다. 프로세스의 등장으로 자원 활용, 공정성, 편의성을 얻을 수 있었다. 스레드의 등장으로, 한 프로세스 안에 여러 개의 ..

도둑탈을 쓴 애쉬
좋은 경험 훔쳐먹기