이전 노션 블로그의 enum 필드를 기준으로 정렬하기 (2022.02.20)로부터 마이그레이션된 글입니다. public enum Tier { BRONZE, // 0 SILVER, // 1 GOLD, // 2 DIAMOND // 3 } @Entity public class User { @Enumerated(EnumType.ORDINAL) // Default Setting private Tier tier; } enum의 ordinal 값은 0부터 시작 BRONZE : 0 SILVER : 1 ... Default Setting인 @Enumerated(EnumType.ORDINAL) 은 enum의 ordinal 값을 DB에 저장 ⇒ Integer 필드처럼 오름차순, 내림차순 정렬하면 됨.
전체 글
이전 Velog의 외부 서비스 요청 결과에 따라 리뷰 업로드 요청 결과가 달라지는 강결합 구조를 개선해보자. (2023.11.02) 로부터 마이그레이션된 글입니다. 동기 리뷰는 본 프로젝트의 핵심으로서, 최대한 많은 리뷰를 입력받고 이를 분석해 가치있는 정보를 제공하고 있습니다. 이러한 리뷰의 업로드는 다음과 같은 과정을 통해 진행됩니다. AWS S3를 통한 사진 업로드와 AI 리뷰 분석 모델을 통한 리뷰 분석 요청이라는 2개의 외부 서비스를 거친 후 ㄹㅣ뷰 데이터가 DB에 저장됩니다. 즉, 동기로 작동하고 하나의 트랜잭션으로 묶이기 때문에, 클라이언트가 리뷰를 업로드할 때 세 가지 과정이 모두 완료되는 긴 시간을 기다려야 하고 외부 서비스 중 하나라도 실패하면 리뷰 업로드가 실패하는 강결합 구조이다. ..
이전 Velog의 대용량 데이터베이스의 조회 성능을 개선해보자 (2) : 인덱스 튜닝 (2023.11.12) 로부터 마이그레이션된 글입니다. Github main repo / Github server repo 동기 1편의 카테고리별 리뷰 조회를 시작으로 500ms가 넘어가는 요청들을 위주로 Cardinality/Selectivity를 고려하여 인덱스를 생성했다. 하지만 1편까지는 진짜 대용량 데이터베이스는 아니였다. 2편부터 여기어때컴퍼니 벤처 프로젝트인만큼 여기어때 홍보자료에 있는 데이터 규모에서 성능을 측정해보고 필요하다면 개선까지 진행해보자. 기존 테스트 데이터 스케일 여행상품: 30 (각 카테고리 10개씩, 숙소, 식당, 렌터카) 예약: 540,000 (카테고리 별 180,000) - 여행상품 마..
이전 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의 SSH ..
문제 파악 보통 스프링을 디버깅할 때 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..