전체 글

이전 Velog의 대용량 데이터베이스의 조회 성능을 개선해보자 (1) : 인덱스 적용 (2023.10.27) 로부터 마이그레이션된 글입니다. Github main repo / Github server repo 동기 지난 번에 다양한 JPA 문제를 해결하고 비효율적으로 생성되는 쿼리를 최적화해 전체적인 서버 성능이 대폭 향상되었다. 하지만 리뷰 조회 API의 일부 요청의 경우 대폭 향상되었음에도 만족스러운 쿼리 처리 시간에 도달하지 못했다. 다양한 정렬과 필터링을 지원하는 조회 쿼리인만큼 대량의 데이터를 조건절, 정렬 적용하는데 많은 비용이 들고, 특히 리뷰의 분석 결과 중 '청결' 속성이 포함된 리뷰들이나 리뷰의 분석 결과 중 '청결' 속성의 '먼지' 키워드가 포함된 리뷰들과 같이 review 테이블과..
이전 Velog의 NCP Server에 pem key로 ssh 접속하기 - Permission denied (publickey) (2023.12.07) 로부터 마이그레이션된 글입니다. 동기 AWS에서는 SSH를 권장하지 않고 AWS Session Manager를 쓰도록 권장하지만, CI/CD 파이프라인을 구축하고 나서 서버에 접속하는 경우는 대게 긴급한 경우라 AWS 로그인 ➡ MFA ➡ EC2 Console ➡ Session Manager... 뎁스가 너무 깊어서 귀찮다... 그래서 그나마 SSH를 안전하게 관리하는 방법은 1. 22번 외의 포트를 SSH 용으로 사용하고 2. SSH Authentication을 철저히 설정한다. 2 번의 경우 대게 pem key를 많이 사용하는데, NCP Server의..
문제 파악 보통 스프링을 디버깅할 때 SQL 쿼리 로그를 확인하는 선에서 끝나지만, 종종 DataSource나 DDL 이 오류가 발생하거나 예상하지 못한 값이 DB에서 관측될 때는 SQL 쿼리에 포함된 값을 확인할 필요가 있다. 하지만 우리는 Hibernate ORM을 사용하기 때문에 SQL 쿼리에는 바인딩되기 전의 쿼리만 볼 수 있다. 이때 필요한 것이 binding parmater를 추적하는 것인데, 처음 스프링을 배울 때 배운 방법이 작동하지 않았다. (application.properties) logging: level: org: hibernate: type: trace 이전에 진행한 프로젝트에서 똑같이 실행하면 정상적으로 실행된다. 트러블 슈팅 문제 원인 분석 현 프로젝트와 이전 프로젝트 차이라..
'함께 자라기 - 애자일로 가는 길'을 읽고, 감명깊고 도움이 되어 감고 싶은 구절들을 정리했다. 지식이나 능력은 복리로 이자가 붙는다 더글라스의 작업 A, B, C A 작업은 원개 그 조직이 하기로 되어 있는 일 B 작업은 A 작업을 개선하는 일 C 작업은 B 작업을 개선하는 일 가장 미묘하고 또 잠재적으로 가장 영향력이 큰 것은 C 낭비되는 시간을 줄이고 잠자는 시간을 줄이는 등의 더하기적 사고가 아니라 곱하기적 사고를 하자 항상 어떤 일이 끝나거나, 주기적으로 회고를 하자 자신이 이미 갖고 있는 것들을 잘 활용하라 새로운 것을 유입시키는 데에만 집중하다 보면 새로 들어온 것들이 이미 있는 것들을 덮어버릴 수 있다. 내가 그 지식을 얼마나 어떻게 활용하는지 반성하라 이미 습득한 지식, 기술, 경험 등..
@DataJpaTest를 이용한 Repository 테스트 중 본 어플리케이션 실행에서 발생하지 않던 DDL에서 예외가 발생했다. H2 ↔️ MySQL 문법 차이로 인해 테이블이 제대로 생성되지 않는 것으로 보여서 application-test.properties 를 계속 수정했지만 해결되지 않았다. 문득, 지난 번에도 @DataJpaTest 테스트에서 발생하는 에러를 @AutoConfigureTestDatabase으로 해결한 기억이나서 시도하였고 해결되었다. 그때도 디버깅 과정 기록을 미뤄두고 있었는데, 이 참에 블로깅하고 장기 기억으로 가보자. 문제 분석 시도할 때마다 다양한 예외가 발생하고 인터넷에도 다양한 예외 케이스가 있는데, 데이터베이스 설정 문제이거나 DDL 혹은 SQL 문법 오류다. 공통적..
Array Arrays.sort() int[] numbers = new int[]{3, 30, 34, 5, 9}; // 0. 간단 출력 System.out.println(Arrays.toString(numbers)); // [3, 30, 34, 5, 9] // 1. 오름차순 Arrays.sort(numbers); // 2. 내림차순 Arrays.sort(numbers. Collections.reverseOrder()); 커스텀 정렬 (오름차순) int[] numbers = new int[]{3, 30, 34, 5, 9}; // 1. 람다함수 Arrays.sort(numbers, (n1, n2) -> (n1).compareTo(n2)); // 2. 오버라이딩 Arrays.sort(strings, new C..
https://school.programmers.co.kr/learn/courses/30/lessons/42746?language=java 문제 설명 0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다. 0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요. 제한 사항 numbers의 길이는 1 이상 100,000 이하입니다. numbers의 원소는 0 이상 ..
다 모르겠고, 가장 이상적인 아키텍처만 보고 싶은 사람은 현실적인 소규모 아키텍처 섹션을 보면 된다. 퍼블릭 클라우드를 사용할 때 영어로 하든 한국어로 하든 기능 이해하기도 어렵고 가이드가 복잡하더라도 AWS 사용하는데는 여러가지가 이유가 있다. 많은 회사가 AWS를 사용하고 있어서 경험싶은 것도 있지만, 학생으로서 가격이 큰 이유였다. AWS에는 수 많은 서비스들이 존재하고 완벽한 아키텍처를 구성하기 위해 많은 기능들을 추가할 수 있다. 하지만 의외로 일부 서비스를 제외하고는 합리적인 가격이거나 일정 범위 내에서 무료인 경우가 많다. NCP 아키텍처 NCP는 한국 클라우드이기도 하고 후발주자라 그런지 문서화가 굉장히 잘 되어있다. 가끔 AWS의 한국 도큐먼트를 보면 한국어를 읽고 있는데도 이해가 안되고..
디프만 14기에서 참여 중인 프로젝트에서 백엔드 리드 분이 엔티티의 id를 UUID, ULID로 설정한 것을 보았다. 늘 IDENTITY로 설정하여 MySQL이 AUTO_INCREMENT로 관리하도록 위임했기 때문에 기존 방식과 대비해서 어떤 장점이 있길래 사용하는지 알아보았다. AUTO_INCREMENT 전략의 단점 외부에서 예측하기 쉬운 PK PK가 선형적으로 증가하는 정수이기 때문에, 특정 데이터의 PK를 예측하기 쉬워진다. 실제로 request들의 파라미터를 테스트할 때 종종 느꼈던 것이다. 현재 유저의 id 2000이면 1 ~ 1999까지의 id를 가진 유저가 존재할 확률도 높은 것이다. 이는 단순히 노출된다의 문제를 넘어 SQL Injection 공격에도 취약해진다. DB에 의존적인 PK 개발..
sckwon770
sckwon770