Java & Spring

개요 Spring Boot 프로젝트를 간단한 시연 혹은 토이 프로젝트 등의 용도로 빠르게 배포해야 하는 경우가 종종 있다. 기존에는 대부분 Heroku를 이용하여 빠르게 배포하는 경우가 많았는데, Heroku가 전면 유료화되면서 무료로 배포하기 어려운 상황이 되었다. Heroku를 대체할 만한 방법을 찾고 여러 플랫폼을 비교해 본 끝에, 가장 쉽고 빠르게 배포할 수 있는 플랫폼인 Koyeb을 이용하여 배포하기로 결정했다. https://www.koyeb.com/ Koyeb: Push code to production, everywhere, in minutes Koyeb is a developer-friendly serverless platform to deploy apps globally. No-ops,..
개요 Spring Boot에서 eventListener를 사용하는 경우가 종종 있는데, eventListener와 transactionalEventListener의 차이, transactionalEventListener의 phase 속성에 따라 동작 방식이 다 다르다. 따라서 이번 기회에 eventListener의 동작 방식과 트랜잭션과 엮이면 어떻게 동작하는지에 대해 정리해 보려고 한다. 문제 이번 포스팅에서는 위에서 기술한 각각의 방식에 따라 아래의 문제를 테스트한다. eventListener에서 예외가 발생하면 예외가 service로 전파될까? service의 @Transactional이 eventListener로 전파되고 커밋될까? 기본적으로 알아야 할 내용 아래는 eventListener와 @T..
들어가기 전에 해당 포스팅은 아래 환경 기준으로 작성되었습니다. JDK 17 Spring Boot 3.1.0 JPA + QueryDsl 5.0.0 Hibernate 6.2.2 개요 QueryDsl로 쿼리를 작성하던 중 transform을 사용하던 곳에서 아래와 같은 오류가 발생했다. 쿼리를 작성하는 부분은 아무리 봐도 문제가 없고 이전 버전에서 잘 동작하던 쿼리이기도 했다. 코드를 들어가 보니 hibernate 6.x 버전으로 넘어오면서 ScrollableResults에서 get(int) 메소드가 사라져서 발생한 문제였다. 해당 이슈를 구글링해 보니 아래와 같은 해결책이 존재했다. @Bean public JPAQueryFactory jpaQueryFactory() { return new JPAQueryF..
개요 서비스를 운영하다 보면 동시성 문제에 의해 DB에 잘못된 업데이트가 발생하거나 중복 insert 등의 경우를 종종 마주칠 수 있다. 단일 서버라면 Java에서 제공하는 synchronized 블록을 이용해서 대응을 할 수 있겠지만, synchronized 블록은 하나의 Application 내에서만 동작하기 때문에 로드 밸런서를 통해 여러 대의 서버를 구성하였다면 완전한 동기화를 적용할 수 없다. 따라서 다중 서버 환경과 비슷하게 테스트해 보고 DB 동시성 문제를 해결해 보자. 만약 단일 서버라면 아래와 같은 방식으로 해결할 수도 있다. (synchronized + JPA) https://hojun-dev.tistory.com/entry/JAVA-JPA-중복-Insert-방지하기 [JAVA] JPA..
개요 Java Spring Boot에서 프로젝트를 만들다 보면 엑셀 혹은 내부 json 파일을 읽고 return 하거나, static 파일들을 사용자가 직접 제공받을 수 있도록 web으로 열어두고 싶은 경우가 생긴다. 위 경우의 해결 방법과 주의할 점을 알아보자. 앱 내 활용 앱에서 resource로 사용할 파일들을 읽어서 return 하거나 재활용하기 위해서는 resource 폴더에 파일을 두고, ClassPathResource 클래스를 통해 가져다가 사용할 수 있다. 예시로 파일을 하나 만들어 필요한 내용을 기입하고 해당 파일의 내용을 읽어 반환할 수 있도록 구현해 보자. 먼저 test.json 파일을 만들어 아래 내용으로 작성한다. { "version": "v1", "template": [ {"ke..
들어가기 전에 만약 Calendar 클래스를 사용하고 계신다면 아래 포스팅을 참고해 주세요 :) https://hojun-dev.tistory.com/entry/JAVA-Calendar-한국식-월-주차-구하기 [JAVA] Calendar로 한국식 월 주차 구하기 들어가기 전에 만약 LocalDate 클래스를 사용하고 계신다면 아래 포스팅을 참고해 주세요 :) https://hojun-dev.tistory.com/entry/JAVA-LocalDate-한국식-월-주차-구하기 [JAVA] LocalDate로 한국식 월 주차 구하기 들 hojun-dev.tistory.com 개요 매주 보고서 데이터를 엑셀로 출력하여 전달해야 하는 시스템을 만드는 등 특정 날짜가 몇 월의 몇 주차인지 계산해야 하는 경우가 있다...
들어가기 전에 만약 LocalDate 클래스를 사용하고 계신다면 아래 포스팅을 참고해 주세요 :) https://hojun-dev.tistory.com/entry/JAVA-LocalDate-한국식-월-주차-구하기 [JAVA] LocalDate로 한국식 월 주차 구하기 들어가기 전에 만약 Calendar 클래스를 사용하고 계신다면 아래 포스팅을 참고해 주세요 :) https://hojun-dev.tistory.com/entry/JAVA-Calendar-한국식-월-주차-구하기 [JAVA] Calendar로 한국식 월 주차 구하기 개요 hojun-dev.tistory.com 개요 매주 보고서 데이터를 엑셀로 출력하여 전달해야 하는 시스템을 만드는 등 특정 날짜가 몇 월의 몇 주차인지 계산해야 하는 경우가 있다..
개요 Generic이 구성된 DTO에 Builder, SuperBuilder를 적용하면서 헤맸던 부분을 기록한다. Builder @ToString @Builder public class OuterDTO { private int id; private T inner; } 위와 같이 OuterDTO에 Generic을 구성하고, inner 필드에 들어갈 DTO는 아래와 같이 작성해 보자. @ToString 어노테이션은 테스트 시 출력 결과를 확인하기 위해 붙여두었다. @ToString @Builder public class InnerDTO { private String name; } 이후 아래와 같이 메소드를 구성하고 실행해 보자. 제네릭이 설정된 OuterDTO를 Builder로 적용할 때에는 builder(..
hojun-dev
'Java & Spring' 카테고리의 글 목록