Develop
-
좋은 서버 쓰면 되잖아? - 인덱스 성능 설계 및 분석 (1)Develop 2025. 8. 13. 15:25
TLDR;좋은 인덱스 설계 방법을 통해 성능을 개선할수 있다. 개요왜 DB 최적화가 필요한가? (why-optimization) 많은 개발자들이 서버 성능을 높이는 것(scale-up)으로 성능 문제를 해결하려 합니다. 하지만...서버 성능 업그레이드의 현실비용 효율성: 서버 성능 향상은 비용이 기하급수적으로 증가물리적 한계: 아무리 좋은 서버도 결국 한계 존재근본적 해결 아님: 비효율적인 쿼리는 여전히 비효율적확장성: 데이터 증가 시 문제는 더욱 심화 현재 상황 살펴보기상품 테이블 구조create table products( id bigint auto_increment primary key, name varchar(255) null, brand_id big..
-
WIL - 트랜잭션과 동시성 제어Develop 2025. 8. 10. 00:45
주간 학습 회고 (Weekly I Learned)이번 주에는 동시성 이슈 해결을 위한 데이터베이스 트랜잭션 및 락(Lock) 메커니즘을 심도 있게 학습했습니다. 특히 여러 사용자의 동시 주문 요청 시 발생할 수 있는 데이터 정합성 문제를 해결하고, 안정적인 서비스를 구축하는 데 집중한 한 주였습니다.🧠 이번 주 학습 성과- 트랜잭션과 격리 수준: 데이터베이스 트랜잭션의 동작 원리와 격리 수준(Isolation Level)에 대해 학습하며, 데이터 무결성을 보장하는 기본 원리를 이해했습니다. - 동시성 제어: 실제 시나리오에서 발생하는 동시성 문제를 해결하기 위해 비관적 락(Pessimistic Lock)과 낙관적 락(Optimistic Lock)을 학습하고 코드에 직접 적용했습니다. - 복합 도메인 트..
-
DB 락 전쟁의 서막: 쿠폰 시스템, 비관이냐 낙관이냐 그것이 문제로다Develop 2025. 8. 8. 08:44
상품 주문 시 쿠폰 사용, 어떤 락(Lock)이 현명한 선택일까?온라인 쇼핑몰에서 상품을 주문할 때, 많은 사용자들이 할인 쿠폰을 사용합니다. 만약 인기 있는 쿠폰이라 동시에 여러 사용자가 사용하려고 한다면 어떻게 될까요? 혹은 한정된 수량의 쿠폰이라면? 이때 동시성 문제가 발생할 수 있으며, 이를 해결하기 위해 데이터베이스 락(Lock)을 사용해야 합니다. 이번 글에서는 상품 주문 시 쿠폰 사용과 같이 동시성 제어가 중요한 상황에서 어떤 락 전략을 사용하는 것이 적절한지, **비관적 락(Pessimistic Lock)**과 **낙관적 락(Optimistic Lock)**을 중심으로 비교하고 분석해 보겠습니다.비관적 락 (Pessimistic Lock) 이란?비관적 락은 이름에서 알 수 있듯이, 동시에 ..
-
사용자가 '좋아요' 버튼을 두 번 누르면 어떻게 될까?Develop/Spring 2025. 7. 25. 13:51
TL;DR안전한 '좋아요' 기능을 위해, 토글(toggle) 방식의 API 대신 중복 요청에도 결과가 동일한 멱등성 설계(예: POST로 생성, DELETE로 삭제)를 적용해야 합니다.1. '좋아요' 기능, 왜 멱등성이 중요할까? 🤔'좋아요' 버튼을 누르는 간단한 동작 이면에는 네트워크 오류나 사용자의 중복 클릭과 같은 잠재적 위험이 존재합니다. 만약 API가 이러한 중복 요청을 제대로 처리하지 못하면, 사용자의 의도와 달리 '좋아요'가 즉시 취소되거나 데이터가 꼬이는 문제가 발생할 수 있습니다. 멱등성이란?동일한 요청을 여러 번 보내도 언제나 같은 결과를 만들어내는 성질입니다. 신뢰성 있는 API를 만들기 위해 멱등성 설계는 선택이 아닌 필수입니다. ✅ 멱등성이 보장되는 메서드: GET, PUT,..
-
TDD 기반 테스트 코드 도입기Develop/Spring 2025. 7. 18. 17:00
TL;DR소프트웨어의 안정성을 높이고, 유지보수를 용이하게 하며, 궁극적으로는 총 개발 비용과 시간을 줄이기 위해 테스트 코드를 도입합니다. 들어가며 테스트 코드를 작성 하는 이유 1. 안정성 확보새로운 기능 추가나 코드 수정 시, 기존 기능이 고장 나는 것을 방지하는 안전망 역할을 합니다. 이를 통해 언제든 자신감을 갖고 코드를 변경할 수 있습니다. 2. 자동화 된 테스트로 시간 절약 가능Postman을 이용한 수동 API 테스트는 매번 직접 API를 호출하고 결과를 눈으로 확인해야 합니다. 코드가 복잡해지고 수정이 잦아질수록, 모든 API를 일일이 테스트하는 것은 매우 비효율적입니다.테스트 코드를 작성하면 이 모든 과정을 자동화하여, 단 몇 초 만에 수백 개의 테스트를 실행할 수 있습니다.기능..
-
JWT 인증 방식Develop/Spring 2022. 11. 18. 11:13
JWT 란? JSON Web Token(JWT)의 약어로 인증에 필요한 정보들을 담은 JSON 형태의 토큰 클라이언트와 서버 사이 통신 시 권한 인가(Authorization)를 위해 사용 JSON 데이터를 Base64 URL Encode를 통해 인코딩하여 직렬화 JWT토큰(Access Token)을 HTTP 헤더에 담아서 서버가 클라이언트를 식별하기 때문에 민감 정보를 토큰 안에 넣게 된다면 위험 JWT의 구조 Header: 토큰의 타입(typ)이나, 알고리즘(alg)을 저장 Payload: 토큰에서 사용할 정보의 조각(Claim) 저장 (실제 JWT 를 통해서 알 수 있는 데이터) iat : 토큰 발급시간 exp: 토큰 만료 시간 Signature: 서버에서 해당 토큰이 유효한지 아닌지를 구분 할 수..
-
Wrapper 클래스 사용 시 주의 해야하는 이유?Develop/Java 2022. 9. 20. 11:51
1. wrapper 클래스 란? 기본타입의 데이터를 객체로 취급해야 하는 경우에 기본 타입의 데이터를 그대로 사용할 수 없다. 이때에는 기본 타입의 데이터를 먼저 객체로 변환한 후 작업을 수행해야 한다. 이렇게, 8개의 기본 타입에 해당하는 데이터를 객체로 포장해 주는 클래스를 래퍼 클래스(Wrapper class)라고 한다. 2. 박싱(Boxing)과 언박싱(Unboxing) JDK 1.5부터는 기본형을 참조형으로 자동으로 변환해주는 박싱, 참조형을 기본형으로 자동변환해주는 언박싱을 지원해준다. 3. wrapper 클래스 사용 시 주의사항 3-1. == 사용시 문제 Integer a=1000, b=1000; System.out.println(a == b); //false Integer c=100, d=..
-
가변인자(varargs)는 실제 런타임(Runtime) 시 어떻게 작동 할까?Develop/Java 2022. 9. 13. 11:19
가변인자 란? 기존에는 메서드의 매개변수의 개수가 고정적이어서 컬렉션이나 배열을 통해 사용했다. JDK1.5부터 동적으로 매개변수를 지정하는 가변인자라는 것이 생겼다. 아래와 같이 파라미터 변수에 ...을 파라미터 변수명 앞에 붙여주면 된다. public void testVarargs(String... d) { //... } 가변인자를 사용하는 대표적인 메소드는 PrintStream의 printf()이다. /* * @since 1.5 */ public PrintStream printf(String format, Object ... args) { return format(format, args); } 사용 시 주의 할 점 가변인자는 여러개 사용될 수 없고, 가변인자는 항상 마지막에 있어야 한다. (가변인자..