본문 바로가기
반응형

Spring56

[Spring] Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8mb4_0900_ai_ci,IMPLICIT) for operation '=', 'UNION' 문제 로그에 갑자기 이런 에러가 발생했다. Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8mb4_0900_ai_ci,IMPLICIT) for operation '=' Illegal mix of collations for operation 'UNION' ?? 뭐지 원인 MySQL을 5.7에서 8.x로 버전 업을 했는데 이게 바로 원인이었다. 8.0부터 기본 collation이 utf8mb4_0900_ai_ci로 바꼈다고 한다. 그래서 CAST 함수에 collate 옵션을 안 주고 그냥 썼을 경우 기본값인 utf8mb4_0900_ai_ci로 변환이 됐다. db collation 설정이 utf8mb4_general_ci로 되어있음에도 불구하.. 2024. 3. 30.
[Spring] Spring Boot + Kotlin + MyBatis 프로젝트 설정 방법 이번 포스팅에선 Spring Boot + Kotlin 프로젝트에서 MyBatis를 설정하는 방법에 대해 알아보겠다. 어렵지 않지만 생각보다 깔끔하게 정리된 곳이 없어서 꽤 애를 먹었다. MyBatis 사용법을 다루진 않을 거다. 자세한 건 공식 홈페이지를 참고바란다. 1. mybatis-spring-boot-starter 의존성 추가 spring boot 버전에 따른 mybatis-spring-boot-starter는 MyBatis 공식 사이트에서 확인 가능하다. 나는 2..7.x를 사용하고 있어서 2.3.x 버전을 사용했다. // Gradle implementation("org.mybatis.spring.boot:mybatis-spring-boot-starter:2.3.1") // Maven org.m.. 2024. 3. 26.
[Spring] 재시도할 때 사용하는 @Retryable, @Recover 사용법 이번 포스팅에선 Spring에서 재시도할 때 사용하는 어노테이션 @Retryable, @Recover에 대해 알아보겠다. @Retryable이란? Bean의 메소드 실행 도중 exception이 발생한 경우 재시도를 할 수 있게 해주는 어노테이션 @Retryable 사용 방법 1. spring-retry 의존성 추가 implementation("org.springframework.retry:spring-retry") 2. Spring Application에 @EnableRetry 추가 @EnableRetry @SpringBootApplication class SpringApplication 3. 재시도할 메서드에 @Retryable 추가 @Service class RetryableService { @Re.. 2024. 2. 26.
[Spring] JPA의 AttributeConverter, @Converter, @Convert 사용법 이번 포스팅에선 AttributeConveter, @Converter, @Convert에 대해 알아보려고 한다. AttributeConverter란? JPA 엔티티의 프로퍼티 값을 저장할 때 원하는 값으로, 읽어올 때 원하는 타입이나 값으로 변환하고자 할 때 사용하는 인터페이스다. 사용처를 간단하게 예를 들면 1. enum 타입 프로퍼티를 DB에 저장 2. 암호화된 DB 값을 조회할 때 복호화 자세한 예는 아래에서 설명하겠다. AttributeConveter는 아래와 같이 정의되어 있다. public interface AttributeConverter { // 컨버터를 적용할 프로퍼티의 값이 DB에 저장될 때 어떤 값으로 저장되길 원하는지 public Y convertToDatabaseColumn (X.. 2024. 2. 4.
[Spring] Kotest 병렬 테스트 설정 방법 이번 포스팅에선 Kotest로 작성한 테스트를 병렬로 실행하는 방법에 대해 알아보겠다. Kotest 병렬 테스트 설정 방법 AbstractProjectConfig를 상속받은 클래스를 만든 후 parallelism level을 설정해서 테스트를 몇 개씩 동시에 실행할 건지 설정할 수 있다. class KotestProjectConfig : AbstractProjectConfig() { override val parallelism = 3 } 병렬로 실행되는 단위는 Spec 단위다. 병렬로 실행한다고 해서 @SpringBootTest, @DataJpaTest 테스트를 돌릴 때 애플리케이션이 테스트마다 올라가지 않으니 걱정 안 해도 된다. 병렬 테스트 예제 먼저 parallelism 설정을 하지 말고, 아래와 .. 2023. 12. 31.
[Spring] Gradle Test events were not received 해결 방법 문제 SpringBoot 테스트하려고 gradle test를 돌렸는데 Test events were not received라고 나오고 테스트가 돌아가지 않는다. 분명히 잘 돌아갔었는데 갑자기 왜 이러지.. 원인 테스트를 수정한 후 돌리면 잘 돌아가길래 안 돌아가는 테스트랑 로그를 비교해봤더니, test UP-TO-DATE 만 달랐다. 그렇다. 테스트 성공 후 변경 사항 없이 다시 돌리면 돌아가지 않는다. 실패한 경우엔 돌아감. 해결책 X. 구글링을 해보니 대부분 Settings -> Build, Execution, Deployment -> Build Tools -> Gradle에서 Run tests using을 IntelliJ IDEA로 변경하라고 나와있는데 이상하게 해결되지 않았다. O. 그래서 tes.. 2023. 12. 28.
[Spring] Kotest와 Mockk를 사용할 때 주의할 점 이번 포스팅에선 Kotest와 Mockk를 같이 사용할 때 주의할 점에 대해 알아보겠다. 아래 테스트를 돌리면 어떻게 될까? 성공할까? 실패할까? Kotest의 Isolation Mode를 공부했다면 당연히 답할 수 있는 문제다. class UserServiceTest : DescribeSpec({ describe("getUser") { val userService = mockk() context("유저가 있는 경우") { every { userService.getUser(any()) } returns User(1, "노력남자") it("User를 리턴한다.") { userService.getUser(1) shouldBe User(1, "노력남자") verify(exactly = 1) { userServ.. 2023. 12. 26.
[Spring] Kotest DescribeSpec, BehaviorSpec에서 Isolation Mode에 따른 동작 방법 알아보기 이번 포스팅에선 Kotest의 DescribeSpec, BehaviorSpec에서 isolation mode에 따라 어떻게 동작하는지 알아보려고 한다. 아래 설명은 DescribeSpec 기준으로 하려고 한다. BehaviorSpec이 궁금하면 describe = given, context = when, it = then으로 생각하며 보면된다. Isolation Mode란? Kotest의 Isolation Mode는 테스트 간 변수, 테스트 객체, 목 객체 등을 어떤 단위로 공유할지에 대한 전략이다. Isolation Mode에 따라 생성되는 테스트 단위를 인스턴스라고 한다. 공식 홈페이지에서는 Isolation Mode에 따라 새로운 스펙(Spec)이 생성된다고 말을 한다. SingleInstance,.. 2023. 12. 25.
[Spring] Kotest context, when 단위로 @Transactional 동작하게 하는 방법 이번 포스팅에선 Kotest에서 DescribeSpec의 context, BehaviorSpec의 when 단위로 @Transactional 동작하게 하는 방법에 대해 알아보겠다. 이전 포스팅에서 Kotest로 작성된 테스트에서 @Transactional 동작하게 하는 방법에 대해 알아봤는데 context, when 단위로 동작하는 방법은 없었다. (아래 글은 DescribeSpec의 context 기준으로 작성됐는데, BehaviorSpec을 사용하는 경우 context를 when로만 바꿔주면 된다.) 왜 없을까? 없어서 불편하다라고 생각만 했지, 별로 왜 없는지 생각을 해보진 않았는데 팀원분이 말해주신 이유는 아래와 같다. context 단위로 트랜잭션을 묶어주는 경우 트랜잭션 범위를 지정하는 방법이.. 2023. 12. 11.
반응형