본문 바로가기

전체 글56

[JPA] 1 : N 연관관계에서 limit 사용 시 OutOfMemory가 발생하는 문제 해결 0. 이 글을 쓰게된 이유 팀원분이 성능 최적화를 하려고 짧은 시간에 많은 요청을 보내던 중 OutOfMemory 예외가 발생했다. 평소에는 괜찮다가 왜 이런 문제가 발생했는지 알아보던 중에 배웠던 것을 기록하기위해 이 글을 쓰게 되었다. 1. Entity 연관관계 다음과 같이 Roadmap Entity와 RoadmapTag Entity가 있고, 이 둘은 1 : N 연관관계를 가지고있었다. 로드맵 실제로는 이것보다 훨씬 연관관계가 많고 복잡한 엔티티이지만 해당 연관관계만 보여주겠다. 로드맵 태그 2. 문제 상황 로드맵과 로드맵 태그를 같이 조회하는 상황이다. 이때, 로드맵 태그가 Lazy Loading이 설정이 되어있으니, 각 로드맵의 태그에 접근할때마다 쿼리가 나갈것이다. 그래서 fetch join을 .. 2023. 10. 5.
[Spring] Event로 느슨한 결합 찍먹하기 0. 이 글을 쓰게 된 이유 이번 프로젝트를 진행하며 Event를 활용하여 요구사항을 해결한 적이 있다. 그 과정을 기록하고자 이 글을 쓰게 되었다. 1. 쉽지 않은 요구사항 로드맵을 생성하는 로직이 있다. 이 로드맵은 각 단계가 있고, 각 단계에 사진 파일이 여러개 저장될 수 있다. 이 로직은 간단해보이지만 다음과 같은 문제점이 있다. 1. I/O가 실패하여 사진이 없어도 로드맵 생성 자체는 되어야한다라는 요구사항이 있다. 2. I/O중 예외가 발생하면 로드맵 생성 자체가 롤백된다. 3. 각 사진 파일은 I/O가 발생한다. 한 요청에 파일 I/O가 10번이상 발생할 수 있으니 트랜잭션이 굉장히 길게 걸린다. 4. 파일 I/O 후 경로와 같은 메타 데이터를 DB에 저장해야한다. 즉, 파일 I/O하는 서브.. 2023. 8. 29.
[Spring] 커스텀한 multipart/form-data 요청 받기 0. 이 글을 쓰게 된 이유 프로젝트를 진행하며 쉽지 않은 요구사항을 기술적으로 해결한 사례에 대해서 기록하고자 이 글을 쓰게 되었다. 1. 쉽지 않은 요구사항 로드맵을 생성하는 API를 만들어야하는데 다음과 같은 특이한 요구사항이 있다. 요구사항을 정리하면 다음과 같다. 1. 로드맵은 여러개의 단계를 가질 수 있다. 단계의 수는 가변적이다. 2. 각 단계는 0~2개의 사진 파일을 가질 수 있다. 즉, 사진의 수도 가변적이다. 3. 로드맵 생성에 필요한 다른 데이터는 json 형식으로 넘어온다. 4. 위 요구사항을 하나의 API로 해결해야한다. 2. 고려한 방법들 다음과 같은 방법들을 고려했었다. 2.1 API 분리 처음에는 이 정도로 큰 요청은 분리를 하는게 맞다고 생각했다. 애초에 API 설계가 잘못.. 2023. 8. 29.
[Database] B-Tree 인덱스 1. 인덱스란? B-Tree 인덱스에 대해서 알아보기에 앞서 인덱스에 대해서 간단하게 알아보자. 참고로 이 글은 MySql을 기준으로 작성 되었다. DB 인덱스는 데이터베이스에서 데이터 검색 속도를 최적화하기 위한 자료 구조이다. 인덱스를 사용하면 전체 테이블을 스캔하는 대신 인덱스를 사용하여 필요한 데이터를 훨씬 더 빠르게 찾을 수 있다. 인덱스의 작동 방식은 책의 색인과 유사하다. 책의 색인에서 특정 주제나 키워드를 찾으면 해당 내용이 있는 페이지 번호가 나열되어 있어, 책의 모든 페이지를 읽지 않고도 원하는 정보를 빠르게 찾을 수 있는 것처럼 인덱스에도 key-value 형식으로 데이터들이 저장 되어있다. 인덱스는 여러가지 기준으로 나눌 수 있는데 그 중 알고리즘에 따라 나누면 대표적으로 다음과 같.. 2023. 8. 6.
[보안] JWT 토큰에 대해서 알아보자 0. 이 글을 쓰게된 이유 이번 프로젝트를 진행하면서 토큰을 이용한 인증/인가를 담당하게 되면서 jwt를 사용하게 되었다. 그 과정에서 알게된 jwt의 특성과 경험을 기록하기 위해 이 글을 쓰게 되었다. 1. JWT란? JWT는 JSON Web Token의 줄임말로, 두 개체(ex -> 서버와 서버) 사이에 정보를 안전하게 전송하기 위한 토큰 인증 방법이다. 이는 RFC 7519에 정의 되어있고 토큰 인증 방식에서 많이 사용되는 방법이라고 볼 수 있다. jwt가 안전한 이유는 jwt토큰 자체가 디지털 서명이 되어있기 때문이다. 비밀키를 알고있어야 jwt가 유효한지 알 수 있기 때문에 중간에 토큰이 오염이 되지 않았음을 보장할 수 있다. 2. JWT 토큰 구조 JWT는 Header, Payload, Sig.. 2023. 7. 21.
[CS] SHA-256 + Salt 0. 이 글을 쓰게 된 이유 프로젝트를 진행하며 SHA-256 단방향 암호화를 진행하면서 발생하는 문제점을 인식하고 해결한 과정에 대해 기록하고자 이 글을 쓰게되었다. 1. SHA-256이란? SHA-256은 SHA-2(Secure Hash Algorithm 2)의 한 형태로, 암호학적 해시 함수의 집합 중 하나이다. 여기서 256은 이 알고리즘이 생성하는 해시 값의 비트 길이이다. 암호학적 해시 함수란 임의의 크기를 입력 받아 그 길이의 고유한 문자열로 변환하는 함수이다. 암호학적 해시 함수는 다음과 같은 특징을 가지고 있다. Preimage resistance (원상 저항성): 해시 결과(해시 값)로부터 원래의 입력 값을 찾아내는 것이 불가능하다. 즉, 해시 값만 가지고는 원래 데이터를 알아낼 수 없.. 2023. 7. 13.