본문 바로가기

전체 글12

JVM과 Call Stack (Stack, Frame) Stack? 스택은 자료를 넣고(Push), 가장 최근에 넣은 자료를 뺄 수 있는(Pop) 동작을 가진 Abstract Data Type(ADT)이다. 이처럼 먼저 넣은 자료가 나중에 나오는 것을 LIFO(Last In, First Out) 구조라고 한다. Call Stack? 컴퓨터의 서브루틴(== 프로시저 == 함수 == 메소드) 정보를 저장하기 위해 사용하는 스택 자료구조이다. Control Stack, Runtime Stack, Execution Stack, Stack 라고도 불린다. P1 -> P2를 호출할 때 넘기는 파라미터와 P1 리턴주소를 Call Stack에 Push한다. (P2->P3도 동일) P2 -> P1로 리턴할 때 P2는 자기 자신의 local variable만 Pop을 하고 파.. 2023. 1. 29.
ANSI SQL-92에 대한 비평 (원문 : A Critique of ANSI SQL Isolation Levels) - 다양한 이상현상들 지난번에는 제가 조사한 내용을 바탕으로 간략한 역사와 논문이 나오게 된 이유를 알아봤습니다. 해당 분야에 전문가가 아니기 때문에 반드시 참고자료를 확인하시길 바랍니다. 또한 피드백은 적극 환영합니다! 그렇다면 논문에서 제시하는 고립 수준과 이상현상은 무엇일까요? 또한 굳이 알 필요가 있을까요? 제 생각은 '모든 내용을 알 필요는 없지만, 대략적인 내용은 알고 있어야 한다.'입니다. 왜냐하면 DBMS마다 고립 수준을 나타내는 용어도 다르고 그들이 구현한 방법도 다릅니다. 또한 논문이 제시된 이유가 '모호함을 개선'이기 때문에, 이러한 '모호함에서 발생할 수 있는 문제'가 있을 것입니다. 즉, 데이터베이스의 선택 혹은 발생한 문제를 빠르게 이해하는데 도움이 된다고 생각합니다. 1. 개요 저번 글에서도 확인하.. 2023. 1. 13.
비동기 처리를 위한 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.