DB 5

[JPA] 동시성 이슈 해결 - 트랜잭션 격리 수준과 낙관적 락

더보기토이 프로젝트 게시글 참가를 하는 과정에서 동시성 이슈가 발생할 수 있다는 점을 깨달았다.인원 제한이 있을 경우, 예외를 발생시키고 참가를 할 수 없도록 로직을 작성하기는 했으나 만약 다수의 인원이 동시에 참가버튼을 누른다면 동시성 이슈가 발생할 수 있다고 생각했다. (이걸 왜 이제서야.... 그래도 알게되서 다행이다.)이를 해결하기 위해 방안을 찾아보던 중, 낙관적 락에 대해서 알게되었고 점차 리팩토링 해갈 예정이다. 그리고 공부하며 DB 내의 트랜잭션 격리 수준과 JPA 에서 지원하는 낙관적 락, 비관적 락에 대해서 알게되었는데 이를 한 번 정리해보고자 한다.  1. 트랜잭션이란?데이터베이스의 상태를 변화시키기 위해 수행하는 작업의 단위  즉, 데이터베이스 질의어를 통해 데이터를 변화시는 것을 ..

DB 2024.04.30

[JPA] N+1 문제와 해결법

토이 프로젝트를 진행하던 중 무수히 많은 N+1 문제를 만날 위기에 봉착했다. (....) 주로 컬렉션 연관관계를 조회하던 중 이러한 참사가 일어날 뻔 했는데, 그 때마다 강의를 보고 공부했던 내용과 구글링(...)을 통해 해당 문제들을 해결할 수 있었다. JPA에서 발생할 수 있는 N+1 문제와, 이를 어떻게 적절하게 해결할 수 있을지 정리하기 위해 글을 적고자 한다. 1. N+1 문제란? JPA는 객체로 관계형 데이터베이스의 테이블 속 칼럼을 관리한다. 이 과정에서 객체는 서로 연관관계를 가질 수 있는데, 이 과정에서 N+1 문제가 발생한다. 개발자가 1 개의 쿼리를 날렸을 때, 해당 객체가 가지고 있는 연관관계의 객체들을 조회 하는 이유(N)로 추가적인 쿼리가 나가는 것을 N+1 문제라고 한다. 2..

DB 2024.04.24

[JPA] 다대다(N:M) 관계를 지양하는 이유와 해결법

토이 프로젝트를 진행하며 연관관계 매핑을 하던 중 다대다 관계를 만난 적이 있다. 게시글(Project)과 카테고리(Skill)가 바로 그 관계였다. 다대다 관계매핑은 최대한 지양하는 것이 좋다고 배웠기에 중간 테이블을 만들어 1:N 과 N:1 관계로 풀어주었다. 위와 같이 @ManyToMany를 사용하지 않은 이유를 복습하기 위해 글로 정리해보려 한다. 1. 다대다 관계 먼저, 프로젝트에서 정의한 도메인은 다음과 같다. Project : 개발 프로젝트 인원을 구하는 모집글 테이블 Skill : 카테고리 (개발 언어) 테이블 ERD는 아래와 같다. (관계형 데이터베이스에서는 다대다 관계가 없기 때문에 연결을 할 수 없어 이는 생략했다...) 위의 관계가 다대다 관계가 되는 이유는, 하나의 모집글은 여러 ..

DB 2024.04.20

[JWT] RefeshToken 관리로 Redis를 선택한 이유

토이 프로젝트를 진행하며 사용자를 인증하는 부분에서 JWT를 사용하였다. 사용자의 인증 정보는 Access Token에서 관리하였고, Access Token의 보안을 위해 Refresh Token을 도입하였다. 이 과정에서 Refresh Token을 관리하기 위해 Redis를 도입하였다. 전체 로직을 도입한 이유를 복습하기 위해 글로 정리해보려 한다. 1. JWT란 Json Web Token의 약어. 서버와 클라이언트 사이에서 통신할 때 권한을 확인하기 위해 사용하는 토큰이다. Token 인증 과정 1. 클라이언트가 서버에 접속할 경우(로그인), 서버가 해당 클라이언트에게 인증되었다는 의미로 토큰을 부여한다. 2. 토큰을 발급받은 클라이언트는 서버에 또 다른 요청을 보낼 때 요청 헤더에 토큰을 심어서 보..

DB 2024.04.19

SQL 기본 문법 정리

Column : 테이블 상에서 단일 종류의 데이터. Ex) Member 테이블에서 name, phone 등등 Row : 테이블의 컬럼들의 값의 조합 Ex) Member 테이블에서 한 회원의 관련한 정보는 한 Row가 될 수 있다. PK : 행을 구분할 수 있게 하는 컬럼 Ex) Member 테이블의 Mno (회원번호) FK : 다른 테이블의 PK 시퀀스 : 자동으로 고유한 숫자값을 생성해주며 주로 기본 키 값을 생성하기 위해 사용 인덱스 : 쿼리 속도를 향상 (빨리 찾을 수 있게 정렬되어 있다) 스키마 : 객체의 집합으로서 테이블의 소유자를 의미 SQL 명령어의 기본부류 테이블에 새로운 행을 입력,기존의 행을 수정,데이터 삭제 등 데이터 조작에 관한 명령어 Select (R) : 얘는 DML 아니다 In..

DB 2023.06.21