Framework/Spring Boot13 [Query Tuning] 요청사항을 듣고, 그대로 구현하면 안되는 이유 - feat DataJPA,JPQL 서론개발자들이 흔히 저지르는 실수 중 하나는 요구사항을 듣고 이를 곧바로 비즈니스 로직이나 쿼리로 구현하는 것입니다. 이게 왜 문제가 될까요? 아래 이미지는 팀의 백엔드 개발자 채널 내용 중 일부입니다. 주목할 부분은 빨간색으로 표시된 요청사항입니다.요청사항:5년이 지난 결제 정보를 찾아, 개인정보 관련 특정 컬럼(id, 이름, 필명, 연락처)만 null로 업데이트하기.요청사항만 보고 그대로 Spring Data JPA로 구현한다면, 보존 기간이 지난 데이터를 findAll()로 조회하고, 데이터가 많다면 청크 단위로 나눠서 saveAll()로 저장하면 된다고 생각할 수 있습니다. 하지만 이렇게 접근할 경우 큰 문제가 발생합니다. Spring Data JPA의 saveAll은 개별 update 쿼리를 실.. Framework/Spring Boot 2024. 11. 8. Spring Boot 기반 다수의 프로젝트를 하나의 Multi Module 프로젝트로 통합하기 (3) - 인증과 인가는 Gateway로, 토큰 발급은 Auth Api로 서론 모든 Request는 WebGateway가 받아서 각 Reqeust에 맞는 Service들로 매핑시키도록 아래와 같이 구성도를 작성하였습니다. 해당 Request가 올바른 권한과 인증을 부여받은 Request인가를 판단하기 위해, 앞으로 인증과 인가는 WebGateway에서, 인증과 인가 없이 요청할 수 있는 예외의 Request(Login, SignUp 등)는 Filter를 구현받지 않고 바로 Auth Service로 통과시켜주는 Gateway를 구현해보도록 하겠습니다. (Playground라는 프로젝트 명칭은 학습 및 연구하며 실제로 적용해보는 놀이터용도로써 만든 프로젝트로서 큰 의미는 없습니다.)1. module-webGateway 역할 정의webGateway에서 모든 web 관련 Reques.. Framework/Spring Boot 2024. 11. 7. [Query Tuning] Spring Batch 삭제 로직 성능 최적화 오늘은 Spring Batch를 사용하여 대량의 데이터를 삭제할 때 발생하는 성능 문제와 이를 개선한 과정을 공유하고자 합니다. 기존 코드와 문제점저는 일정 시간이 지난 UserCertLog 엔티티의 데이터를 삭제하는 작업을 진행하고 있었습니다. 초기에는 다음과 같이 코드를 작성했습니다./** * nice 인증 결과 로그인 UserCertLog 삭제 처리 * 매일 새벽 12시 30분에 도는 스케줄러 입니다. */@Scheduled(cron = "0 30 0 * * ?")public void certLogRemove() { log.info("---certLogRemove start!!---"); deleteService.deleteUserCertLog(); log.info("---certL.. Framework/Spring Boot 2024. 11. 5. Spring Boot 기반 다수의 프로젝트를 하나의 Multi Module 프로젝트로 통합하기 (2) - 인증과 인가를 담당하는 Auth Api 1. 인증과 인가인증과 인가. 많이 들어 본 말이지만 들을 때 마다 햇갈리는 단어입니다. 때문에 쉽게 생각해야 할 필요성이 있었고 저는 이와 같이 정의를 내렸습니다. 인증은 사용자가 자신의 신원을 확인하는 모든 행위라고 생각합니다. 인가는 인증을 통해 신원이 확인된 사용자에게 특정 액세스 권한을 부여하는 모든 행위를 뜻 한다고 생각합니다. 더 쉽게 개발적인 이야기로 얘기하자면, 인증은 ID/PW, JWT Token 등과 같은 모든 자신의 신원을 확인하는 신분증이고 인가는 그런 인증에 대해 엑세스 권한을 체크 및 부여하는 행위라고 생각하면 됩니다. 저는 인증과 인가는 Gateway에서 처리하고, 해당 인증과 인가에 필요한 회원 확인 및 JWT Token 발급은 Auth Service(이하 Auth API).. Framework/Spring Boot 2024. 11. 1. Spring Boot 기반 다수의 프로젝트를 하나의 Multi Module 프로젝트로 통합하기 (1) - 프로젝트를 시작하며 서론멀티 모듈 프로젝트는 쉽게 말해, 하나의 큰 프로젝트 아래에 여러 기능 혹은 프로젝트를 모듈화하여 관리하는 방식을 말합니다. 각 회사마다 다르겠지만, 대부분의 회사에서는 여러 서비스들을 개발 및 운영하고, 같은 기능(인증 및 인가 등)이나 같은 형식의 데이터베이스 엔티티를 사용하다 보니 회사 규모가 커지면 커질수록 더 많은 리포지토리가 생겨나고, 같은 코드와 같은 기능들이 중복되기 시작합니다. 저의 경우에는 동시다발적으로 진행되는 프로젝트 및 유지보수 운영 때문에 IDE에 열려있는 프로젝트는 점점 많아지고 개발자들 간의 소통 또한 어려워졌으며, 코드 컨벤션(Code Convention)들도 어긋나게 되는 상황이 발생하였습니다. 이를 해결하기 위해 같은 기능을 담당하는 코드들을 통합하는 기회를 만들 겸.. Framework/Spring Boot 2024. 10. 30. Redis를 활용한 조회수 시스템 최적화와 동시성 이슈 해결 서론게시글을 제공하는 모든 서비스에서는 게시글의 조회수를 다양한 방법으로 제공하고 있습니다. 저희 회사에서도 게시글의 조회수를 집계하기 위해 여러 방식을 사용해 왔습니다. 기존에는 게시글 상세 조회 시마다 접속 정보(게시글, 접속 장치, 접속 시간)를 RDB에 로그 형태로 단순 삽입하고, 일정 시간마다 배치 작업을 통해 실제 조회수 RDB를 업데이트하는 방식이었습니다.하지만 이 방식은 시간이 지남에 따라 심각한 문제점을 드러냈습니다. 게시글의 수가 하루에도 몇십에서 몇백 개씩 증가하면서, 상세 조회마다 RDB에 Insert되는 횟수가 기하급수적으로 늘어났습니다. 이는 데이터베이스에 부하를 주고 성능 저하를 유발했습니다.이를 해결하기 위해 조회수 데이터를 Redis에 저장하고, 배치 작업을 통해 RDB를 .. Framework/Spring Boot 2024. 10. 18. Spring Boot에서 발생하는 직렬화 오류 해결 가이드 서론Spring Boot 애플리케이션 개발 중 Redis나 RabbitMQ와 같은 메시지 브로커를 사용하다 보면 예기치 않은 직렬화 오류를 마주할 수 있습니다. 특히 데이터 직렬화 및 역직렬화 과정에서 발생하는 문제는 시스템의 안정성을 해칠 수 있습니다. 이번 포스팅에서는 이러한 오류의 발생 원인과 해결 방법, 그리고 이를 이해하기 위한 이론적인 배경까지 자세히 살펴보겠습니다.1. 문제 상황Spring Boot로 개발된 문자 발송 서비스에서 다음과 같은 직렬화 오류가 발생했습니다.Could not read JSON: Unrecognized token 'TokenResDto': was expecting (JSON String, Number, Array, Object or token 'null', 'true.. Framework/Spring Boot 2024. 10. 8. RabbitMQ 활용하기 서론최근 RabbitMQ를 활용하여 이메일, SMS, 카카오톡 푸시 알림 등을 처리하는 Notification Application에 대해 개발하게 되었습니다. 때문에 본 포스팅에서는 RabbitMQ를 활용하여 Nofification Apllication에서 주로 사용하는 기능들에 대해 알아보는 시간을 갖도록 하겠습니다. 특히 Spring Boot와의 연동을 통해 실무에서 많이 사용되는 큐 전략과 예제 코드를 상세히 다루어, 처음 접하시는 분들도 쉽게 이해할 수 있도록 하겠습니다.1. RabbitMQ란?RabbitMQ는 오픈 소스 메시지 브로커 소프트웨어로, 다양한 프로토콜을 지원하며 메시지의 송신자와 수신자 사이에서 큐잉을 담당합니다. 시스템 간의 비동기 통신을 가능하게 하여, 애플리케이션의 확장성과 .. Framework/Spring Boot 2024. 9. 30. 스프링에서 TransactionManager에 대한 상세한 이해하기 서론트랜잭션은 데이터베이스 작업에서 일관성과 무결성을 보장하기 위해 필수적인 개념입니다. 스프링 프레임워크에서는 이러한 트랜잭션 관리를 쉽게 할 수 있도록 TransactionManager라는 추상화된 개념을 제공합니다. 이 글에서는 TransactionManager가 무엇인지, 어떻게 동작하는지, 그리고 어떻게 설정하고 사용하는지에 대해 기초부터 상세하게 알아보겠습니다.본론1. 트랜잭션(Transaction)이란?트랜잭션은 데이터베이스에서 **원자적(Atomic)**으로 수행되어야 하는 일련의 작업을 의미합니다. 즉, 여러 작업이 하나의 단위로 처리되어야 하며, 모두 성공하거나 모두 실패해야 합니다. 이는 데이터의 무결성을 유지하는 데 중요합니다.1.1 트랜잭션의 4가지 특성(ACID)Atomicity.. Framework/Spring Boot 2024. 9. 24. Spring Boot에서 @Transactional 어노테이션이 작동하지 않을 때 해결 방법 서론트랜잭션이 필요한 서비스 메소드에 아무리 @Transactional 어노테이션을 적용해도 트랜잭션이 발생하지 않는 상황에 처할 수 있습니다. 이런 경우, 문제의 원인을 파악하고 해결하기 위해 여러 가지 요소를 점검해야 합니다. @Transactional은 Spring 프레임워크에서 트랜잭션 관리를 위해 매우 중요한 어노테이션이지만, 설정이나 코드 구조에 따라 예상과 다르게 동작할 수 있습니다. 이 글에서는 @Transactional이 작동하지 않는 일반적인 원인과 그 해결 방법을 구체적인 예시와 함께 자세히 살펴보겠습니다.1. 메소드 접근 제어자 확인하기@Transactional이 적용된 메소드는 public 접근 제어자를 가져야 합니다. Spring의 AOP는 기본적으로 프록시 기반으로 동작하며, .. Framework/Spring Boot 2024. 9. 24. Spring Boot에서 MongoDB 인덱스 자동증가 (autoincrement) 기능 구현하기 mongoDB는 id를 String 형태의 문자열로 구성하고 있고, 이를 강제로 Long으로 바꾸어 사용할 수 있지만, 그럴 경우 MongoRepository의 findBy 관련 함수들을 많이 튜닝해줘야 하는 단점이 보였기에 별도로 Long 형태의 idx를 collection에 추가하여 사용하려 합니다. RDS에서 제공하는 auto increment기능이 noSQL에는 없기 때문에, 각 collection의 idx 마지막 값을 저장하는 별도의 collection을 구성하여 auto increment 기능을 구현하였습니다. 1. collection들의 마지막 idx를 가지고 있는 DatabaseSequence Class 생성하기 members collection의 Long idx의 마지막 값을 가지는 d.. Framework/Spring Boot 2022. 7. 20. Spring Boot 및 MongoDB를 사용하여 REST API 구축하기 - 회원 가입,탈퇴,조회 Spring Boot와 MongoDB를 공부하기 위해 사이드 프로젝트를 시작하려고 마음먹은 지 오래되었지만 막상 혼자서 공부하려니 너무 막연하고 주제도 못 정하고 있었습니다. 때문에 모든 사이트의 기본인 회원 관련 API부터 구현해보기로 마음먹고 첫발을 내딛습니다. [기술 스택] Gradle 7.4.2 Spring Boot 2.7.1 openJDK 18.0.1.1 mongoDB 4.4 (본문에서 다루는 모든 패키지는 com.kimmingyu.aws 하위에 선언하고 있기 때문에 본인의 프로젝트에 맞게 수정합니다.) 1. Gradle 필요 의존성 주입 아래 2개의 dependencies는 필수로 추가합니다. modelmapper를 사용하여 Object에서 Obejct로 값을 옮길때 번거롭게 getter, s.. Framework/Spring Boot 2022. 7. 19. 이전 1 2 다음