[JPA, Kafka] @Transactional과 Kafka 메세지 전송 시점
·
Spring/JPA
카프카와 트랜잭션의 수행 시점Kafka와 JPA를 함께 사용하면 수행되는 시점에서 차이가 있다. 우선 @Transactional을 적용한 경우 어떤 시점에 트랜잭션이 생성되고 수행되는지 확인해야 한다.그림을 통해 먼저 확인해보자. 유저의 요청이 들어오면 Controller 에서 요청을 받아 Service Layer에서 request에서 받은 요청 또는 조회해서 반환할 내용을 DB에서 가져오게된다. 데이터의 변화가 발생했다면 @Transactional은 영속성 컨텍스트에 있는 1차 캐시(한 번 이미 조회하여 데이터가 있다고 가정)와 Snapshot을 비교하게 되는데 이때 더티체킹을 하여 변화가 있다면 Update 구문을 발생하게 된다. 이 쿼리는 메서드가 끝나는 시점에 트랜잭션이 수행되고 DB에 커밋되게 ..
[Spring/Serialization-Deserialization] Date, LocalDate, LocalDateTime 형변환 방법, 직렬화/역직렬화 문제 해결하기
·
Spring
평소에 Token을 만들때 IssuedAt에 Date 타입을 User의 LocalDateTime 타입으로 전환하려고 할때  또는 LocalDateTime을 사용해서 Date 타입의 필드에 넣으려고 할 때 항상 애를 먹었다.그래서 타입 변환에 필요한 메서드들을 다음번엔 이 글을 보고 바로 처리할 수 있게 차례대로 정리해 두려고 한다.또한 직렬화/역직렬화에서 생겼던 문제를 다뤄볼것이다. 1. Date → LocalDate, LocalDateTime 변환  1-1. Date → LocalDate 변환 Date 객체를 LocalDate로 변환하려면, 먼저 Instant로 변환한 후 ZoneId를 지정하여 ZonedDateTime으로 변환한 뒤 toLocalDate()를 호출한다. 코드 예제import java...
[JPA] @Transaction을 붙이지 않았을 때 생기는 문제, JPA Proxy, LazyLoading과 EagerLoading N+1 문제
·
Spring/JPA
오늘부터 리팩토링 또는 트러블 슈팅위주로 포스팅하려고 한다. 오늘 해결했던 문제LazyLoading으로 설정한 엔티티가 가져와지지 않는 문제2025-02-21T21:31:27.016+09:00 WARN 5521 --- [nio-8080-exec-6] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.server.delivery.model.store.entity.Store.operatingHours: could not initialize proxy - no Session]위 warn 로그의..
[JPA] Soft Delete 개발 방법(Hard Delete과의 차이)
·
Spring/JPA
Soft Delete란?이름 그대로 부드러운 삭제이다. Hard Delete는 데이터베이스 내의 데이터를 실제로(물리적) 삭제를 해버린다.Soft Delete는 논리적으로 삭제를 표기하는 방법이다. 현업에서는 데이터를 몇 년간 보존해야 하는 규정이 존재할수도 있기에 몇 년간 데이터를 보관해두다가 Batch 작업을 통해 일괄적으로 데이터를 처리하기도 한다.또한 잘못 삭제했을 경우 백업이 가능하기에 사용하기도 한다.Soft Delete의 단점?데이터베이스에 계속해서 데이터가 쌓이므로 데이터베이스의 용량이 커질 수 밖에 없다. 이후 배치작업을 통해 데이터를 삭제하는 과정이 필요하다.SELECT조회 시 불필요한 검색 조건을 추가해야 한다.Where을 통한 필터링이 꼭 추가되어야 한다.기존의 Soft Delete..
[Github] Yml파일 서브모듈에서 불러와서 안전하게 사용하기
·
Spring
yml파일을 사용하게 되면 팀원들과 함께 사용할 데이터들을 정보로 저장해둬야 하지만 예민한 정보들이 함께 들어있는경우 섣불리 Github에 push할 순 없다. private 레포지터리라면 상관없지만 public이라면 더더욱 그렇다. 그렇다면 어떻게 yml파일을 github에 올리지 않고 사용할 수 있을까?다양한 방법들중 오늘 소개할 방법은 Submodule 이라는 개념을 사용해서 기존 레포지터리의 하위 레포지터리를 연결해 가져오는 방식을 사용하려고 한다.서브모듈의 장점환경 설정의 중앙 집중화여러 프로젝트에서 동일한 설정을 하게 될 경우, 별도의 서브모듈로 yml파일을 가져오기 때문에 한 곳에서만 yml파일을 생성하고 기록해두면 된다.이 개념은 MSA환경의 Config서버와 동일한 방식으로 봐도 될 것 ..
[Restful API] Restful한 API 문서 작성법, REST API 성숙도 모델
·
Spring
스파르타의 자바 단기심화 훈련에서 첫 번째 프로젝트를 시작했다.첫 프로젝트의 리더를 맡았고 첫 번째 날 과제는 API Document, Table Document, ERD 작성, System Architecture를 작성하는 것이었다. 거즘 20시간밖에 남지 않았고 팀원분들은 일정이 있어 요구사항을 전반적으로 혼자 봐야하는 상황이 생겼다.이 과정에서 내가 튜터님에게 듣고 공부한 것들을 정리해볼텐데 오늘은 Restful API를 어떻게 작성하는가를 실제 현업자 튜터님들에게 들은 내용과 이론 기반으로 정리하려고 한다.Restful란?REST(Representational State Transfer)는 클라이언트와 서버 사이에서 HTTP 프로토콜을 활용하여 웹의 장점을 활용할 수 있는 하나의 프로토콜이다.자원..