본문 바로가기

전체 글

(65)
@OneToMany Fetch Join 시 데이터 중복과 주의점 오늘은 JPA를 사용하면서 발생했던 OneToMany와 Fetch Join을 같이 사용할 때의 주의할 점과 발생하는 데이터 중복 해결 방법에 대해서 작성해보겠습니다. 참고자료는 김영한님의 자바 ORM 표준 JPA 프로그래밍 책입니다. 1. @OneToMany Fetch Join은 중복 데이터가 발생된다? 첫 번째로, @OneToMany 연관관계에서 Fetch Join으로 데이터를 가져오는 경우 중복 데이터가 생길 수 있습니다. 중복 데이터가 발생하는 원인은 fetch Join을 하면, 연관된 데이터를 모두 가져오기 때문에, 아래 같은 경우 team에 대해서 fetch join을 하면 Team의 레코드 개수는 6개가 될 것입니다. Team Id는 중복되지만, 연관된 Member ID는 다르기 때문에 다른 ..
Real MySQL 8.0 읽기 - 아키텍처 본 포스팅은 Real MySQL 8.0 개정판을 읽고 정리한 내용입니다. 잘못된 내용이 있다면 편하게 댓글로 지적 부탁드립니다. 감사합니다. 아키텍처 MySQL 아키텍처 구조 MySQL 아키텍처 구조는 크게 MySQL 엔진과 스토리지 엔진으로 구분된다. MySQL 엔진 커넥션 핸들러, SQL 파서 및 전처리기, 옵티마이저 스토리지 엔진 실제 데이터를 스토리지에 저장, 스토리지로부터 데이터를 읽어온다. InnoDB와 MyISAM 스토리지 엔진이 존재하는데, 8.0 이후로부터 MyISAM 엔진은 거의 장점이 없어졌다. 따라서 앞으로는 InnoDB에 대해서만 언급한다. MySQL에서는 요청을 어떻게 처리할까? 가장 먼저 MySQL과 사용자가 커넥션을 맺는다. SQL문을 처리하고, SQL을 최적화한 후 스토리지..
라우팅 알고리즘과 프로토콜 본 포스팅은 이석복 교수님의 네트워크 수업과 성공과 실패를 결정하는 상위 1%의 네트워크 원리를 참고하여 작성한 포스팅입니다. 라우팅 알고리즘이란? 라우팅 알고리즘이란 출발 라우터에서 도착 라우터로 패킷을 보낼 때 최적의 비용으로 보낼 수 있는 라우팅 경로를 결정하는 알고리즘입니다. 네트워크를 아래 그림의 그래프로 추상화한다고 생각해볼 수 있습니다. 위 그림의 예에서, u라는 라우터에서 z라는 라우터까지 가는 경로를 결정해야하는 문제가 발생합니다. 이를 결정하는 알고리즘을 구체화하기 전에, 알고리즘의 분류를 먼저 생각해보겠습니다. Q. Global(전역적인 공통의 정보를 이용) 알고리즘인가? 혹은 decentralized(각 지역의 정보를 종합) 알고리즘인가? Global 모든 라우터가 전체 라우터의 t..
네트워크 계층 - IP, CIDR, NAT 본 포스팅은 이석복 교수님의 네트워크 수업과 성공과 실패를 결정하는 상위 1%의 네트워크 원리를 참고하여 작성한 포스팅입니다. 우리가 네트워크에서 요청을 보내면 HTTP 요청이 작성이 되어서 네트워크를 구성하는 계층들을 거쳐 Multiplexing, De-multiplexing이 일어나면서 데이터를 주고받게 됩니다. 이번 포스팅에서 어플리케이션 계층인 HTTP 프로토콜과 Transport 계층인 TCP 프로토콜에 대한 자세한 내용은 생략하겠습니다. 대략적으로 TCP 프로토콜의 도움으로 데이터의 신뢰성 있는 전송, 네트워크 혼잡 제어, 네트워크 흐름 제어 등이 가능해졌습니다. 사용자의 입장에서 네트워크 속으로 패킷을 보내면 신뢰성있게 잘 전달되고 응답이 잘 돌아온다는 것은 이해했는데, 상대의 호스트까지 어..
MySQL 쿼리 최적화 - Covering Index https://porolog.tistory.com/54 슬로우 쿼리 모니터링 - AWS CloudWatch https://porolog.tistory.com/53 DB Bulk Insert, Jmeter 부하테스트 안녕하세요, 오늘은 Issue Tracker 프로젝트를 진행하면서 10만건 이상의 데이터에서 비정상적으로 느린 API 응답을 어떻게 개선했는지 기록을 porolog.tistory.com 슬로우 쿼리 개선하기 이전 포스팅에서 슬로우 쿼리를 AWS CloudWatch를 통해서 로깅하도록 설정해보았습니다. 이번에는 로그된 슬로우 쿼리를 확인하고 개선해보겠습니다. 저번 포스팅의 로깅을 통해서 슬로우 쿼리를 찾았습니다. 놀랐던 점은 저는 당연히 아래 쿼리의 페이지네이션, 필터로 이슈 목록을 조회하는 쿼..
슬로우 쿼리 모니터링 - AWS CloudWatch https://porolog.tistory.com/53 DB Bulk Insert, Jmeter 부하테스트 안녕하세요, 오늘은 Issue Tracker 프로젝트를 진행하면서 10만건 이상의 데이터에서 비정상적으로 느린 API 응답을 어떻게 개선했는지 기록을 공유하고자 포스팅을 작성합니다. Spring Data JDBC로 Bulk I porolog.tistory.com 저번 포스팅에서 메인 페이지의 GET 요청을 보냈을 때 200회의 요청을 보내면 평균적으로 36초의 시간이 걸리는 것을 확인했습니다. JDBC Connection Timeout이 발생하여, DB에서의 슬로우 쿼리 발생을 원인으로 추정하였는데요. 이번 포스팅에서는 AWS CloudWatch로 슬로우 쿼리를 찾아보고 개선하는 과정을 기록해보겠습..
DB Bulk Insert, Jmeter 부하테스트 안녕하세요, 오늘은 Issue Tracker 프로젝트를 진행하면서 10만건 이상의 데이터에서 비정상적으로 느린 API 응답을 어떻게 개선했는지 기록을 공유하고자 포스팅을 작성합니다. Spring Data JDBC로 Bulk Insert하기 우선 부하 상황을 만들기 위해서 Spring Data JDBC로 Dummy Data를 Insert했습니다. 이 때, Spring Data JDBC의 saveAll 메서드는 기본적으로 객체 하나마다 개별적인 INSERT 쿼리를 실행합니다. 이는 saveAll 메서드가 객체 컬렉션의 각 요소를 개별적으로 처리하고 영속화하기 때문입니다. 각 객체는 개별적으로 삽입되며, 객체의 상태에 따라 개별적인 INSERT 쿼리가 생성됩니다. 객체마다 I/O가 실행되면 속도가 굉장히 느려..
해싱과 암호화를 이용한 개인정보 보호 - SHA256, RSA 알고리즘 암호화 알고리즘에 대해서 학습하다가 해싱과 암호화에 대해서 잘못 이해하고 있었던 개념들이 있었다는 것을 깨달았습니다. 먼저 해싱에 대해서 설명하겠습니다. 해싱(단방향 암호화)? 해싱은 어떤 데이터를 고정된 크기의 고유한 값, 즉 '해시값'으로 변환하는 과정입니다. 이때 변환 과정은 단방향입니다. 즉, 해시값에서 원래의 데이터로 되돌릴 수 없기 때문에 단방향 암호화라고도 합니다. 고정된 크기의 고유 값으로 만들기 위해서 해시 함수를 사용하는데, 해시 함수는 어떤 길이의 데이터든 간에 일정한 길이의 해시값으로 출력합니다. 여기서 나머지 연산의 개념이 적용됩니다. 해시 함수는 각 데이터를 정해진 수로 나눈 나머지 값으로 계산합니다. 그 결과로 생성된 나머지 값이 곧 해당 데이터의 해시값이 됩니다. 나머지 연산..