본문 바로가기

Spring

(11)
QueryDSL 페이징 Count 쿼리 작성 시 groupBy 사용의 문제점 분석 페이징(Pagination) 구현은 백엔드 개발의 일반적인 요구사항이다. Spring Data JPA와 QueryDSL은 Page 객체를 통해 이를 편리하게 처리하는 기능을 제공한다. 이 과정에서는 데이터 목록을 조회하는 메인 쿼리와 전체 데이터 개수를 조회하는 Count 쿼리를 함께 사용하게 된다.이때 Count 쿼리를 작성하는 과정에서 groupBy를 잘못 사용하면, 페이징 처리에 오류가 발생할 수 있다. 문제 현상: 오류 없이 잘못된 totalCount가 반환되는 코드다음은 '특정 키워드가 포함된 댓글이 달린 게시글(Post)' 목록을 조회하며, 각 게시글에 달린 댓글 수를 집계하여 페이징으로 반환하는 코드이다.// 메인 쿼리JPAQuery query = queryFactory .select(..
Spring Boot JPA 네이티브 쿼리로 환경별 스키마 동적 변경하기 @Table 카탈로그(catalog) 속성의 한계 (런타임 동적 변경 불가)Spring Boot + JPA로 개발하면서 프로젝트에서 기본적으로 사용하는 스키마 이외의 같은 DB의 다른 스키마에 접근해야 하는 요구사항이 있었다. 처음에는 JPA의 @Table 애너테이션에 있는 catalog (mysql 환경이므로, catalog로 스키마 설정 가능) 속성만 바꾸면 간단히 해결될 거라고 생각했다. (예를 들어, 엔티티에 @Table(catalog = "myapp_ci")처럼 설정하기) 그리고 실제로 catalog 설정 후 테스트 해보았을 때 잘 동작하는 것을 확인할 수 있었다.문제는 스키마 이름이 환경(운영, QA, 개발)별로 다르다는 것이었다. 그러면 엔티티에 @Table(catalog = "myapp_c..
pc ↔ 모바일 전환 시 일회용 토큰을 이용하여 로그인 기능 유지하기 개요 :PC-모바일 전환 기능 관련해서 로그인 상태가 유지되어야 한다는 요구사항인증/인가는 JWT로 관리 중PC API 서버와 모바일 API 서버는 분리됨프론트에서 액세스 토큰이나 로그인 정보를 URL로 바로 전달하는 건 보안상 위험이 있어서 안전한 로그인 전환 방식 설계/구현 필요1. pc모바일 전환 시 일회용 토큰 발급2. 전환 페이지에 url로 일회용 토큰 전달3. 일회용 토큰으로 액세스 토큰, 리프레시 토큰 전달 받음4. 로그인 상태 유지위와 같은 절차로 개발1회용 토큰 생성 시 대칭키 이용, 암복호화 가능한 것으로 만들어서 사용프로젝트에 AES256 복호화, 암호화하는 유틸 함수 생성object AES256CipherUtil { @Throws(NoSuchAlgorithmException::..
Prometheus + Grafana instance 별칭 설정하기 개요 및 문제 Prometheus + Grafana를 적용하여 모니터링 시스템을 구축하였다. 여러 애플리케이션을 모니터링하는데 개선점이 생겼다. 바로 Grafana 대시보드에서 애플리케이션을 선택할 때 instance를 선택하는데, instance가 기본적으로 IP:포트번호의 이름으로 생성된다는 것이었다. 이때, 여러 서비스를 모니터링한다면 대시보드를 활용하려는 사람은 각 서비스의 포트 번호를 기억하고 있어야 한다. 그렇기 때문에 instance의 이름을 변경하거나 별칭을 설정하는 방법을 찾아보았다.해결방법Prometheus 설정파일 수정prometheus.yml 설정파일에 내용을 추가하여 instance의 이름을 설정할 수 있었다.Prometheus에서는 relabel_configs 설정이 없을 경우,..
Spring Boot Actuator, Grafana & Prometheus 모니터링 구축 및 연결 Spring Boot ActuatorSpring Boot Actuator는 애플리케이션의 상태 및 메트릭 정보를 제공하는 다양한 REST 엔드포인트를 제공대표적인 엔드포인트 : /actuator/health, /actuator/metrics, /actuator/info 등메트릭(Metric) 정보란?애플리케이션의 성능 및 동작 상태를 수치로 표현한 데이터시스템이 어떻게 동작하고 있는지를 숫자로 보여주는 정보주요 메트릭 종류jvm.memory.usedJVM이 현재 사용 중인 메모리 양jvm.gc.pauseGarbage Collection이 걸린 시간process.cpu.usage애플리케이션이 사용하는 CPU 비율system.cpu.usage전체 시스템에서 사용 중인 CPU 비율http.server.requ..
JpaSystemException: Could not extract column [6] from JDBC ResultSet [MONTH] 오류 해결 기존 프로젝트에 기능 추가를 하는 중, 개발 환경에서 db 스키마 변경이 필요했다. 문제는 스키마 변경 후 데이터베이스 정합성, 도메인 무결성 등을 위배하는 데이터들 때문에 기존에 정상적으로 작동하던 API 중 몇몇 API에서 오류가 났다. 그중에 한 API 오류 해결 사례를 정리하는 포스팅.  에러 발생{"code": 400,"message": "Bad Request / Could not extract column [3] from JDBC ResultSet [MONTH] [n/a] / org.hibernate.exception.GenericJDBCException: Could not extract column [3] from JDBC ResultSet [MONTH] [n/a] / class org.sp..
비밀번호 없이 회원가입, 로그인 구현 (kotlin + spring boot) 벨로그(https://velog.io/) 서비스를 이용하다 회원가입, 로그인에서 독특한 플로우를 발견했다. 우선 로그인 안 한 상태로 벨로그에 접속하면 우측 상단에 로그인 버튼이 보인다. 로그인 버튼을 클릭하면 이런 로그인 모달이 뜬다. 이메일을 입력 후 로그인 버튼을 누르면, 벨로그에 가입된 회원인 경우 이메일로 로그인 링크가 발송되며, 가입된 회원이 아닌 경우에는 이메일로 회원가입 링크가 발송된다. (혹은 사용자가 회원가입을 하지 않은 것이 확실하다면 모달 우측 하단의 ‘회원가입’ 텍스트를 틀릭하면 모달창에서 ‘로그인’ 부분이 ‘회원가입’으로 텍스트가 변경된다.)이메일로 로그인 링크를 받은 경우 링크 클릭 시 로그인한 상태로 벨로그 메인 페이지로 이동한다. 이메일로 회원가입 링크를 받은 경우 링크를 ..
클린 스프링: 스프링 개발자를 위한 클린 코드 전략 - 이일민(토비) 2024 인프콘 다시보기 - 클린 코드에 대한 이일민(토비)님의 강의를 들으며 내용을 정리해 보았습니다. [참고]영상은 아래 링크에서 보실 수 있습니다.https://youtu.be/d3krJ4el8Hg?si=4gK7MB1HM5Kt5uob   개발자에게 기술 성장과 관련된 책을 추천하면?첫 번째 - 클린 코드향로님의 클린 코드에 대한 말클린코드를 지향할수록 점점 구현 능력이 떨어진다 이런 생각 해보신 적 없으세요?클린 코드에 집중할수록 좋은 코드, 구조, 설계에 대해 집착하게 되어 구현 속도가 느려지고 구현 능력이 떨어진다.클린 코드라는 말이 처음 쓰인 곳 : 켄트 벡의 테스트 주도 개발Clean Code That Works (작동하는 클린 코드)그러나 클린 코드에 대한 다음과 같은 오해가 존재한다.클린..