springboot

@DataJpaTest를 이용한 Repository 테스트 중 본 어플리케이션 실행에서 발생하지 않던 DDL에서 예외가 발생했다. H2 ↔️ MySQL 문법 차이로 인해 테이블이 제대로 생성되지 않는 것으로 보여서 application-test.properties 를 계속 수정했지만 해결되지 않았다. 문득, 지난 번에도 @DataJpaTest 테스트에서 발생하는 에러를 @AutoConfigureTestDatabase으로 해결한 기억이나서 시도하였고 해결되었다. 그때도 디버깅 과정 기록을 미뤄두고 있었는데, 이 참에 블로깅하고 장기 기억으로 가보자. 문제 분석 시도할 때마다 다양한 예외가 발생하고 인터넷에도 다양한 예외 케이스가 있는데, 데이터베이스 설정 문제이거나 DDL 혹은 SQL 문법 오류다. 공통적..
이전 노션 블로그의 java.sql.SQLException: Incorrect string value (2021.03.28)로부터 마이그레이션된 글입니다. java.sql.SQLException: Incorrect string value: '\xEC\xB0\xBD\xEC\xB0\xBD...' for column `mm_server`.`restaurant`.`name` at row 1 Query is: insert into restaurant (deliveryable, description, location, name, price, type) values (?, ?, ?, ?, ?, ?), parameters [0,,3,'창창국밥',0,0] java thread: http-nio-8080-exec-1 at..
이전 노션 블로그의 소나큐브와 Jacoco로 코드를 깨끗하게 유지하기 (2023.09.07)로부터 마이그레이션된 글입니다. ⚙️ Setup EC2 서버에 SonarQube 설치 및 설정 1. 메모리 증가를 위한 Swap 설정 파일 생성 및 설치 touch ~/swapfile sudo fallocate -l 2G ~/swapfile sudo chmod 600 ~/swapfile sudo mkswap ~/swapfile sudo swapon ~/swapfile sudo yum install java-17-amazon-corretto-headless 아래 파일들을 열어서 가장 아래에 추가 /etc/fstab ~/swapfile swap swap defaults 0 0 /etc/sysctl.conf vm.max..
이전 노션 블로그의 Transaction 이란? (2023.08.11)로부터 마이그레이션된 글입니다. 저는 늘 Swagger의 자동화와 간단한 어노테이션을 통해 빠른 API 문서 배포만 해봤습니다. 빠르게 작업가능하다는 장점은 있었지만, 모든 요청을 Postman으로 테스트하는 과정에서 실수가 있을 수 밖에 없었고 Swagger의 자동 생성 문서가 친절한 편은 아니기에 읽는 사람마다 다르게 이해되는 경우가 있었습니다. 따라서 프론트에서 API를 연결하는 과정에서 실수가 자주 발생하거나, 오류가 발생하더라도 저에게 직접 물어보는 경우가 많았습니다. API 문서를 작성한 의의가 사라져버리는 일이 많았습니다… 😔 이번 리뷰메이트 프로젝트에서는 제한된 시간 내에 FE와 AI 모두가 사용할 서버를 만들어야 하므로..
이전 노션 블로그의 Swagger에서 MultipartFile과 DTO 한 번에 받는 @RequestPart 요청을 실행할 수 있도록 만들기 (2023.08.29)로부터 마이그레이션된 글입니다. 번거롭게 요청을 요청할 필요 없이 하나의 요청에서 파일과 데이터를 전송할 수 있도록 컨트롤러를 힘들게 구현했더니, 프론트에서 사용할 때 요청이 발생하고 Swagger에서 제대로 동작하지 않았다. 본 포스팅은 노력이 헛되지 않도록 문제를 하나씩 고쳐나간 기록들이다. 1. Request body의 Content-type이 올바르지 않음 문제 상황 MultipartFile와 DTO를 한 번에 받을 수 있는 요청을 만들때, 다른 여타 요청들처럼 @PostMapping에 URL만 설정하면 Swagger의 Request b..
이전 노션 블로그의 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 테이블과..
문제 파악 보통 스프링을 디버깅할 때 SQL 쿼리 로그를 확인하는 선에서 끝나지만, 종종 DataSource나 DDL 이 오류가 발생하거나 예상하지 못한 값이 DB에서 관측될 때는 SQL 쿼리에 포함된 값을 확인할 필요가 있다. 하지만 우리는 Hibernate ORM을 사용하기 때문에 SQL 쿼리에는 바인딩되기 전의 쿼리만 볼 수 있다. 이때 필요한 것이 binding parmater를 추적하는 것인데, 처음 스프링을 배울 때 배운 방법이 작동하지 않았다. (application.properties) logging: level: org: hibernate: type: trace 이전에 진행한 프로젝트에서 똑같이 실행하면 정상적으로 실행된다. 트러블 슈팅 문제 원인 분석 현 프로젝트와 이전 프로젝트 차이라..
sckwon770
'springboot' 태그의 글 목록