[JAVA] assert 잘 사용하기 (with Spring Assert)
·
Java & Spring
개요코드를 작성하다 보면 기본적으로 가정하고 있는 조건들이 있다.그런 조건들은 알고리즘을 파악하거나 주석을 읽으면서 확인할 수 있지만,Assertion을 사용하여 보다 명시적으로 나타낼 수 있다. Java에서 기본적으로 제공하는 assert 문법을 알아보고,이를 Spring에서는 어떻게 사용해야 하는지,또한 Spring의 Assert 클래스와는 어떻게 다른지 알아보자. Java의 assertjava의 assert 문법은 기본적으로 아래와 같이 사용한다.// assert [조건식];assert 1 == 2;// assert [조건식] : [실패 메시지];assert 1 == 2 : "유효성 검사에 실패했습니다.";조건식 결과가 true이면 정상적인 흐름, false이면 잘못된 경우임을 나타낸다. 하지만, ..
[Spring] Spring Boot 1.x에서 JUnit5 사용하기
·
Java & Spring
개요업무상 레거시 Spring Boot 1.5.x 버전을 유지보수할 때,테스트 코드를 도입하면서 JUnit5를 사용하고 싶었다. 하지만 Spring Boot 1.x에서는 JUnit5를 공식 지원하지 않기 때문에 JUnit4를 사용하다가,여러 방면으로 시도해보다 JUnit5 연동을 성공하게 되어 포스팅으로 남기게 되었다. spring-test-junit5위에서 언급한 대로 JUnit5는 Spring Boot 2.x (Spring 5.x) 버전부터 공식적으로 지원한다. 하지만 JUnit 공식 프로토타입 역할을 했던 아래 Repository를 참고해 보면,해당 프로젝트를 이용하면 Spring Framework 4.3.x의 JUnit5 지원이 가능하다고 적혀있다.https://github.com/sbrannen..
[사내 세미나] Spring Batch 도입하기
·
Java & Spring
개요이 글은 사내에서 Spring Batch에 대한 세미나를 진행하기 위한 강의 자료로 작성되었습니다.Spring Batch 도입에 필요한 프로세스를 빠르게 익힐 수 있는 내용으로 구성되어 있지만,사내 환경에 따른 의존성이나 공개되지 않은 자료가 있을 수 있는 점 참고 부탁드립니다 :) 소개배치 처리가 무엇인가요?AWS 클라우드 컴퓨팅 개념 허브의 배치 처리에 대한 문서의 내용에서는 아래와 같이 설명한다.배치 처리란 무엇인가요?배치 처리는 컴퓨터가 주기적으로 대량의 반복적인 데이터 작업을 완료하기 위해 사용하는 방식입니다. 백업, 필터링 및 정렬과 같은 특정 데이터 처리 태스크는 계산 집약적이며 개별 데이터 트랜잭션에서 실행하기에 비효율적일 수 있습니다. 대신 데이터 시스템은 대개 하루가 끝날 때나 야간..
[Spring] 레거시 프로젝트에 Testcontainers 도입하기
·
Java & Spring
개요레거시 프로젝트를 유지보수하고 확장해야 하는 업무를 맡게 되었다.테스트 코드가 없는 프로젝트이다 보니 유지보수 및 확장을 위한 리팩토링에 앞서 테스트 코드를 먼저 작성해야 했다. 쿼리 개선도 필요하여 기존 동작 검증을 위해 Testcontainers 도입을 결정했는데,상당히 과거 버전의 Java 및 Spring 프로젝트이다 보니 이에 맞춰 Testcontainers를 도입하는 과정을 기록하게 되었다. 프로젝트 스펙레거시 프로젝트 스펙은 아래와 같다.JDK 7Spring Boot 1.5.3JPA + MyBatisOracle 11g XEJUnit4Gradle따라서 위 버전 기준으로 Testcontainers를 도입하는 방법을 설명한다. Testcontainers란?Testcontainers란 테스트에 필..
Spring Boot 무료로 배포하기 (Koyeb, GitHub)
·
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] eventListener, transactionalEventListener 예외 및 트랜잭션 전파 총정리
·
Java & Spring
개요 Spring Boot에서 eventListener를 사용하는 경우가 종종 있는데, eventListener와 transactionalEventListener의 차이, transactionalEventListener의 phase 속성에 따라 동작 방식이 다 다르다. 따라서 이번 기회에 eventListener의 동작 방식과 트랜잭션과 엮이면 어떻게 동작하는지에 대해 정리해 보려고 한다. 문제 이번 포스팅에서는 위에서 기술한 각각의 방식에 따라 아래의 문제를 테스트한다. eventListener에서 예외가 발생하면 예외가 service로 전파될까? service의 @Transactional이 eventListener로 전파되고 커밋될까? 기본적으로 알아야 할 내용 아래는 eventListener와 @T..
[Spring] QueryDsl transform 및 SqmCaseSearched 오류 해결방법 with Hibernate 6.x
·
Java & Spring
들어가기 전에 해당 포스팅은 아래 환경 기준으로 작성되었습니다. 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..
[Spring] JPA 다중 서버 환경 DB 동시성 문제 해결하기
·
Java & Spring
개요 서비스를 운영하다 보면 동시성 문제에 의해 DB에 잘못된 업데이트가 발생하거나 중복 insert 등의 경우를 종종 마주칠 수 있다. 단일 서버라면 Java에서 제공하는 synchronized 블록을 이용해서 대응을 할 수 있겠지만, synchronized 블록은 하나의 Application 내에서만 동작하기 때문에 로드 밸런서를 통해 여러 대의 서버를 구성하였다면 완전한 동기화를 적용할 수 없다. 따라서 다중 서버 환경과 비슷하게 테스트해 보고 DB 동시성 문제를 해결해 보자. 만약 단일 서버라면 아래와 같은 방식으로 해결할 수도 있다. (synchronized + JPA) https://hojun-dev.tistory.com/entry/JAVA-JPA-중복-Insert-방지하기 [JAVA] JPA..