본문 바로가기

Spring20

JPA 집계함수 sum 은 long 을 반환한다. 최근 대량의 데이터들을 집계하여 조회하는 API 프로젝트를 진행 중에, Spring Data JPA 와 Querydsl 을 이용하여 쿼리를 작성하고 있었다. 오늘, sum 집계 함수 때문에, java object 로 매핑이 안되는 문제가 있었는데, 그 이유와 해결과정을 설명해보겠다. 기존 쿼리 @Query( """ select new service.dto.PaymentTotalSumDTO( sum(sub.totalAmount) as totalAmount, sum(sub.discount) as discount, sum(sub.usedPoint) as usedPoint ) from (select tpd.totalAmount as totalAmount, tpd.discount as discount, tpd.u.. 2023. 7. 26.
[Spring Data JPA] JPA Enum 필드에 관한 문제 참나. 오늘 5시간 날렸다. Pagination 쿼리를 날리는 API에서 계속 500 에러가 나서 계속 붙잡고 있었다. 빨래 땜에 집에 왔지만 불굴의 의지로 해결해보리라 다짐하고 1시간만에 문제를 발견했다 증말. 문제점 결론부터 말하면 서버 DB에 잘못된 데이터가 들어가서였다. 문제는 JPA Enum 필드가 @Enumerated(EnumType.STRING) ㅣ이 아니라, Ordinal로 들어가 발생한 문제다. 지정한 Enum 상수는 총 4개 이며, ordinal의 범위는 0~3 이다. 4 이상의 숫자는 있어서는 안될 데이터다. 그래서 계속 이런 에러가 발생했다. java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 4 쿼리.. 2023. 2. 21.
[Spring Data JPA] 한방 쿼리의 효능 (feat : JPQL) 백엔드 개발의 기본 소양인 SQL을 작성하는 실력은 뛰어날 수록 더할 나위 없다. 실제로 대규모 트래픽이 발생하는 서비스에서는 이 성능을 매우 중요시 하는데, 일반적인 환경에서는 DB 조회적 측면에서 큰 성능 개선을 이끌 수 있으므로, 가장 기본이 되는 개선 방안이라고들 한다. SQL을 공부하고, JPA 를 공부하며 항상 빠질 수 없는 얘기, 성능 최적화. 항상 고민하다가 개선을 할 수 있는 기회가 주어졌고, 공부한 내용을 바탕으로 내 생각과 결과를 정리해보겠다. DB ERD Model opnions entity를 paging 처리해서 여러 개를 뽑아야 하는 상황. 주어진 중요 파라미터는 user_id 뿐이다. 1. 보통 같으면 Document Entity를 먼저 조회한 후, opinions 를 페이징 .. 2023. 2. 1.
[Redisson]을 이용한 분산 Lock 구현 & 동시성 문제 해결 내 프로젝트의 Payment를 개발하면서 가장 기본 중에 기본이 되는 문제를 직면했었다. 그것은 바로 동시성 문제! 스프링부트의 내장 서버는 기본적으로 톰캣, 언더토우 등등의 WAS로 돌아가는데 이 WAS는 멀티스레드 기반으로 동작한다. A라는 상품 (재고 3개) 을 [가]군이 2개 구매하려 한다. 동시에 [나]군이 2개 구매하려 한다. 미세하게 나마 0.00001초의 차이가 있을 수 있다. 결국 각각의 스레드가 같은 상품의 재고를 조회한다. 원래대로라면 한 명은 못 사야 정상이다. 위 문제를 해결하기 위한 방법이 뭐가 있을까? 1. Synchronized 자바로 해결하는 방법이다. Thread-Safe 하기 때문에 매우 좋아보이나, 서버가 증설될 경우 의미가 없어진다. 2. Database Lock D.. 2022. 9. 27.
결제 API 리팩토링 - [2] (feat. WebClient) https://sweeeetgoguma.tistory.com/entry/%EA%B2%B0%EC%A0%9C-API-%EB%A6%AC%ED%8C%A9%ED%86%A0%EB%A7%81-1-feat-%EC%A0%84%EB%9E%B5-%ED%8C%A8%ED%84%B 결제 API 리팩토링 - [1] (feat. 전략 패턴) 결제 API를 리팩토링 시작하며 외부 API를 연동 부분에 대해서 생각해봤다. 기존에도 카카오페이를 이용했었고, 지금도 카카오페이를 이용할 것이지만, 추가적으로 다른 결제 API를 연동할 수 있 sweeeetgoguma.tistory.com 지난 포스팅에 이어서 작성하겠습니다~ 실제 결제 API를 호출하기 위해서는 httpClient 기반의 모듈이 필요하다. 기존에는 동기방식, 멀티스레드를 이용.. 2022. 9. 22.
WebFlux는 무엇이고, 왜 나왔고, 언제 쓰이는가? 어제 Cart API 코드 리팩터링을 마무리하고, 리뷰를 받기 위해 PR을 올렸다. 클린 한 코드로 작성하려고 노력하기 위해 리뷰어님이 주신 의견을 되뇌고, 클린 코드를 작성하기 위한 방법을 구글링을 통해 하루 종일 모니터를 노려보며 클래스 간 책임을 나누어 보았다. 빨리 성장하고 싶다!! 리뷰를 앞두고, 카카오페이를 이용한 도메인 코드들을 리팩터링 하기 앞서, 기존에 외부 API와 통신하기 위해 사용하던 템플릿인 RestTemplate의 대체 여부에 대해 떠올랐다. RestTemplate은 deprecated 되었으므로, WebClient의 사용을 고려해보라는 의견을 받았다. WebClient에 대해 알아보다가 동기/비동기, 블로킹/논블로킹이라는 개념의 정의에 대해 다시 공부하게 되었고, 나아가 Web.. 2022. 8. 31.
DB 수정 & jpa 세팅 프로젝트의 전반적인 리팩터링을 다시 시작하며, 기존 mybatis를 이용했던 것을 그대로 옮겨왔다. 하지만 SQL Mapper를 이용한 설계 특성상 객체 지향적인 코드의 작성이 어려웠고, 또 기존 DB 설계의 문제도 있다는 것을 알게 되었다. DB의 전반적인 수정과 더불어, JPA를 이용해 다시 리팩터링을 해보기로 결정을 내렸다. 그 수정과정과 JPA 세팅 방법을 나열해보겠다. https://github.com/GroovyArea/My-ChickenBreast-Shop GitHub - GroovyArea/My-ChickenBreast-Shop: shop api with spring boot shop api with spring boot . Contribute to GroovyArea/My-ChickenB.. 2022. 8. 8.
「테스트 코드 & Spring REST Docs」 개인 프로젝트는 완성이 되었다. 이제는 세부적인 디테일에 신경을 쓰며 리팩터링과 그에 필요한 개념 정리를 하며 프로젝트에 적용시키고 있다. REST API를 처음 설계해 보았는데, 부족한 점이 많았지만 신선한 경험이고 짧은 기간 내에 배운 것이 많은 설계 과정이었다. API를 설계하면 그에 맞는 명세가 필요한데, 보통 Swagger나 Spring REST Docs 프레임워크를 이용한다고 한다. Swagger를 사용하면 애노테이션을 이용해 편하게 문서를 작성할 순 있지만, 프로젝트의 확실성과 정확성을 뒷받침하기 위해서는 테스트 코드 작성이 필수라고 생각하기 때문에 Spring REST Docs를 이용하기로 생각하며 적용해보았다. 테스트 코드 크게 단위 테스트와 통합 테스트가 있다. 통합 테스트 단위 테스트.. 2022. 6. 20.
2022.05.26 「트래픽이 몰렸을 경우」 이메일을 통해 인증 번호를 전송하는 방식은 매우 느리다. 서버 사용자가 늘어날수록 트래픽이 많이 몰려 인증 번호를 전송하는 시간이 무진장 늘어날 것이다. 이러면 안 된다. 그래서 찾아보았다. 트래픽이 몰렸을 경우에는 어떤 식으로 해결을 하는지? 동기와 비동기 방식이 있다. 동기는 첫 프로세스가 완료되어야 다음 프로세스로 넘어가는 방식이고, 완료 여부와 상관없이 다음 프로세스를 요청하거나 실행하는 것이 비동기 방식이다. 이메일 전송에 이 비동기 방식을 적용해 보고자 한다. Async Config 스프링에서는 @Async를 통해 비동기 방식을 쉽게 구현할 수 있다. configuration을 통해 스레드의 개수를 커스터 마이징 시켰다. Async 적용 비동기 방식으로 동작하길 바라는 메서드에 애노테이션을 적.. 2022. 5. 26.
2022.05.25 「Email 인증」 열심히 프로젝트를 하다가 초기 구상한 wiki를 다시 보게 되었다. 회원가입 시 이메일 api를 사용하기로 했는데 그걸 까먹었다.. 그래서 회원가입을 다시 건드리게 되었다. Java의 MailSender 인터페이스를 사용하여 SMTP 구글 이메일로 이메일 인증 번호를 클라이언트 요청 이메일로 보내주도록 설계하고 인증 번호를 redis DB에 저장하여 비교하고 회원가입을 이루게 할 것이다. Mail Sender // Mail implementation 'org.springframework.boot:spring-boot-starter-mail' 먼저 의존성을 추가했다. Application.yml 지금까지 Properties 파일을 사용하고 있었는데, 이번 기회에 yaml을 사용해보기로 결정했다. 이유는 인.. 2022. 5. 25.
2022.05.06 「Git Flow 이슈」 스프링 프로젝트를 진행중이다. 단순히 Master 브랜치만 이용하는 것이 아닌 코드 리뷰를 받기 위해 Pull Request를 올려야하기 때문에 여러 개의 브랜치를 나누어 작업하는 도중 문제가 발생했다. pr을 올리기 위한 브랜치간의 분업이 적절히 이루어져야 하는데 혼자 하다 보니 이것 저것을 건들어서 다양하게 건든 것이다. 그래서 알맞은 해결방안을 모색해보고자 한다. 인텔리제이 Branch 체크아웃 하는 방법 혹여나 잘못 git push를 했다면 2022. 5. 6.
2022.04.25의 기록 ▶ 파트 1 (2시 ~ 12시) 1. 테스트 코드 수정 2. 노션 자기소개서 정리 -> 디테일한 부분 추가해보자 3. Spring 개념 정리 4. mysql 옵티마이저와 힌트 5. wiki 수정 6. 개념, 자소서, 프로젝트 계획 검수 7. 알고리즘 1문제 ▷ 테스트 코드 문제 : 하나의 값만 임의로 비교하는 것도 좋을 것 같지만 3가지 경우를 모두 테스트하면 좋겠다 해결 : Static 메서드를 하나 선언하여 입력 정수 값과 기대 값을 비교하는 테스트로 수정하였다. 2022. 4. 25.
2022.04.22의 기록 ▶ 파트 1 (10시 ~ 7시) 1. Gradle Test 코드 수정 (PrintGameResult, ComputerNumber 부분) 2. 자소서 수정 3. Boot project 구상 4. Spring MVC 내부 개념 정리 5. 알고리즘 1문제 (2문제) 6. mysql Ch5. 트랜잭션, CH6. 데이터 압축 7. 이펙티브 자바 아이템 1 정리 ▷ 알고리즘 문제 : 정수의 내림차순 정렬 import java.util.Arrays; class Solution { public long solution(long n) { long answer = 0; String number = String.valueOf(n); String stringNum = ""; char[] numArr = new char[num.. 2022. 4. 22.
2022.04.19의 기록 ▶ 오늘 해야할 계획 1. real Mysql CH2 2. Docker 본문 1페이지 3. 자기소개서 노션 정리 4. 깃허브 차기 프로젝트용 저장소 생성 5. 테스트코드 피드백으로 수정 6. 오라클 삭제 및 mysql 삭제 후 재설치 7. 알바 면접 8. 스프링 질문 답변 정리 2022. 4. 19.
2022.03.07 의 기록 ▶ 하루 => 공부 관련 1) 스프링 개구리책 CH6 2) MVC 객체지향 리팩토링 3) 금일 배운 내용 복습 => 파이널 프로젝트 관련 1) DB 재확인 ▶ 개인 공부 5장 객체 지향 설계 5원칙 객체 지향 설계 5원칙 객체 지향의 개념과 4대 특성 좋은 도구을 알게됨. 좋은 도구가 있어도 올바르게 사용하는 방법을 알아야 좋은 요리가 나옴. 객체 지향 설계 (Object Oriented Design) 5원칙 SOLID (객체 지향을 올바르게 사용하는 방법) SRP (Single Responsibility Principle) : 단일 책임 원칙 OCP (Open Closed Princinple) : 개방 폐쇄 원칙 LSP (Liskov Substitution Principle) : 리스코프 치환 원칙 I.. 2022. 3. 7.
반응형