반응형

개발/Spring 72

maxLifeTime 무제한으로 발생한 이슈

요즘 대부분의 회사에서는 MSA 로 서비스가 구성되어 있다. 그렇다면 자신이 담당하고 있는 서비스에서 다른 서비스에 API 를 호출하게 되는 경우가 필연적으로 생기게 되는데 이 때 파악하지 못한 곳에서 문제가 생겨 훗날 기억하기 위해 글을 작성하게 되었다. WebClient 기반으로 A 서비스의 API 를 호출하고 있다고 가정해보자. 이 때 A 서비스는 AWS EB 기반의 blue-green 으로 구성되어 있으며, beanstalk 의 environment url (active.beanstalk.com) 은 route 53 에 test.com 에 연결되어 있다고 해보겠다. A 서비스가 배포할 시에 각 blue - green 환경의 url 을 스왑하는 형식으로 구성되어 있다. 좀 더 쉽게 표현하면 다음과 ..

개발/Spring 2023.05.16

[Spring] 서버 heap dump 떠보기 : jpa query plan cache

주말에 갑자기 서버가 죽었었다. 노트북을 가지고 있지 않았어서 우선 급한대로 서버를 재기동 시켰다. AWS CloudWatch 를 확인해보니 out of memory 로 인해서 그런듯 보였다. 우선 기존에 JVM option 으로 -XX:+HeapDumpOnOutOfMemoryError 를 추가해 놓았기 때문에 힙덤프를 떠 놓았겠지 싶었다. 그러나 베스천 서버를 통해 ec2 서버에 접속해보니 힙덤프 로그는 보이지 않았다. 한 가지 추가하지 않은 것이 있다면 -XX:HeapDumpPath 해당 옵션을 추가하지 않았다. 옵션이 없어도 기본적으로 JVM 시작 디렉토리에 저장이 된다고는 하지만 난 ec2 내에서 찾지 못했다(출처: 권남의 블로그). 어쨌든 서버가 죽었으니 원인을 파악해야 했다. ec2 장비에 접..

개발/Spring 2021.07.13

[Spring] 최대 사용 기기 관리 구현

앱에서 최대 3개의 기기에서 로그인을 하여 서비스를 이용할 수 있도록 해달라는 요구사항이 생겼을 때 어떻게 구현을 하면 좋을까 해서 검색을 좀 해보았는데 나오는 글이 없었다. 내가 못 찾은 걸지도 ㅎㅎ 자세한 요구사항은 작성하지 않지만 간략하게 이야기하면 다음과 같다. 요구사항 서로 다른 기기라는 것을 구분해야 함 웹, 앱 내에 마이페이지에서 등록된 기기를 개별 삭제, 전체 삭제를 할 수 있어야 함 기기 별로 기기 이름과 마지막 접속 시간이 나타나야 함 이미 3대의 기기가 등록 돼 있는 상태에서 추가로 기기가 등록된다면 해당 기기에서는 사용자에게 등록된 기기를 삭제하고 로그인을 할 수 있거나 로그인을 하지 않고 앱을 나갈 수 있음. 그렇다면 요청이 들어올 때마다 서버에서는 요청을 어느 기기에서 요청한 것..

개발/Spring 2021.04.17

[Spring] 사용자의 데이터 변경 이력 관리

개발을 하다가 문득 사용자의 추천 설정과 같은 정보들의 변경 이력을 관리하고 있지 않고 있었다라는 것을 깨달았다. 예상되는 문제는 사용자에게 추천을 했는데 로직 상 문제 없는 추천에 대해서 사용자가 착각해서 이거 왜 추천되나요? 라고 했을 때이다. 이 유저가 추천 설정이 C 라고 돼 있을 때, 신고 당시 A 였는지 B 였는지 계속 C인 상태였는지 파악이 되지 않아 파악에 굉장히 어려울 것 같았다. 처음에는 아래와 같은 테이블로 작업을 할까 했었다. 왜냐하면 제일 간단하다고 생각했고, 해당 테이블 하나로 여러 데이터의 변경 이력을 관리할 수 있으니까 관리 포인트도 줄일 수 있을 것 같았다. id user_id target before create_date pk 변경 필드 변경 전 데이터 그러나 http p..

개발/Spring 2021.01.13

[Spring] 코틀린 data class 사용 시 retrofit 에서 @JsonProperty 가 적용되지 않을 때

사용하고 있는 retrofit 의 버전은 각각 다음과 같다. - retrofit 2.3.0 - converter-jackson 2.3.0 분명 JacksonConverterFactory 를 추가해주었는데도 적용이 안됐다. kotlin data class 에서 @JsonProperty 가 적용되기 위해 해당 의존성을 추가해서 사용하고 있었다. 그리고, retrofit 문서에서 나와있는 대로 converter 를 추가하기 위해 다음과 같은 의존성을 또 추가 해 주었다. 여기서 나는 retrofit 에서 제공하는 jackson-converter 에는 기본적으로 kotlin 을 위한 설정이 돼 있지 않다고 생각이 들었다. 그래서 retrofit 의 jackson converter 에서만 KoltinModule ..

개발/Spring 2020.12.27

[Spring Batch] no job configuration with the name was registered

'sync' 라는 job 을 생성하고 jobLocator 를 이용하여 job 을 가져오려고 하는데 계속 해당 에러가 발생했다. no job configuration with the name 'sync' was registered 우선 Spring Batch 에서 JobRegistry 라는 클래스를 제공해주고 있다. 해당 JobRegistryBeanPostProcessor 클래스도 제공하는데 job 들을 설정한 jobRegistry 에 등록시켜주는 친구인 것 같다. 네이밍도 Post Processor 인 것으로 보아 application context 올라가고 job 으로 등록된 bean 들을 jobRegistry 에 등록시켜 주는 것으로 이해하면 될 것 같다. @Configuration class Job..

개발/Spring 2020.12.01

[Spring] gc overhead limit exceeded 원인 찾기

서버에서 gc overhead limit exceeded 라는 에러를 내뿜었다. 검색해보니 우선 해당 에러는 CPU 사용량중 98%이상이 GC가 작동되는 경우 gc overhead limit exceeded 가 발생이 된다고 한다. 이런 상황은 처음이라서 굉장히 당황했고 나 혼자 서비스 개발을 하니 주변 사람에게 물어볼 수도 없었다. 우선 그래서 ec2 인스턴스에 접속해서 힙덤프를 떴고 MAT 이란 memory analyzer 를 이용해서 확인을 해 보았다. hibernate 의 SessionFactoryImpl 이라는 오브젝트가 무려 589MB 나 했다. 도큐먼트에 나와있는 SessionFactoryImpl 에 대한 설명이다. Concrete implementation of the SessionFact..

개발/Spring 2020.10.12

[Spring] Slice Test

나는 테스트에 대해서 공부할 때 통합 테스트, 단위 테스트라는 단어를 많이 들었다. 그래서 내가 필요하다고 생각할 때 단위 테스트를 작성하고 좀 큰 기능인 것 같으면 통합 테스트를 이용해서 전체적인 흐름을 테스트를 하고 있다. Slice Test 최근에 Mockito 라이브러리를 이용한 mock 을 주입해서 테스트를 하던 중, 슬라이스 테스트라는 용어를 알게 되었다. Test slicing is about segmenting the ApplicationContext that is created for your test spring.io 에 따르면 위와 같이 소개를 하고 있다. https://spring.io/blog/2016/08/30/custom-test-slice-with-spring-boot-1-4..

개발/Spring 2020.08.12

[querydsl] querydsl ne 사용 시 eq 로 동작

github.com/querydsl/querydsl/issues/2589 When using ne(), but working eq() · Issue #2589 · querydsl/querydsl I'm using querydsl-jpa:4.1.3 I made JPAExpressions. here is used booleanBuilder and ne() to compare the results. but, the implementation of ne() was the same as eq(). so, predicate was: I want ... github.com querydsl-jpa:4.1.3 사용 중에 서브 쿼리를 이용하기 위해 아래와 같은 코드를 사용했다. 그리고 아래 사진처러 ne() 메소드를 통해..

개발/Spring 2020.05.23

[Spring] querydsl 에서 List<String> 타입 변수에 조건 넣기

새벽 3시30분인데 지금 매우 화난다. 졸리니까 우선 간단히 쓰겠다. 코틀린을 기반으로 개발하고 있다. DB 테이블에서는 json 타입의 필드에 단순히 [123, 321, 133] 와 같은 값을 넣고있다. 그리고 entity 에서는 해당 필드를 Set 으로 타입을 정의해놓았다. 그리고 converter 를 직접 만들어서 json 을 잘 변환하도록 entity 클래스에 해당 필드에다가 converter 를 지정해주었다. 해당 필드의 이름이 numbers 라고 했을 때 querydsl 을 이용해 조건을 다음과 같이 걸어주었다. numbers.contains("311") 근데 자꾸 hql 을 보니 해당 numbers 필드를 가지고 조인을 해버린다. 어이가 없다. 해당 필드는 조인할 수 없는데 hql 에서 as..

개발/Spring 2020.05.15
반응형