전체 글

TIL/Trouble Shooting

[TS] 실시간 재고 동시성 문제

예약 구매 시스템 프로젝트를 진행하면서 재고 처리를 구현하던 중 동시성 문제를 해결하기 위해 학습하고 시도한 내용입니다. 동시성 문제 동시성 문제란 동시에 여러 쓰레드가 하나의 자원에 접근하면서, 서로의 작업을 간섭하게는 문제이다. 이로 인해, 예상한 값과 다른 결과가 나올 수 있다. 테스트 시나리오 예약 구매 상품 A가 있으며, 초기 재고 수량은 10개이다. 해당 상품을 구매하려고 10000명의 사용자가 접근한다. 위 상황에서 결제 화면에 진입하면 재고 수량을 감소시키고, 결제 프로세스 진행 중 어떠한 이유로 이탈한다면 재고 수량을 증가 시켜야 한다. 이때, 여러 쓰레드가 동시에 접근하면서 결제 완료된 재고 수량이 10개를 초과하는 문제가 발생하였다. 해결하기 데이터베이스 락 데이터베이스에 직접 Loc..

Computer Science/알고리즘

[알고리즘] Lowest Common Ancestor

Lowest Common Ancestor 트리 자료구조에서 두 노드의 가장 가까운 공통 조상을 찾는 알고리즘으로, 일반적으로 이진 트리나 이진 탐색 트리에서 사용됩니다. 재귀적인 방법과 반복문을 사용한 방법으로 구현할 수 있는데 이 포스팅에서는 재귀를 바탕으로 설명하겠습니다. 동작 순서 루트(root)부터 시작하여 두 대상 노드의 값을 비교합니다. 현재 노드의 값이 두 대상 노드의 값보다 크면, LCA는 현재 노드의 왼쪽 서브트리에 있을 것입니다. 따라서 왼쪽 자식 노드로 재귀 호출합니다. 현재 노드의 값이 두 대상 노드의 값보다 작으면, LCA는 현재 노드의 오른쪽 서브트리에 있을 것입니다. 따라서 오른쪽 자식 노드로 재귀 호출합니다. 두 대상 노드의 값이 현재 노드의 값과 같거나, 현재 노드의 값이 ..

Computer Science/알고리즘

[알고리즘] Morris Traversal

Morris Traversal for Preorder 트리를 순회하는 데 사용되는 다양한 알고리즘이 있습니다. 그 중에서 Morris Traversal 알고리즘은 공간 복잡도를 O(1)로 유지하면서 순회할 수 있는 효율적인 방법으로 스택을 사용하지 않고도 Preorder Traversal를 수행할 수 있습니다. 따라서 메모리 사용에 제약이 있는 환경이거나 공간 복잡도를 최소화해야 하는 상황에서 유용하게 사용될 수 있습니다. 또한 추가 데이터 구조 없이 순회해야 하는 경우에도 유용하게 사용할 수 있습니다. 동작 순서 현재 노드를 기준으로, 왼쪽 서브트리를 순회합니다. 왼쪽 서브트리에서 현재 노드의 바로 이전 노드를 찾습니다. 이전 노드의 오른쪽 자식을 현재 노드로 설정합니다. 현재 노드를 방문합니다. 현재..

Spring

스프링 부트 디자인 패턴 (Spring Boot Design Patterns)

Design Pattern에 대한 스터디를 준비하다가 Medium 에서 좋은 글을 발견해서 정리해보려고 합니다. 추가적으로 덧붙인 내용들이 있습니다. 틀린 정보가 있다면 언제든 알려주세요! https://medium.com/stackademic/top-7-spring-boot-design-patterns-unveiled-4a2569f8d324 Top 7 Spring Boot Design Patterns Unveiled Spring Boot, built on top of the Spring framework, incorporates various design patterns to enhance the development, scalability… blog.stackademic.com 스프링 부트에서 여러 ..

Programmers/Lv.2

[프로그래머스][Lv.2][Java][DP] 2xn 타일링

문제 https://school.programmers.co.kr/learn/courses/30/lessons/12900 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 설명 가로 길이가 2이고 세로의 길이가 1인 직사각형모양의 타일이 있습니다. 이 직사각형 타일을 이용하여 세로의 길이가 2이고 가로의 길이가 n인 바닥을 가득 채우려고 합니다. 타일을 채울 때는 다음과 같이 2가지 방법이 있습니다. 타일을 가로로 배치 하는 경우 타일을 세로로 배치 하는 경우 예를들어서 n이 7인 직사각형은 다음과 같이 채울 수 있습니다. 직사각형의 가로의 길이 n이 매..

TIL

[TIL][Spring] javax.xml.bind.DatatypeConverter 에러

🤔문제 OAuth2 로그인 구현 중 아래와 같은 에러 발생 ❗원인 위와 같은 에러메세지가 있었다. 해당 코드는 아래와 같이 생겼다. 즉, 'io.jsonwebtoken.impl.Base64Codec' 클래스에서 'DatatypeConverter' 클래스를 사용해야하는데 해당 클래스룰 찾지 못해 에러가 발생하였다. 💡해결방법 https://medium.com/@jiri.caga/java-lang-classnotfoundexception-javax-xml-bind-datatypeconverter-in-java-17-solved-499d0ea776d0 위 링크를 들어가보면 Java 11 이상에서 JAXB가 JDK에서 제거되었다고 한디. 그러면서 해결방법으로 간단하게 의존성을 추가하라고 되어있어 아래 코드를 추..

TIL

[TIL][SQL] @Modifying 어노테이션

❓@Modifying 어노테이션이란? @Modifying(clearAutomatically = true, flushAutomatically = true) @Transactional @Query("UPDATE Restaurant r SET r.averageRating = :averageRating WHERE r.id = :restaurantId") void updateAverageRating(@Param("restaurantId") Long restaurantId, @Param("averageRating") double averageRating); 수정 쿼리를 수행하는 메서드에 붙인다. JPA에서 SLECT 쿼리가 아닌 UPDATE, DELETE, INSERT 등과 같은 수정 작업을 수행하는 메서드에 대한..

TIL

[TIL][SQL] 연관 데이터 없을 때 조회하기 (Join vs Left Join)

🤔문제 주 테이블의 상세 정보를 가져오는 코드에서 연관 데이터가 없으면 주 테이블의 정보도 반환되지 않는 문제 발생 ❗원인 주 테이블 id로 연관 테이블을 조회할 때 join을 사용 @Query("SELECT r FROM Restaurant r join fetch r.ratingList WHERE r.id = :id") Optional findByIdWithRatingsUsingFetchJoin(@Param("id") Long id); default Restaurant getById(Long id) { return findByIdWithRatingsUsingFetchJoin(id) .orElseThrow(() -> new CustomException(ErrorCode.NOT_FOUND)); } 💡해결방법..

Computer Science/Operating System

[OS] 프로세스 (Process)

프로세스 (Process) 컴퓨터에서 실행되고 있는 프로그램 HDD/SDD에 있던 프로그램이 인스턴스화되어 메모리(RAM)에 올라가면 프로세스가 된다. 프로세스 상태 (Process State) New(=Create) : 생성 상태 프로세스가 생성된 상태 (이지만 아직 메인 메모리에 올라가지는 않았다.) fork() 또는 exec() 함수를 통해 생성되며, 이때, PCB가 할당된다. fork() : 부모 프로세스의 주소 공간을 그대로 복사하여, 새로운 자식 프로세스를 생성한다. exec() : 새롭게 프로세스를 생성한다. Ready : 대기 상태 메인 메모리 공간에 로드되어 CPU에서 실행을 기다리고 있는 상태 Dispatcher 또는 Short-term scheduler에 의해 CPU로 컨텍스트 스위칭..

Programmers/Lv.2

[프로그래머스][Lv.2][Java][Heap] 더 맵게

문제 https://school.programmers.co.kr/learn/courses/30/lessons/42626 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 설명 매운 것을 좋아하는 Leo는 모든 음식의 스코빌 지수를 K 이상으로 만들고 싶습니다. 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 Leo는 스코빌 지수가 가장 낮은 두 개의 음식을 아래와 같이 특별한 방법으로 섞어 새로운 음식을 만듭니다. 섞은 음식의 스코빌 지수 = 가장 맵지 않은 음식의 스코빌 지수 + (두 번째로 맵지 않은 음식의 스코빌 지수 * 2) Leo는 모든 음..

dbssk
K.Back-end