전체 글 36

트랜잭션 격리수준(Isolation Levels)

트랜잭션이란?트랜잭션이란 데이터베이에서 하나의 논리적 작업 단위를 의미한다. 여러 개의 SQL 연산이 하나의 트랜잭션 내에서 실행되며, 트랜잭션이 성공적으로 수행될 경우 모든 사항이 반영되지만 실패할 경우 변경 사항이 롤백되며 복구된다. 트랜잭션 ACID 속성1. 원자성(Atomicity)트랜잭션 내의 모든 작업이 성공적으로 수행되거나 전혀 수행되지 않도록 보장하는 속성예시: 계좌 이체에서 한 계좌에서 돈을 빼고 다른 계좌에 입금하는 두 개의 연산 중 하나라도 실패하면 전체 트랜잭션이 취소 2. 격리성(Isolation)동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않도록 하는 속성예시: 두 사용자가 같은 계좌의 데이터를 수정할 경우, 격리 수준이 낮으면 데이터 충돌이 발생 가능 3. 일관성(Consi..

개발/DB 2025.03.27

동시성(명시적 락)

명시적 락(Explicit Lock)앞서 synchronized를 사용할 때 멀티 서버 환경에서의 동시성 제어 한계를 해결하기 위해서 나온 방법이 명시적 락이다. 애플리케이션 코드나 데이터베이스 쿼리에서 명확하게 락을 요청하여 특정 리소스에 대한 접근을 제어하는 방식이다.아래는 대표적인 명시적 락의 종류이다. 하나씩 살펴보자낙관적 락(Optimistic Lock)비관적 락(Pessimistic Lock)네임드 락(Named Lock)낙관적 락(Optimistic Lock)낙관적 락은 어플리케이션 레벨에서 동시성을 제어하는 방식으로 충돌이 발생할 것이라고 '낙관적'으로 가정하고, 실제로 충돌이 발생했을 때만 대응하는 방법이다. 데이터베이스에 대한 변경이 드물게 발생하고, 충돌 가능성이 낮은 환경에서 유용한..

개발/spring boot 2025.02.12

OAuth2.0

Oauth?Open Authorization의 약자로 인터넷 사용자들이 비밀번호를 제공하지 않고 다른 웹사이트 상의 자신들의 정보에 대해 웹사이트나 애플리케이션의 접근 권한을 부여할 수 있는 위한 개방형 표준이다. 쉽게 말해 사용자가 자신의 비밀번호를 공유하지 않고도 다른 애플리케이션이 특정 작업을 수행하도록 허용하는 인증 방식이다.주요 용어 Authorization Code 엑세스 토큰을 얻기 위한 중간 단계로 사용되는 코드 Scope 클라이언트가 리소스에 대하여 어떤 작업을 수행할 수 있는지 정의한 문자열Access Token리소스 서버로부터 리소스 소유자 정보를 얻을 때 사용하는 tokenRefresh Tokenaccess token 만료시 갱신을 위한 tokenOAuth2.0 구성 Resource..

개발/CS 2025.01.21

동시성(synchronized)

틀린 부분이 있다면 피드백 주시면 감사합니다! 프로젝트를 진행하면서 조회수 불일치 문제를 겪은적이 있다. 당시 3주라는 짧은 기간에 기능 구현하기 급급해서 블로그 슥 보고 Redisson을 활용해서 분산락 방식으로 해결한 적이 있다. 프로젝트 끝나고 나서 동시성 문제가 왜 생기는지 알아보면서 멀티 스레드 환경에서 동시성 문제는 꼭 이해하고 넘어가야 한다는걸 느꼈다.  동시성 문제란?여러 작업(스레드, 프로세스, 트랜잭션)이 동시에 같은 데이터나 자원을 수정하려고 하면 문제가 발생할 수 있으며 이를 동시성 문제라고 한다.여기서 다룰 내용은 데이터베이스의 저장된 데이터에 여러 작업이 동시에 수행될 때 의도하지 않은 작업 결과가 발생하는 경우라고 가정한다. 가장 쉬운 예시로 흔히 재고 시스템에서의 동시성 문제..

개발/spring boot 2025.01.04

전략 패턴과 팩토리 메소드 패턴 리팩토링

요구사항회원가입 시 이메일 인증비밀번호 찾기 시 이메일 인증문제점기존 코드의 경우 각 상황별로 API들이 존재하면서 그에 맞게 서비스 로직도 구현되어 있음 즉 똑같은 로직들이 반복 될 수 밖에 없는 구조Before CodeAuthController@Operation(summary = "이메일 인증번호 생성 API")@Parameter(name = "email", example = "teamluckyvickyblurrr@gmail.com")@GetMapping("/email/{email}")public ResponseEntity createEmailAuth(@PathVariable("email") String email) { return ResponseEntity.ok(memberService.cre..

개발/spring boot 2025.01.03

JPA

JPA란?JPA는 Java Persistence API의 약자로, 자바 진영의 ORM(Object Relational Mapping) 기술 표준입니다. 간단히 말해, 애플리케이션의 객체와 데이터베이스 사이에서 매핑 작업을 담당하여 개발자가 보다 객체지향적으로 데이터를 다룰 수 있도록 돕는 기술이다.ORM이란?Object Relational Mapping은 객체와 관계형 데이터베이스를 매핑하며 패러다임 불일치를 해결해주는 기술패러다임 불일치란?객체지향 프로그래밍은 상속, 다형성, 캡슐화 같은 개념에 중점을 두지만, 관계형 데이터베이스는 데이터 중심적이며 이러한 개념이 존재하지 않는다. 객체지향적인 부분과 데이터 중심에서의 차이를 '패러다임 불일치'라고 한다.  JPA는 자바 진영의 ORM API 표준 명세..

개발/JPA 2024.11.22

[Spring] Quartz 도입기 2

Quartz 도입기 1Github Code : batch quartz demo 목표1편에서 정리한 내용 바탕으로 기능을 구성해보자. 최종적으로 구현할 스케줄러는 2개며 Listener도 추가해보고 여러가지를 해보도록 하자외부 서버에서 5분마다 새로운 상품 데이터 가져오는 배치 Job 실행5분 간격으로 등록 상품들 이상 서버로 전달하는 배치 Job 실행중요한 작업은 배치에서 처리 하기 때문에 사실 스케줄러는 크게 어려울게 없다.  Job 정의외부 서버에서 5분마다 새로운 상품 데이터 가져오는 배치 Job 실행@RequiredArgsConstructor@Slf4jpublic class FirstJob extends QuartzJobBean { //batch JobLauncher private final..

개발/spring boot 2024.11.21

[백준] 1374 강의실

https://www.acmicpc.net/problem/1374 풀이구하고자 하는 것 : 필요한 최소 강의실 개수 해당 값을 구하기 위해 우선 시작 순서가 빠른 순서로 정렬 만약 시작 시간이 같다면 끝나는 시간이 더 빠른 걸로 정렬 no시작 시간종료 시간3214138562086272713412186152172025 강의실이 필요한 경우는이전 강의 종료 시간 > 다음 강의 시작 시간해당 경우에 강의실이 추가로 필요하다. 위 예제로 한번 천천히 보자 3번 강의(2 - 14)는 1번 강의실을 사용한다.1번 강의(3 - 8)는 1번 강의실이 이미 사용중이므로 2번 강의실에서 진행5번 강의(6 - 20) 또한 1,2번 강의실이 모두 강의 진행 중이므로 3번 강의실에서 진행 이런식으로 가다가 4번 강의(12 - ..

개발/PS 2024.11.05

[백준] 1038 감소하는 수

https://www.acmicpc.net/problem/1038 풀이찾고자 하는 값은 N 번째 감소하는 수를 찾아내면 된다. N번째 감소하는 수를 찾는 법은 굉장히 간단하다. 1~9까지 각 숫자로 시작하는 경우에서 나올 수 있는 값들을 찾으면 된다. 예시를 들어보면 가장 큰 자릿수가 2라고 했을 때  2, 20, 21, 210 이런 값들을 구해 나가면 된다.  해당 값들은 재귀를 통해서 찾아낼 수 있다.  % 10을 하는 이유는 해당 값의 1의 자리 수 다음으로 올 수 있는 값의 범위를 알아야 하기 때문이다. 예시로 num = 543일 경우 1의 자리 3 다음으로 올 수 있는 경우는 0,1,2재귀(int num) { for(int i = 0; i  전체 코드import java.io.BufferedRe..

개발/PS 2024.11.02

[Spring] Quartz 도입기 1

처음 공부한 내용이라 틀린 부분이 있을 수도 있습니다........Github Code : batch quartz demo1 도입기기업 연계 프로젝트를 진행하면서 아래와 같은 기능이 필요하게 됨5분 간격으로 상품 증분데이터를 받아와야 하는 기능상품 데이터의 이상치 검사를 위해서 받은 상품 데이터들을 하나의 배치 ID로 매핑해서 이상치 검사 서버로 보냄일정 주기로 동작(대충 스케줄링?)+ 데이터를 묶어서 처리(음...배치?)를 생각하게 됨대용량 수준까지는 아니지만 반복적인 작업을 처리하고 새로운 상품 데이터의 처리라는 점에서 작업 관리가 중요하다고 생각함Scheduling?일정한 시간 간격으로 반복적인 작업을 수행하는 도구특정 작업을 주기적 혹은 일정 시간이 지난 후에 작업을 수행할 수 있으며 효율적인 작..

개발/spring boot 2024.10.31