728x90

Backend 150

SpringBoot 환경에서 JAVA_OPTS, TOMCAT_OPTS

외부 Tomcat 을 사용할 경우 구동시 추가할 실행옵션이 필요할 경우 JAVA_OPTS 또는 TOMCAT_OPTS 환경변수에 추가해 놓으면 실행시 자동으로 참조한다. 예를 들어 startup.sh 로 구동시 -Xmx256m 같은 메모리 설정을 추가하고 싶다면 환경변수 JAVA_OPTS 를 추가해서 -Xmx256m 를 등록해놓으면 된다. 기본적으로 구동시 JAVA_OPTS, TOMCAT_OPTS 를 모두 참조하기 때문에 하나만 정의해도 되지만 공식메뉴얼에서는 Java 관련된 설정값은 JAVA_OPTS 에 Tomcat 관련된 설정값은 TOMCAT_OPTS 에 설정하길 권장한다. 그런데 SpringBoot 내장톰캣에는 이게 적용되지 않는다. 기본적으로 아래와 같이 어플리케이션 구동시 command line ..

Backend/Spring+Boot 2022.02.22

[Mysql] 커넥션 정보

Mysql 서버에서는 Sql 을 처리하기 위해 연결가능한 커넥션 수를 미리 설정해 놓고 사용한다. 그 이상의 연결이 요청될 경우 Too Many Connection Error 가 발생한다. 이를 미리 예방하고 적절한 수치를 찾기 위해 Mysql 에서 제공하는 여러 데이터가 있지만 여기에서는 간단하게 설정된 최대 커넥션 수와 현재 접속된 커넥션 수 정도를 체크할 수 있는 방법만 기록한다.(사실 상세하게 정리된 포스팅이 너무 많은데 대부분 복붙같고.. 뜻이 애매한게 많아 잘 모르겠다...) 아래 질의를 통해 현재 Mysql 에 셋팅된 최대 연결 가능한 커넥션 수를 확인할 수 있다. show variables where variable_name in ( 'max_connections'); 아래 질의를 통해 현..

Backend/Database 2022.02.17

[Kafka] Consumer Error Handling(retry, recovery)

spring-kafka 을 통해 Consumer 구현하면 컨슈밍이 실패했을 때 기본적으로 최초 요청을 포함해서 10회까지 재시도한다. 그리고 재시도가 모두 실패하면 해당 메시지 skip 된다. 만약 이러한 정책을 커스텀하게 운영하고 싶다면 ConcurrentKafkaListenerContainerFactory 을 재정의하면 된다. spring-kafka 2.8 이전 버전에서는 setRetryTemplate 을 통해 retry 정책을 정의하고 setRecoveryCallback 를 통해 recovery 로직을 정의하면 됐다. 그런데 spring-kafka 2.8 버전부터 setRetryTemplate 은 deprecated 되었고, setRecoveryCallback 는 아직 있지만 대부분 아래와 같이 s..

Backend/Kafka 2022.02.15

No serializer found for class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)

JPA를 사용하다가 위와 같은 에러가 발생하는 경우가 있다. 의외로 서칭하니 답은 빨리나왔는데 설명이 장황하여 간단하게 원인만 정리한다. Entity 에 포함되는 속성 중 FetchType.LAZY 로 명시한 속성이 아직 Fetch 전인데 해당 Entity 를 json 직렬화 하려 할 때 발생한다. 좀 더 자세히 이야기 하면 Entity의 해당 속성이 아닌 프록시로 감싸져있는 hibernateLazyInitializer 를 직렬화 하려 하기 때문에 발생한다. 다르게 말하면 FetchType.LAZY 로 명시한 속성은 반드시 Fetch 가 완료된 뒤에 json 직렬화를 해야 한다. 만약 그게 싫다면 아래와 같이 해당 속성을 아예 직렬화에서 제외시켜야 한다. https://ahndding.tistory.co..

Backend/JPA 2022.02.14

[Kafka] multi KafkaTemplate

SpringBoot 에서 Kafka 연동은 매우 간단하다. org.springframework.kafka:spring-kafka 의존성을 추가하고 application.yml 에 Kafka 관련 구성정보만 추가하면 된다. 그런데 서로 다른 여러개의 브로커를 동시에 참조해야 할 때는 이 방법을 사용할 수 없다. application.yml 에 Kafka 브로커 정보는 spring.kafka.bootstrap-servers 에 지정하고 "," 로 구분된 여러개의 브로커 host를 지정할 수도 있긴 한데 이는 HA, LB를 위한 구성으로 순차적으로 접근하되 정상적인 상태의 단일 브로커만 연결된다. 또한 HA, LB를 위한 구성인만큼 지정된 브로커들은 기본적으로 모두 동일한 토픽이 존재해야 한다. 서로 다른 여..

Backend/Kafka 2022.02.11

[Kafka] 삽질 기록..

카프카 프로듀서와 컨슈머를 예전에 개발한 경험이 있는데 이번에 다시 개발하려니 예전에 잘못알고 있던 것도 있었고 새로 알게된 것 중 모호했던 것들을 정리한다. 1. spring-kafka, spring-cloud-stream 예전에 프로듀서와 컨슈머를 만들 때에는 spring-kafka 의존성을 사용했다. 그런데 리서치하다보니 spring-cloud-stream 라는 의존성도 있었다. 사실 이 중 뭘 사용해도 상관은 없다. 차이가 있다면 spring-kafka 는 메시지큐 중 Kafka 에 종속적이고 spring-cloud-stream 는 Kafka 외에 RabbitMQ 같은 다른 메시지큐도 지원하기 때문에 구성이 좀 더 추상적이다. 이에 구현은 spring-kafka 이 더 쉽지만 기능은 spring-..

Backend/Kafka 2022.02.10

Mysql 이모지 저장하기

이모지 같은 문자들은 글자당 최대 4바이트의 사이즈가 필요한데 Mysql 의 utf8 문자셋의 경우 글자당 최대 3바이트까지만 지원한다. 이에 일부 ❤️ 같은 일부 이모지는 저장 가능하지만 🧜 같은 이모지는 아래와 같은 오류와 함께 저장이 되지 않는다. SQL Error: 1366, SQLState: HY000 Incorrect string value: '\xF0\x9F\xA7\x9C' for column ... 모든 이모지를 사용하려면 문자셋을 utf8mb4 로 변경해줄 필요가 있다. 참고로 utf8는 utf8mb4의 서브셋이기때문에 인코딩 타입이 utf8 -> utf8mb4 변경 되더라도 기존에 저장된 문자열이 깨지지는 않는다. 다만 문자 하나당 최대 바이트 수가 바뀌면서 문자열 칼럼에 인덱스가 걸려..

Backend/Database 2022.02.07

Coroutine timeout 설정

Coroutine 을 사용하는 이유는 병렬처리 또는 자원의 균일한 사용이다. 이런 면에서 timeout 은 필수로 필요한 설정이 된다. Coroutine 패키지에서 제공되는 withTimeout 함수를 사용하면 손쉽게 timeout 을 설정할 수 있는데 이걸 어떤 형태로 사용하느냐에 따라 동작이 전혀 달라지기 때문에 이를 기록해 놓는다. 결론부터 말하면 아래와 같은 형태로 사용하면 된다. runBlocking(Dispatchers.IO) { repeat(5){ launch { try{ withTimeout(3000) { if (it == 1) delayRoutine(it) else normalRoutine(it) } }catch (e: Exception){ println("$it ${e.message}"..

Backend/Kotlin 2022.02.04

[Kotlin] 코틀린에서 @QueryProjection 사용하기

Querydsl를 이용하는 경우 엔티티와 다른 반환 타입인 경우 Projections를 사용한다. Projections 를 적용하는 방법은 여러가지가 있는데 권장되는 방법은 @QueryProjection 어노테이션을 활용하는 것이다. 우선 https://findmypiece.tistory.com/287 와 같이 코틀린에서 JPA Entity 를 정의할 경우 일반 class 사용이 권장되지만 Projections 은 영속상태가 아니라 dirty checking 도 동작하지 않고 lazy loading도 어차피 지원하지 않기 때문에 data class 를 사용해도 무관하다. @QueryProjection 는 생성자에 지정할 수 있는데 코틀린에서는 이걸 사용하기가 좀 애매하다. 기본생성자를 별도 클래스로 만드..

Backend/Kotlin 2022.02.03

[Kotlin] JPA Entity. data class? class?

Spring 가이드에도 나와있듯이 JPA Entity 는 data class가 아닌 일반 class 를 사용하는 것이 권장된다. 사실 data class 를 Entity로 사용하더라도 몇가지만 주의하면 문제될 것은 없지만 일반 class 사용이 권장되는 이유는 data class 를 Entity 로 사용할 경우 data class 답게 사용하지 못하게 된다는 것에 있다. 코틀린이 data class 의 특징은 아래와 같다. equals(), hashCode(), toString(), copy() 메소드를 자동으로 만들어준다. copy() 메소드는 얕은복사만 지원하기 때문에 data class 는 불변 클래스로 사용하는 것이 권장된다. 순수하게 데이터만 관리하는 클래스인 만큼 open 키워드를 통한 상속을..

Backend/Kotlin 2022.02.03
728x90