❖ 사용안 계층구조에서 다른 하위클래스를 여러개 가지고 있을 경우 이를 처리하기 위해서 사용합니다. 예를 들어 동물 하위에 강아지, 고양이, 토끼라는 하위 클래스가 있고 이들이 가지고 있는 필드와 처리하는 함수가 다를 경우 이를 하나의 필드로 구분하여 사용할 수 있습니다. ❖ 어노테이션 설명 @JsonTypeInfo : 다형성을 지원하는 Jackson 라이브러리로 json 직렬, 역직렬을 지원합니다. use : 다형성을 나타내는 정보를 어떻게 사용할지 지정합니다. - JsonTypeInfo.Id.NAME : 타입 이름을 사용하여 다형성을 처리합니다. - JsonTypeInfo.Id.CLASS: 클래스 정보를 사용하여 다형성을 처리합니다. - JsonTypeInfo.Id.MINIMAL_CLASS: 최소한의..

❖ 설명 문서 자동화를 위해 rest docs과 swagger를 함께 진행하였다. 설명이 조금 길긴 하지만 단계적으로 정리하여 이해하기 쉽도록 정리하였습니다. ● rest docs을 작성하고 swagger로 변환하는 과정이다. 1. restdocs-api-spec을 정의(test code 작성 및 문서설명) 2. OpenAPI3 spec으로 변환 RESTful API를 정의된 규칙에 맞게 API spec을 json이나 yaml로 표현하는 방식을 의미합니다. 3. OpenAPI3 spec 변환 문서를 swaggerUI에 적용 4. build 및 테스트 ❖ git url https://bitbucket.org/basic-setup/kotlin-restdoc-swagger/src/master/ ❖ 구현 1. ..

● resilience4j 소개 Resilience4j 는 사용하기 쉽고 가볍게 만들어진 장애허용(fault tolerance) 라이브러리이다. Netflix Hystrix 영감을 받았으며 java8과 함수형 프로그램밍을 위해 설계되었다. 다른 외부 라이브러리의 종속성이 없는 Vavr(https://www.vari.io)만 사용하여 가볍다. 코어모듈 코어모듈 간략 설명 circuitbreaker 호출결과에 따른 상태 관리 ratelimiter 호출횟수 제한 bulkhead 병렬(스레드) 제한 timelimiter 실행시간 제한 retry 호출 재시도 cache 캐시 구현제 정의 ● 코어모듈 소개 1. circuitbreaker (호출결과에 따른 상태 관리) 호출의 결과가 성공이 아닐 경우(오랜 시간 결과..

● LOCUST란? Locust는 사용하기 쉽고 스크립트 가능하며 확장 가능한 성능 테스트 도구입니다. Python 코드를 활용하여 개발자가 원하는 서버의 성능 테스트를 진행할 수 있습니다. 이번 문서에서는 기본적인 설치 및 성능 테스트 방법만 진행하여 기본 구조만 익히는것이 목표입니다. 더 자세한 테스트는 커스텀하여 활용할 수 있도록 참조 URL로 대체하겠습니다. ● LOCUST 설치 1. 테스트 스크립트 작성 Locust를 통해 서버 성능을 테스트할 스크립트를 작성합니다. 간단하게 http 로 "/ping" 을 실행하여 서버의 결과를 확인하는 것입니다. locustfile.py 파일 생성 from locust import HttpUser, task, between class Quickstart(Htt..
● 개요 QueryDsl의 전체 카운팅을 위해 fetchCount를 잘 사용하다가 해당 함수가 deprecated 되어 전체 카운트를 구하는 방법에 대해 고민이 많아졌다. 해당 이슈에 대해 많은 분들이 고민하지 않을까 생각이 든다. 누군가 명확한 해결책을 제시해 주길 바랬지만 아직 찾지 못했습니다. 그동안 사용한 QueryDsl을 걷어내고 nativeSql을 사용해야 하는것일까? 아니면 counting만 nativeSql을 사용해야 하는것일까? 그렇게 되면 동적 쿼리나 파라미터 세팅을 이중으로 관리하게 되어 더 복잡해 보여 hql을 nativeSql로 변경하여 counting 하는 방법일 고민해보았다. ● queryDsl로 counting 구하기 getTotalCount(JPAQuery jpaQuery)..
● 개요 캐시를 활용하여 데이터를 저장할때 로그인사용자, 메소드, 파라미터값등 다양한 필드별로 유니크한 key를 조합하여 데이터를 저장해야 하는 경우 cache key를 한곳에서 생성 관리해주고자 한다. spring cache의 활용편으로spring cache 적용은 이곳(https://myborn.tistory.com/24) 을 참고해 주세요. ● Custom KeyGenerator를 활용하기 1. Custom KeyGenerator 생성 - KeyGenerator 를 상속받아 구현합니다. target - instance, mehtod - 호출 메소드, params - 호출 메소드의 파라미터 인자입니다. 생성된 키값을 리턴하여 캐시의 key로 사용됩니다. import java.lang.reflect.M..

● 개요 일정기간 변경되지 않는 데이터에 대해 잦은 호출로 인하여 서버 자원 낭비를 방지하고자 cache를 활용하고자 한다. ● java cache 라이브러리 java cache에 활용되는 라이브러리를 살펴 보았다. 1. springboot cache springboot에서 지원하는 cache로 auto cofingired되어 설정에 대한 부분이 편리하다. (https://spring.io/guides/gs/caching/) 2. caffeine cache 캐시를 읽고 쓰는 속도에서 가장 좋은 성능을 보여주는 라이브러리로 설정도 편리하다. 속도 측정 참고- https://github.com/ben-manes/caffeine/wiki/Benchmarks 3. ehcache cache 라이브러리중 가장 많은..
● 개요 deep copy의 종류와 장단점을 확인 하고 실행시간을 체크한다. ● git 주소 https://bitbucket.org/technology-team/deep-copy/src/master/ ● deep copy 종류 더 많은 라이브러리가 deep copy지원하지만 개인적으로 자주 사용하는 라이브러리로 추려보았다. java 지원 deep copy library를 deep copy - Cloneable Interface - Copy Constructor - Copy Factory - lombok - ObjectMapper deep copy 시나리오 account안에 company object가 존재하며 deep copy 실행 후 account와 company가 모두 deep copy가 되는지 확인..
● 요구사항 방대한 데이터를 테이블에 적재할 경우 쿼리 수행시간이 오래 걸리는 이슈가 발생하였다. 원시 데이터를 가공하여 data mart를 구성할 수도 있겠지만 동일한 스키마내의 데이터를 가공하면 되기 때문에 view를 활용하기로 하였다. ● postgreSQL 의 view 1. CREATE VIEW - CREATE VIEW 명령은 정의된 쿼리를 뷰로 정의한다. - 뷰는 물리적으로 구체화되지 않습니다. - 뷰를 호출하면 매번 그 뷰에 지정한 쿼리를 실행한다. - 뷰의 이름은 동일한 스카마에 있는 뷰, 테이블, 시퀀스, 인덱스 이름과 구별되어야 합니다. - document URL : https://www.postgresql.org/docs/14/sql-createview.html CREATE VIEW c..

● 순서 바꾸는 이유 프로젝트 개발을 진행하다 개발계에서 운영계로 배포 시 특정 대상들만 배포를 해야 하는 경우가 발생하였다. git cherry-pick 을 이용할 수도 있지만 중간 중간 선택해서 배포를 해야 하기 때문에 어느부분까지 배포되었는지 기억을 해줘야 한다. git의 순서를 변경하여 배포를 진행한다면 조금 더 깔끔하게 브랜치를 관리할 수 있다. 예를 들어 본다면 왼쪽과 같이 commit 내용이 있다. 이번 운영에 A,B,C 기능을 배포하려고 했지만 A기능에 이슈가 발생하여 배포에서 제외하기로 했다. 그렇다면 배포시 A를 제외해야 하는데 cherry-pick을 이용할 경우 A가 배포된 브랜치의 맨 마지막에 위치하게 되어 배포된 브랜치와 분리가 이루어져서 관리가 이루어져야 한다. ● 참고 URL ..