✏️ 48

[MySQL] 조인 알고리즘 (Nested Loop Join, Hash Join)

1. Nested Loop JoinMySQL 서버에서 사용되는 대부분의 조인은 Nested Loop Join이다.조인의 연결 조건에 인덱스가 있는 경우 가장 일반적으로 사용되는 방식이다.이는 중첩된 반복 명령을 사용하는 것처럼 작동한다.for (row1 IN A) { for (row2 IN B) { if (condition_matched) return (row1, row2); }}2개 이상의 테이블에서 하나의 집합을 기준으로 순차적으로 상대방 row를 결합하여 원하는 결과를 조합한다. 드라이빙 테이블(조인을 시작하는 외부 루프 테이블)에서 한 row씩 꺼내서 드리븐 테이블(내부 루프에서 탐색 대상이 되는 테이블)에서 그에 맞는 row들을 찾는 구조이다.✅ 드라이빙 테이블의 row 수가 많을 경우..

✏️/Database 2025.07.16

[DB] Pagination (Offset vs Cursor)

Pagination이란?데이터를 여러 페이지 단위로 묶어서 보여주는 기법1. Offset 기반 PaginationSELECT * FROM posts ORDER BY created_at DESC LIMIT 10 OFFSET 20;OFFSET과 LIMIT으로 원하는 페이지 구간을 잘라서 가져온다.OFFSET: 어디에서부터 데이터를 가져올 것인지?LIMIT: 몇 개를 가져올 것인지?페이지 버튼과 함께 사용할 때 유리함구현이 간단하고, 페이지 점프가 가능하다. SELECT * FROM posts ORDER BY created_at DESC LIMIT 40 OFFSET 0; SELECT * FROM posts ORDER BY created_at DESC LIMIT 40 OFFSET 40; SELECT * F..

✏️/Database 2025.07.16

[Spring Boot] 동시성 제어 (4) - Redis

** 본 글은 인프런 재고시스템으로 알아보는 동시성이슈 해결방법> 을 수강한 후 작성한 글입니다.동시성 문제 해결 방법 3. RedisLettucesetnx 명령어를 활용하여 분산락 구현spin lock 방식: 락을 획득하지 못한 경우 락을 획득하기 위해 계속 요청을 보낸다.별도의 retry 로직 작성이 필요하다.Redissonpub/sub 방식: 채널을 하나 만들고 락을 점유 중인 스레드가 락을 획득하려고 대기 중인 스레드에게 해제를 알려주면, 안내를 받은 스레드가 락 획득을 시도한다.별도의 retry 로직 작성이 필요하지 않다.Redis 설치docker pull redisdocker run --name myredis -d -p 6379:6379 redisLettuce를 이용하여 재고 감소 로직 작성하..

✏️/Spring 2024.11.12

[Spring Boot] 동시성 제어 (3) - Database

** 본 글은 인프런 재고시스템으로 알아보는 동시성이슈 해결방법> 을 수강한 후 작성한 글입니다.동시성 문제 해결 방법 2. DatabaseMySQL 활용Pessimistic Lock실제로 데이터에 Lock을 걸어 정합성을 맞추는 방법데드락이 걸릴 수 있다.Optimistic Lock실제로 Lock을 사용하지 않고 버전을 이용함으로써 정합성을 맞추는 방법먼저 데이터를 읽은 후에 update를 수행할 때 현재 내가 읽은 버전이 맞는지 확인하며 업데이트Named Lock이름을 가진 metadata locking이름을 가진 Lock을 획득한 후 해제할 때까지 다른 세션은 이 Lock을 획득할 수 없도록 한다.트랜잭션이 종료될 때 Lock이 자동으로 해제되지 않기 때문에 별도의 명령어로 해제를 수행해주거나 선점..

✏️/Spring 2024.11.11

[Spring Boot] 동시성 제어 (2) - Synchronized

** 본 글은 인프런 재고시스템으로 알아보는 동시성이슈 해결방법> 을 수강한 후 작성한 글입니다.동시성 문제 해결 방법 1. SynchronizedSynchronized자바의 Synchronized 를 이용해보자.Synchronized 를 메서드 선언부에 붙여주면 해당 메서드는 한 개의 스레드만 접근이 가능하게 된다. @Transactionalpublic synchronized void synchronizedDecrease(Long id, Long quantity) { // Stock 조회 Stock stock = stockRepository.findById(id) .orElseThrow(() -> new RuntimeException("Stock을 조회할 수 없습니다.")..

✏️/Spring 2024.11.10

[Spring Boot] 동시성 제어 (1) - 동시성 문제, 재고 감소 시스템 구현 및 테스트

** 본 글은 인프런 재고시스템으로 알아보는 동시성이슈 해결방법> 을 수강한 후 작성한 글입니다.동시성 문제를 해결하지 않으면?Race Condition!→ 두 개 이상의 프로세스가 공통 자원을 병행적으로(concurrently) 읽거나 쓰는 동작을 할 때, 공용 데이터에 대한 접근이 어떤 순서에 따라 이루어졌는지에 따라 그 실행 결과가 같지 않고 달라지는 상황재고 감소 시스템 구현 및 테스트재고 감소 로직 작성엔티티 생성 package com.example.stock.domain; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; impo..

✏️/Spring 2024.11.09

[JPA] 엔티티 equals 메서드 구현 시 주의할 점

개발 진행 중, 프론트 분께 아래와 요청을 받았다.해당 내용을 확인해보니, Member에 equals 메서드를 이렇게 구현하고 있었다.@Overridepublic boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Member member = (Member) o; return Objects.equals(idMember, member.idMember);}프린트 찍어보니까하나는 프록시 객체라서 false를 반환했던 것..!그래서 하이버네이트 객체의 클래스를 불러오도록 수정해줬다.@Overridepublic boolean equals(Ob..

✏️/Spring 2024.11.08

[JPA] Join Fetch 시 MultipleBagFetchException

문제프로젝트를 진행하다가org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags이런 에러가 떴다.원인하나의 Member 엔티티에서@OneToMany(mappedBy = "member", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)private List profileImages;@OneToMany(mappedBy = "member", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)private List fevers;두 개의 OneToMan..

✏️/Spring 2024.11.07

[Spring] OpenFeign 사용해보기

💡 OpenFeign이란?Netflix에 의해 처음 만들어진 Declarative(선언적인) HTTP Client 도구로써, 외부 API 호출을 쉽게할 수 있도록 도와준다. Open Feign은 인터페이스에 어노테이션들만 붙여주면 구현이 된다. 이러한 방식은 Spring Data JPA와 유사하며, 상당히 편리하게 개발을 할 수 있도록 도와준다.라이브러리 추가ext { set('springCloudVersion', "2023.0.1")}dependencyManagement { imports { mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" }}dependencies { ..

✏️/Spring 2024.05.22

[JPA] 엔티티 생성 시 생겼던 문제들 (식별관계 문제)

📍 EnjoyTrip 프로젝트에서 엔티티를 만들 때 생겼던 문제 기록 우선 나는 계속 안드로이드 개발 + 짜잘한 것만 깔짝깔짝 대다가.. 백엔드 개발을 한지 얼마 안 된 상태였다.첫 프로젝트에서는 다른 팀원분께서 엔티티를 만들었고, 나는 JPA를 익히는데 더 집중해서 개발을 했다. 이 프로젝트에서는 기존 ㅆrㅍi에서 준 Dump 파일이 이미 존재했고, MyBatis를 이용하여 프로젝트를 진행하면 됐는데,우리는 어차피 2학기 때 JPA를 쓸 것이기 때문에 미리 연습해보자. 라는 취지로 JPA로 프로젝트를 바꿔서 진행했다.따라서 엔티티를 만들어야 했는데, 그것을 내가 하기로 했다. 이땐 처음이라 연관관계 설정하는게 어려웠다.특히나 ㅆrㅍi에서 준 Dump 파일을 그대로 넣고 + 우리의 커스텀 기능을 만들어..

✏️/Spring 2024.03.17