제안&정리 (48) 썸네일형 리스트형 Spring Boot 버전별 AWS Secret Manager 적용 방법 회사에서 Spring Cloud Config를 활용해서 민감정보를 관리하게 했던 것에서 AWS Secret Manager로 전환하게 되었습니다. 기존 Spring Cloud Config 서비스를 기존 조직에서 종료하기로 하면서 진행되었는데 팀 내에서 해당 전환을 주도하게 되어서 관련 가이드를 작성하게 되었는데 Spring Boot과 라이브러리 버전에 따라 다른 점들이 있습니다. 각 버전별 적용 방법을 간단히 정리해서 공유합니다. AWS Secret Manager에 암호 생성Spring Boot 2.3 이하와 Spring Boot 2.4 이상의 Secret Manager 생성 방법이 다릅니다. Spring Boot 2.3 이하일 때는 해당 버전과 호환되는 라이브러리 제약으로 Secret의 이름 앞에 /가 .. [JAVA] ZoneId는 Java 실행 옵션으로 설정해보자 ZonedDateTime을 다루다 보면 ZoneId를 어떻게 설정을 해야 하나 고민하게 된다.가장 먼저 생각하게 되는 것이 글로벌에서 접근 가능한 ZoneId를 선언해두고 사용하는 것이다.아니면 각 클래스에서 필요한 순간에 정의해서 사용할 수도 있다. 이 정도로만 사용하고 있었는데 코드 리뷰를 하면서 ZoneId.systemDefault() 를 사용하는 코드를 확인했고실행 환경이 달라져 시스템의 기본 시간대가 바뀔 때 이슈가 있을 수도 있을 것 같아ZoneId.of("Asia/Seoul")과 같이 명확하게 설정하면 어떨찌 의견을 남겼고 각자의 의견이 오가게 되었다. 이 과정을 통해 알게 된 것은 애플리케이션 실행 시 타임존 정보를 줄 수 있기 때문에ZoneId.systemDefault()을 사용하는 것은.. Test Container, Flyway, DB Rider를 활용한 통합 테스트 회사에서 재고 서비스의 재고 차감, 복구 로직에 기능을 추가하며 기존 로직이 복잡해 리더분과 이야기 후 리팩토링을 진행하게 되었다.리택토링을 하면서 중요한 것은 좋은 테스트들이 있어 안심하고 리팩토링을 할 수 있는가이다.기존 테스트의 문제점그런데 기존 재고 서비스 테스트에는 아래와 같은 문제가 존재했다. H2 데이터 베이스 사용 관련MySQL의 DDL을 그대로 사용할 수 없어 테스트를 위한 H2 전용 DDL 관리 필요H2와 MySQL의 다른 동작으로 인해 테스트는 통과하지만 실제 환경에서 이슈 발생 가능성 존재테스트 데이터 관련모든 테스트가 하나의 데이터 셋을 공통으로 사용이로 인해 테스트와 데이터 간의 연관관계 파악이 어려움Insert문으로 작성되어 있고 컬럼이 많아 테스트 데이터의 특징을 직관적으로 .. AWS Aurora 3 (MySQL 8 호환) BEFORE/AFTER 구문 등 테이블 리빌드 필요 시 리더에서 테이블 인식불가 버그 회사에서 업무하면서 컬럼을 추가할 일이 있었는데 AFTER 구문을 활용해서 DDL을 작성했습니다. INSTANT 알고리즘으로 실행되지는 못하지만 (INSTANT 알고리즘으로 실행되려면 맨 마지막에 추가되어야 하므로)자주 조회되는 테이블도 아니고 데이터도 많지 않기 때문에 컬럼 순서를 잘 유지하는게 더 낫다고 생각했기 때문입니다. 하지만 DBA 분께 AWS Aurora 3에서 컬럼 추가 시에 before/after 구문을 지정하면 작업이 진행되는 동안 reader에서 해당 테이블을 인식하지 못하는 버그가 있다고 알려주셨습니다.그래서 꼭 필요한 경우가 아니라면 before/after 구문을 사용하지 말아달라고 하는데요. 관련해서 좀 더 알아보니 꼭 BEFORE/AFTER 구문이 아니더라도 INPLACE 알고.. 이제야 해보는 맥북 설정 자동화 Yanolja에서 LBOX로 그리고 다시 LBOX에서 Yanolja로그리고 개인 장비도 변경하면서 환경 설정을 하게 될 일이 많았습니다. 이전에는 장비를 설정할 일이 많지도 았았고새로운 장비에 하나씩 세팅하는 즐거움도 있었기 때문에 자동화해야겠다는 생각을 못했습니다.그런데 이번에 3번 정도 연달아서 세팅을 하다보니새로운 장비 세팅하는 즐거움은 귀찮음으로 변했습니다.또 앞으로도 자주 있는 일일텐데 최대한 자동화 해두어야겠다 생각이 들었습니다. 그래서 찾아보니 생각보다 쉬운 방법으로 자동화가 가능했습니다.실패했던 방법 한가지와 지금 사용하고 있는 방법을 공유합니다. 실패한 방법 - mackup GitHub - lra/mackup: Keep your application settings in sync (OS .. [Git Strategy] 팀의 속도를 올리는 방법 - Ship Show Ask 사이드 프로젝트를 하면서 Git 전략과 관련해서 가장 어려웠던 부분은 PR 리뷰가 적절한 시점이 이루어지지 않는 것이었습니다. 회사는 개발자들이 매일 출근하기 때문에 비교적 빠르게 리뷰가 이루어집니다. 하지만 사이드 프로젝트는 매일 작업하는게 아니다보니 PR을 올려도 동료의 상황에 따라 1, 2주 또는 한달이 걸리기도 합니다. 그러다보니 코드 합칠 때 충돌(Conflict)도 자주 발생합니다. 그렇다고 좋은 도구인 PR 리뷰를 없앨 수는 없었는데요. 이런 고민을 하던 중 Ship, Show, Ask 전략을 보게 되었고 팀에 적용해서 팀의 속도를 효과적으로 올릴 수 있었습니다. Ship / Show / Ask Ship/Show/Ask is a branching strategy that helps teams.. [Java] Thread Pool의 적정 Queue 사이즈 잘못된 Queue 사이즈로 인한 문제 상황 최근 회사에서 새로운 기능을 배포했는데 특정 인스턴스들에서 간헐적으로 RejectedExecutionException이 발생했습니다. 예외 상세 메세지는 아래와 같았는데요. org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor$1@d02af99[Running, pool size = 1000, active threads = 8, queued tasks = 100, completed tasks = 6805414] 보시면 pool size에 비해 active thread가 여유가 있는데도 예외가 발생했습니다. 분석 시 문제는 Thread Pool에 설정된 coreSize, queueSize와 관련이 있었는.. [Spring] 동일 타입 여러 빈을 @Primary, @Qualifier 으로 사용하기 주변 지인 분께서 동일한 타입의 여러 Spring Bean이 있는 경우 어떻게 사용을 해야 하는지 물어보셨습니다. 회사에서는 @Resource 어노테이션으로 태깅이 되어 있는데 이게 맞는 방법인지 모르겠다고 하셔서 @Primary, @Qualifer 어노테이션을 사용하도록 안내 드렸습니다. @Resource 어노테이션의 단점 필드, 메서드에만 선언할 수 있어 생성자 주입 형태로 사용할 수 없습니다. 아무래도 생성자 주입 형태로 의존성 주입을 하는 것이 테스트 코드 작성 등 여러가지 면에서 낫기 때문에 @Resource 어노테이션은 적절하지 않은 방법입니다. @Primary, @Qualifer 사용법 주로 사용이 되는 Bean에 @Primary 어노테이션을 붙여 별도 @Qualifer 어노테이션 없이 사용.. [JAVA] LocalDate atStartOfDay 평소에 LocalDate, LocalDateTime을 세부적으로 다룰 일이 많지 않았는데 회사에서 취소수수료율 관련 코드를 짜며 다루게 되었습니다. 하면서 공유할 2가지 팁이 있어 간단히 공유합니다. 주어진 날짜의 0시 0분 0초 주어진 날짜(LocalDate)의 0시 0분 0초를 다른 시점(LocalDateTime)과 비교해야 했습니다. 아래와 같이 할 수도 있지만.. var someday = LocalDate.now(); someday.atTime(0, 0, 0, 0); 더 좋은 방법은 아래와 같이 제공되는 메서드를 사용하는 것이 가독성 측면에서 훨씬 좋습니다. var someday = LocalDate.now(); someday.atStartOfDay(); 시간대 바꾸기 UTC 기준으로 계산 후 K.. [Java] 스레드 풀 설정 - corePoolSize, maxPoolSize, queueCapacity 스레드 풀 설정할 때 corePoolSize, maxPoolSize, queueCapacity 3가지 동작에 헷갈리는 경우가 많습니다. 자주 오해하는 동작 방식 많이들 아래와 같이 오해하시는 것 같습니다. 1. corePoolSize 이상의 동시 호출이 발생하면 바로 쓰레드 개수 증가 2. 최대 maxPoolSize까지 쓰레드 개수 증가 3. 이후 동시 요청에 대해서는 queue에서 대기 실제 동작 방식 사실은 아래와 같이 동작합니다. 1. corePoolSize 이상의 동시 호출이 발생하면 설정된 queueCapacity 에 설정된 수만큼의 동시 요청까지는 queue에서 대기 2. queueCapacity 이상 쌓였을 때 새로운 쓰레드를 만들고 최대 maxPoolSize까지 스레드 수 증가 관련 설정 .. 이전 1 2 3 4 5 다음