본문 바로가기

프로젝트5

비동기 처리를 위한 transactional outbox pattern 적용 진행한 프로젝트 성능 테스트 중에 아래와 같은 오류 메시지를 보았습니다. 사용자 인증 메일은 gmail을 사용해서 전송하는데, gmail 사용 약관을 확인해보니 일반 계정은 하루 최대 500개의 전송 제한이 있는 것을 확인했습니다. 이 에러는 보낼 수 있는 메일의 허용 범위를 늘리면 해결이 가능할 것으로 생각됩니다. 하지만 여기서 확인해야 할 문제는 '메일 전송에 실패하면, 회원 가입이 취소가 된다.'입니다. '인증 메일을 보낸다' 기능은 외부 API에 의존하고 있습니다. 외부 의존성은 제가 관리할 수 있는 요소가 아닙니다. SMTP 서버에 어떤 장애가 발생하거나 한도를 초과해서 요청이 거부될 수 있습니다. 하지만 이러한 문제가 제 서비스에 영향을 주어서는 안됩니다. 1. 고려 사항 1.1 요청이 거부될.. 2023. 1. 5.
Spring Batch 페이징 쿼리 성능 개선하기 진행한 프로젝트에서는 인증 메일 전송을 Spring Batch를 활용해서 구현했습니다. Spring Batch에서는 2개의 Reader를 제공하는데, Cursor와 Paging입니다. Cursor는 데이터베이스와 커넥션을 맺은 후 Cursor를 옮겨가며 데이터를 조회합니다. 반면에 Paging은 페이지 단위로 데이터를 한 번에 조회해오는 방식입니다. limit과 offset을 pageSize에 맞게 자동으로 생성해서 전달해 줍니다. 사용자가 갑자기 몰릴 경우에 Cursor 방식보다 Paging 방식이 더 효율적인 구현이라 판단하고 Paging 방식을 선택하였습니다. Paging방식으로 ItemReader 인터페이스를 구현한 다양한 구현체들이 있는데, 현 프로젝트에서 사용하는 것은 Mybatis이기 때문에.. 2023. 1. 4.
비밀번호 해시 함수 고민과 선택 비밀번호는 법적으로 '일방향 암호화'를 하도록 정해졌습니다. 즉, 복호화가 불가능하도록 저장해야 합니다. 사용자가 비밀번호를 '1234'로 저장했고, DB에 저장된 정보가 'ad1432@!'이라면 사용자는 'ad1432@!'를 입력하지 않습니다. 그렇다면 '1234'를 'ad1432@!'로 바꾸는 기법이 있을 텐데 이러한 기법을 '해싱'이라고 합니다. 이 글은 해싱에 대한 정의와 단방향 해시 함수, 적용한 기법에 대해 조사하고 정리했습니다. 1. 해싱이란? 해시 함수(Hash Function)는 임의의 길이의 데이터를 고정된 길이의 데이터로 맵핑하는 함수를 뜻합니다. 이를 통해 얻은 값은 '해시 코드, 값'이라고 합니다. 여기서 입력 값이 Key가 되고 해쉬 함수를 통해서 나온 '코드'를 통해서 자료를 .. 2022. 9. 25.
Scale-Up과 Scale-Out 각 장단점은 무엇일까? (Session Storage, 세션 불일치) 서버 1대가 감당할 수 있는 요청은 한계가 있습니다. Tomcat의 경우 요청 1개를 1개의 스레드 풀에서 가져와 사용하는데, 기본 설정 값이 200으로 돼 있습니다. 그렇다면 그 이상의 요청은 어떻게 될까요? 일단 TCP 연결이므로 Connection Timeout이 발생하기 전까지 대기할 것입니다. 하지만 요청을 전부 처리하기 전에 Timeout이 발생할 경우, 요청을 받지 못하고 연결이 종료가 될 것입니다. 이 부분은 지연이 발생하는 부분을 개선하여 문제를 해결할 수 있을 겁니다. 만약 감당할 수 없는 만큼의 요청이 들어올 경우 어떻게 될까요? 예를 들어 Thread도 메모리 영역에 있습니다. 우리가 스레드 풀 크기를 늘려도 메모리 공간이 부족하면 Thread를 생성할 수 없어 요청을 처리할 수가 .. 2022. 9. 22.