![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/qxFls/btsyujTqAxY/XSV7svmIPcxvvINwCgxYY1/img.png)
Overview 안녕하세요. '롤문철 닷컴' 서비스 개발자 쿠키입니다. 회원가입 고객을 대상으로 인증 메일을 보내는 기능에서 외부 API를 사용하였는데요. 외부 API의 오류가 서버 전체에 영향을 끼쳤습니다. 오늘은 이를 개선한 이야기를 얘기해보겠습니다. Problem 그림처럼 회원가입 서비스는 고객에게 인증 메일을 보내기 위해 내부적으로 메일 전송 서비스를 호출하는데요. 이 때, 메일 전송 서비스의 오류와 지연이 회원가입 서비스에도 영향을 줍니다. 간단하게 코드로 살펴볼까요? **회원가입 서비스** @Slf4j @RequiredArgsConstructor @Service public class MemberSignUpService { private final MemberJpaRepository membe..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/mwOhX/btsvbD9EHB2/AioRVs3dAbJA8iJpb3BgP1/img.png)
안녕하세요. spring-session-data-redis와 JPA를 함께 사용하면서 LazyInitializationException 예외가 발생했습니다. 이를 해결하기 위해 공부했던 내용을 정리해봤습니다. 문제 상황 먼저 문제가 발생한 당시의 상황을 정리해보겠습니다. 세션 기반 로그인 매커니즘 spring-session-data-redis를 사용 JPA Entity를 세션 저장소(redis)에 저장함 사용자가 로그인을 요청하면 MemberLoginService.login() 메서드가 호출됩니다. login() 메서드는 Member 엔티티를 세션에 저장합니다. spring-session-data-redis를 활용하여 WAS가 아닌 Redis에 Member 엔티티가 저장되도록 만들어 주었습니다. @Slf..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/biYCWz/btsqLveZa35/4t7gFwuOwsfBVLvaO2oyr1/img.png)
안녕하세요. 오늘은 순위 조회 쿼리를 개선한 이야기를 해보겠습니다. 초기 순위 페이지 조회 쿼리 많은 서비스에서 이런 순위 페이지를 제공하고 있습니다. 어떻게 구현할 수 있을까요? (포인트는 전부 다르다고 가정하겠습니다.) 간단하게 데이터베이스의 SELECT 문과 정렬 기능을 이용해 구현할 수 있습니다. 쿼리는 다음과 같습니다. SELECT nickname, point FROM member ORDER BY point DESC; 만약 데이터가 많아지면 어떻게 될까요? 1,000만 건의 데이터를 준비하고 실행해봤습니다. 4.807초가 소요됐습니다. 순위 페이지를 조회하는데 5.643초가 소요된다면 사용자가 얼마나 불편할까요? 데이터가 더 많아지면 더 오래 걸릴 것입니다. 이 문제를 해결하기 위해 페이징, N..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/1uD3K/btsplPVoCKD/LzOINct38uKhCuopdkkEk1/img.png)
지난 동시성 이슈 해결 1탄 에서는 코드 레벨에서 발생할 수 있는 동시성 이슈에 대해 알아봤습니다. 이번 편에서는 데이터베이스 레벨의 동시성 이슈와 해결방법에 대해 알아보겠습니다. 인터넷의 많은 글에서 동시성 해결방법에 관한 키워드(분산락, 낙관적락, 비관적락, Named Lock 등)를 볼 수 있는데요. 해당 용어들도 정리해보겠습니다. 데이터베이스 레벨의 동시성 이슈 - 트랜잭션 충돌 데이터베이스의 재고 데이터를 감소하는 명령이 3번 호출됐을 때를 가정해보겠습니다. 각 명령이 트랜잭션으로 처리된다고 생각해보면 위 그림과 같이 3개의 트랜잭션이 실행될 것입니다. 초기 재고량이 10이므로 기대하는 결과 값은 7입니다. 하지만 위 그림에서 확인되는 결과값은 9입니다. 이는 기대와는 다른 결과 값입니다. 즉,..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/ll9tr/btspgoWhGWD/Ee5xZoLfj8sewzldHs2o1k/img.png)
재고 처리 기능을 개발하는 과정에서 동시성 이슈가 발생하여 원인과 해결 방법에 대해 정리해 봤습니다. 내용은 "요구사항 구현" - "동시성 이슈 재현" - "원인 분석" - "해결 방법" 순서로 구성했습니다. 요구사항 구현 재고 처리 기능의 요구 사항은 다음과 같습니다. 사용자가 객실을 예약한다. 서버는 데이터베이스에서 관리중인 객실을 조회하고, -1 감소시킨 후 다시 저장한다. Stock 클래스는 재고를 저장하고 처리합니다. public class Stock { private int quantity; // 객실의 재고량 public Stock(int quantity) { this.quantity = quantity; } // 객실 재고를 1 감소시키는 기능 public void minusQuantity..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/bw56iM/btspflFesRC/KCrda1LADHDonnaGk7gjHk/img.png)
스프링 웹 애플리케이션을 만들었다. IDE 에서만 웹서버를 실행해봤지, 호스팅 서버에서 실행해본적은 없었다. 스프링 웹 애플리케이션을 호스팅 서버에서 실행시키기 위한 개념을 정리해봤다. What is JAR? Java ARchive의 줄임말이다. ZIP 파일 포맷이며 여러 개의 파일을 하나로 묶고 있다. JAR 파일의 주목적은 자바 애플릿(JVM이 내장된 웹 브라우저에서 실행할 수 있는 자바 바이트코드. 주로 플러그인을 만들 때 사용하는 듯 함)과 그에 필요한 구성 요소들을 묶어 한 번에 다운로드할 수 있도록 하는 것이다. JAR는 정의는 다음과 같다. 크로스 플랫폼 (모든 플랫폼에서 사용 가능한) 아카이브 포맷 오디오, 이미지, 클래스 파일을 다룰 수 있는 포맷 기존의 애플릿 코드와 호환 확장 가능하며..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/c8a5As/btsnEoSDUSY/FIHpC0meDGZBkEMDK9GnkK/img.png)
이 글에서는 연결리스트와 배열리스트의 차이, 그리고 성능 향상 사례를 대해 다룹니다. 연결리스트 vs 배열리스트 배열리스트(Array List) 연결리스트(Linked List) 구현 방법 - 배열을 이용하는 방식 - 여러 노드를 연결하는 방식 (노드: 데이터, 다음 노드 주소를 관리하는 객체) 조회 - 데이터가 연속된 공간에 저장 - 배열 0번째 주소 + (배열원소타입 크기 x 인덱스)를 계산하여 데이터 조회 - 시간복잡도: O(1) - 노드들은 불연속적인 공간에 저장 - 첫번째 노드부터 인덱스에 해당하는 노드에 도착할 때까지 순회 - 시간복잡도: 최악의 경우 O(n) 삽입 - 데이터를 삽입하려는 위치부터 모든 데이터를 한 칸 씩 미루고, 데이터를 삽입 - 배열은 크기가 정적으로 고정되어 있어, 배열이..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/czQfdj/btsl6Me4v8T/zYi2mK26gGNKuKyu8vVh91/img.png)
대부분의 사이트는 회원을 위한 서비스를 제공하기 위해 회원가입/로그인 기능을 제공합니다. 롤문철 닷컴은 마이페이지, 투표하기, 댓글달기, 재판 상세내용 조회 등 여러가지 서비스가 로그인을 필요로합니다. 그래서 '로그인 기능'을 위한 2가지 방안을 검토했습니다. ◼︎ JWT 토큰 ◼︎ 세션 어떤 방안을 선택할지 고민한 끝에 서비스의 보안성이 가장 중요하다고 생각하여 '세션'을 선택하게 되었습니다. '로그인 기능'의 요구사항은 다음과 같습니다. ✓ 로그인 ✓ 로그아웃 ✓ 악의적인 사용자 강제 로그아웃 ✓ 동시 접속자 1,000명 처리 ✓ 평균 응답시간 1,000ms 이내 위 요구사항을 JWT 토큰, 세션 두 가지 관점에서 설계/구현/성능검증(테스트)하고, 최종적으로 서비스의 '로그인 기능'에 세션을 활용하게..
- Total
- Today
- Yesterday
- F-LAB
- application.yml 분리
- GitHub Webhook
- T 인터뷰
- java 로그인
- 낙관적락
- 데이터베이스 동시성
- HTTP 완벽 가이드
- JWT 토큰
- C 인터뷰
- 랠릿
- 회고
- 분산락
- 비관적락
- 개발자 면접
- CI/CD
- NHN 면접
- NHN 엔터프라이즈 면접
- 더미데이터 생성
- Spring Application 서버 실행
- Jenkins
- CI/CD 파이프라인
- 디지털 청년 고민 해결단
- 동시성 이슈
- application.properties 분리
- CD 파이프라인 구축
- NHN 엔터프라이즈
- Docker 자동화 배포
- 디지털 청년 고민 해결단 온라인 멘토링
- 배열리스트
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |