SpringBoot39 [Spring] 명시적 엔티티 리프레시를 지양하기 위한 트랜잭션 분리 방법 클로디 개발 과정 중 재미있는 소재거리가 또 있어서 고민 및 구현 과정에 대해 소개하고자 한다. 다음 스프린트 최대한 빨리 주말에 해치워보자~~~ 문제 상황우선 클로디는 일기를 작성 한 뒤 광고를 보면 즉시 일기에 대한 답변을 받아볼 수 있다.기존 코드 양상은 아래와 같았다. /** * 광고 시청 후 즉시 답변을 처리하는 메서드 */@Override@Transactionalpublic void processAdReply(ReplyAdRequest replyAdRequest, ZoneId timezone) { LocalDate diaryDate = LocalDate.of(replyAdRequest.year(), replyAdRequest.month(), replyAdRequest.date()); .. 2025. 11. 29. [오픈소스] spring-batch, 첫 오픈소스 기여의 시작 오늘 오픈소스 첫 기여에 성공했다.올해 9월 초에 올린 PR이 오늘 머지가 되었다는 메인테이너 분의 답글을 받았다. - 내가 올린 PRhttps://github.com/spring-projects/spring-batch/pull/4967 Clarify Javadoc for FaultTolerantStepBuilder#skipLimit by rla124 · Pull Request #4967 · spring-projects/spring-batchFixes #4963 Summary The current Javadoc for the FaultTolerantStepBuilder#skipLimit method is misleading. It states that the skip limit is "ignored" w.. 2025. 10. 22. [Spring] JPA @NotNull @NonNull nullable=false 차이와 대안 Entity 설계 시 클라이언트 null 검증 vs DB 제약 조건 not null도메인 엔티티 필드의 유효성을 검증하는 방법에는 여러 가지가 있다.1. 필드에 @NonNull 붙이기2. 필드에 @NotNull 붙이기3. nullable = false 설정하기 각 어노테이션의 차이점과 내가 생각하는 적절한 대안이란 무엇일까 고민해본 부분에 대해서 작성해보려고 한다. @Column(nullable = false)JPA는 @Entity를 설계한 뒤 실제 Hibernate sql을 보면 자동으로 DDL을 생성한다. @Column을 통해 칼럼에 대한 제약 조건을 걸어줄 수 있는데 nullable = false로 두면 create table query에서 해당 칼럼에 not null 조건이 자동으로 명시된다. 하.. 2025. 4. 28. [Spring] @EntityScan은 언제 필요할까 기본적으로 처음 springboot 프로젝트를 생성하면 main func에 @SpringBootApplicaiton 어노테이션이 붙게 된다.그런데 해당 main func과 같은 패키지에 엔티티가 위치하는데 @EntityScan 어노테이션이 추가로 필요할까?JPA 관점에서 @SpringBootApplication을 뜯어보려고 한다. @SpringBootApplication 구성 요소해당 어노테이션은 기본적으로 아래 세 가지 기능을 내장하고 있다.- @Configuration → Spring 설정 관리- @EnableAutoConfiguration → 자동 설정을 활성화 - @ComponentScan → @Component, @Service, @Repository, @Entity, @Controller 등을.. 2025. 4. 27. [Spring] Servlet Filter access log 관리 문제 상황이전에 Spring logback을 통해서 콘솔 로그를 파일로 관리해서 보다 쉽게 디버깅을 할 수 있도록 했다면 이제는 운영 관점에서 보다 쉽게 어떤 요청이 들어왔을 때 서버에서 어떤 응답이 내려줬는지 확인하여 문제점 분석을 용이하게 하고 싶었다.실제 엑세스 로그를 관리하는 것의 중요성을 여러 경험을 통해 체감했기 때문에 이 부분은 내가 꼭 실제 구현을 해보며 짚고 넘어가고자 했다. 해결 방법 : Servlet Filter로 요청과 응답 가로채기PR 링크를 통해 filter 내용 및 req/res를 파일에 남기는 일련의 과정을 확인할 수 있다. 아래는 filter 로직 절차이다.아래 내가 공부해며 구현했던 사고 과정을 정리했다. 1. 필터란?Servlet Filter는 요청/응답 전후 공통 처리.. 2025. 4. 27. [Spring] 양방향 맵핑 순환 참조 문제 해결 스프링부트 공부를 하고 처음 마주친 에러의 해결 과정에 대해서 기록하고자 한다. 해당 이슈는 이런 문제가 생길 수 있다~라고 대략적으로 들어보기만 했는데 실제로 맞닥뜨린 것은 처음이었다. Let's Go 문제 상황 : 객체 직렬화 시 연관된 양방향 매핑으로 인한 순환 참조 문제기존에 내가 원하던 것은 클라이언트의 req와 해당 요청에 대해 내 서버가 어떤 응답을 내렸는지를 로그 파일로 저장해두기 위해 작성했던 코드에서 발생한 에러였다.@Transactionalpublic BouquetCustomizingResponseV2 updateBouquet(BouquetCustomizingRequest request, Long memberId, Long bouquetId, List multipartFiles) { .. 2025. 4. 5. [Spring] 단일 서버 환경에서 API 기능 동시성 문제 고려하기 2024년 상반기에 진행했던 프로젝트를 2025년 상반기(현재)에 다시 훑어보며 과거에는 신경쓰지 못했던 관점이 무엇이었는지 돌아보고 있는 시간을 가지고 있다. 내가 선정한 여러 관점 중 첫번째 관점이 "동시성 Concurrency" 문제였다. 동시성 문제 상황layered-architecture 상에서 studyRelationService는 교내 재학생들을 위한 스터디 "지원 현황" 이력을 관리하는 파트이다.내가 수정을 해야겠다고 느꼈던 부분은 아래 api들이었다.1. 스터디 지원 취소 API : studyRelation의 status를 CANCEL로 업데이트 한다2. 스터디 게시자가 지원자들을 수락/거절하는 상태 업데이트 API : 지원자의 studyRelation의 status를 ACCEPT || .. 2025. 3. 10. [Spring] 콘솔 로그를 어떻게 잘 관리할 수 있을까 개발을 하다보면 트러블 슈팅을 해야할 일이 정말 많이 생긴다. 버그를 해결하는 과정에서 개발 테스트 상 스프링부트를 재실행하면 콘솔 로그가 초기화되면서 직전 로그 내역을 다른 곳에 기록해두지 않는 이상 확인을 할 수 없게 된다. 이뿐만 아니라 프론트에서 백엔드 서버로 API 요청 시 에러 사항에 대해서 확인하고 싶을 때 ec2에 접속해서 docker-compose logs(tail 옵션 붙여서 최근 로그를 바로 확인)를 통해 해당 에러가 언제 생겼는지 훑어야 하는 불편함이 존재한다. 따라서 로그의 영구적인 관리 중요성을 느끼고 WHOA 서비스에 (이슈 링크) 적용해보고자 했다. 먼저 콘솔 창에 로그를 출력할 때 System.out.println을 쓸 경우 성능 저하가 상당하기 때문에 loggerFacto.. 2024. 12. 14. [Spring] 반복적인 추가 쿼리 @EntityGraph와 @Cacheable을 통한 성능 개선 WHOA 서비스는 주제가 꽃이기 때문에 하나의 꽃 종류에 대해서도 색에 따라서 꽃말이 달라질 수 있다는 점을 고려해 꽃, 꽃말, 꽃이미지, 키워드 테이블 간 도메인 지식을 반영해 연관 관계가 맺어져 있다. 그 중에서 "색깔에 따라 꽃말이 달라질 수 있는 부분"을 고려해서 꽃과 꽃말은 일대다, 꽃말과 꽃이미지는 일대일 양방향, 꽃말과 키워드는 다대다이기 때문에 매핑 테이블을 추가로 두어 1:N:1 매핑을 하고 있으며, 키워드는 꽃다발 구매 목적 테이블과 다대다 관계를 이루어 이 중간에도 1:N:1 관계의 매핑 테이블을 두고 있는 구조이다. 문제 상황 이 서비스 특성 상 특정 꽃에 대해서 특정 꽃말에 따라서 그에 맞는 꽃 사진을 보여주는 로직이 많다. 그래서 꽃말 → 꽃이미지로 get을 통해서 꽃이미지 객체.. 2024. 12. 8. [Spring] RestTemplate -> WebClient 외부 API 호출 방식 변경 및 bulk 처리 지금 진행 중인 WHOA 서비스는 @Scheduler cron annotation을 통해 매주 월요일 자정마다 외부 API 호출을 하여 꽃 정보를 가져오고 있다. 기존 스케쥴러 작동 방식은 아래와 같다. 1. localDateTime now()를 통해 dateFormatter로 외부 api 요청 형식에 맞게 포매팅을 해서 service-key로 화훼 사이트에서 데이터를 요청한다2. restTemplate를 통해 apiUrl로 get 요청을 보내 JsonNode 형식의 객체를 응답 받는다3. 응답 json 형식에 따라 JsonNode 객체를 읽기 위해 readTree, path 내장함수를 이용해 key-value 형식의 값을 읽어들인다4. 외부 api 응답 값 중 db에 저장해야 하는 데이터를 선별하여 M.. 2024. 12. 7. [Spring] DTO 반환 시 필요한 응답만 QueryProjection으로 매핑하여 반환 요새 병행하고 있는 일뿐만 아니라 내가 접해보지 못했던 새로운 지식을 적용해볼 수 있도록 하기 위해 기존의 사이드 프로젝트를 지속 및 유지하고 있는 중이다. 지금 내가 병행하고 있는 프로젝트는 2024년 극초반부터 진행했던 WHOA이다. WHOA는 iOS 앱스토어에 2차 릴리즈까지 마치고 3차 MVP를 개발하고 있는 꽃다발 커스터마이징 서비스이다. 백엔드는 현재 내가 혼자 맡고 있는데 이전에 함께 작업하시던 분께서 작업하시던 코드를 코드 성능 개선 및 리펙토링 목적으로 찬찬히 뜯어보고 있던 도중 비효율적이고 반복적인 쿼리가 발생하는 것을 알게 되었다.현재 게시글은 모두 다른 분의 코드를 보고 이해하며 성능 개선을 한 사례에 대한 글이다. 문제 상황성능 개선이 완료된 pr 링크WHOA 프로젝트는 화훼 .. 2024. 12. 7. [Spring] Widget 구현 방안 프로젝트 기능 상 widget을 구현해야 했다. 프론트 ui/ux의 하단에 위젯 봇 아이콘이 표시되고 이 아이콘을 클릭할 경우 프로젝트에서 기획한 비즈니스 로직(위젯 채팅)이 수행되는 방향이었다. 아이콘의 css 적인 디자인 양상은 위젯 생성 API에서 es에 insert가 된 data였고 이 정보를 프론트에서 어떻게 주고 받을지가 관건이었다. 이 기능 작업 시 막힌 부분과 대책에 대해서 간략하게 작성하고자 한다. 지금까지 위젯 관련 구현 완료된 작업 내용1. 위젯 CRD API2. 위젯 임베딩 링크 반환 API 3. 위젯 임베딩 링크 접속 시 위젯 상세 정보 반환 API와 동일한 data 반환하도록 로직 설계 (위젯 상세 조회 data) 앞으로 해야 할 내용1. 위젯 화면(프론트적 요소)를 어떻게 백.. 2024. 9. 29. [Spring] ElasticSearch 검색 필터링 API 고도화 고민 : 쿼리 라이브러리 비교 추석 연휴를 제외하고 9월 12일부터 elasticSearch 기반의 조회 API(검색 필터링 기능) 작업을 시작하여 이번주(9월 3주차) 금요일까지 12일, 13일, 19일, 20일 elasticDB 습득 과정부터 실제 개발 과정까지 포함해 총 4일에 거쳐 드디어 전체 조회 시 requestParam으로 받은 여러 필드에 대해서 null 조건까지 포함하여 필터링을 하는 로직을 드디어 구현해냈다. 내가 ElasticSearchRepository, ElasticsearchClient, ElasticsearchOperation을 도입한게 처음이었던 것과 관계 없이 주어진 일정 기간 안에 구현을 끝냈어야 했고 앞으로 구현해야 할 부분의 마감 기간까지 고려했을 때 20일까지는 적어도 이 파트를 끝냈어야 차질이 .. 2024. 9. 22. [Spring] SecurityFilterChain 구성 요소 보호되어 있는 글 입니다. 2024. 9. 1. [Spring] @WebMvcTest를 이용한 API 테스트 코드 작성 시행착오 개발을 하면서 동시에 테스트 코드 작성까지 했으면 퍼펙트했겠지만 학기 중에 학점을 꽉 채워 듣고 다른 여러 가지를 병행하고 있었기 때문에 시간적으로 테스트 코드를 작성하지 못하였는데 2차 MVP에서는 팀의 목표와는 별도로 내가 맡은 API에 대해서 테스트 코드도 작성해보려고 한다. 앱 실행 스플래쉬 단계에서 먼저 프론트에서 연결해야 했던 API에 대한 테스트 코드를 작성하며 겪었던 시행 착오와 알게된 지식을 기록하고자 한다. 이 게시글에서 소개하는 최종 테스트 코드 작성은 이 PR 링크에서 확인할 수 있다. 테스트 코드를 작성하려는 API 소개테스트 코드를 작성하려는 API pr 링크이다. 이 이후로 리펙토링을 하여 아래와 같이 되었다. @RestController@RequiredArgsConstru.. 2024. 8. 27. 이전 1 2 3 다음