환경JDK 11Spring Boot 2.6.8 문제상황Spring은 Profile별로 다른 프로퍼티 값을 주입하기 위해 yml 혹은 properties 파일을 사용한다. 일반적으로 application-{profile}.yml 파일을 profile 마다 만들어 따로따로 값들을 관리하거나, 혹은 단일의 application.yml 파일을 두고 Multi-Document file 형식으로 값들을 관리한다. 3개의 하이픈("-")을 경계로 두고 spring.config.activate.on-profile 옵션을 통해 특정 profile에서만 프로퍼티 값들이 사용되도록 하는 방식이다. 아래는 문제 발생 당시 yml 파일의 예시이다.// applcation-local.ymlmy-property: local-pro..
전체 글
서버는 꺼지지 않아요ArchUnit이란?현재 프로젝트에 헥사고날(굳이 이 용어를 쓰고싶진 않지만 더 나은 표현이 없으므로) 아키텍처를 서서히 적용하면서, 관련 컨밴션을 테스트를 통해 강제화하기 위해 ArchUnit을 도입하였다. ArchUnit은 프로젝트의 아키텍처 규칙을 테스트 코드 형태로 작성할 수 있게 도와주는 테스트 라이브러리로, 클래스의 패키지 구조, 접근 제어자, 어노테이션 사용 여부 등 아키텍처 컨벤션을 코드로 명시하고, CI/CD 과정에서 지속적으로 검증할 수 있도록 도울 수 있다. 이번 글에선 ArchUnit를 사용해 아래와 같은 아키텍쳐 패키지를 강제해보자. 1. ..interfaces.. 패키지의 클래스는 ..application.. 패키지의 클래스만 참조할 수 있다.2. ..application.. ..
Replication Lag?현대 많은 대규모 서비스들에선 단일 장애 포인트를 없애고 서비스에 일관된 수준의 빠른 응답을 보장하기 위해 데이터베이스를 Master-Slave 구조의 Replication 형태로 구축한다.서비스에서 발생하는 모든 데이터 변경 작업(CUD)을 Master 데이터베이스에서 처리하도록 하고, 처리완료된 데이터를 Slave 데이터베이스들에 싱크하는 구조이다. 위와 같은 구조를 통해 Master 데이터베이스 장애 시 Slave 데이터베이스를 통한 Failover 전략을 가능하게 하고, Slave 데이터베이스의 Scale Out을 통해 서비스 쿼리의 대부분을 차지하는 조회 작업을 일관된 품질로 제공할 수 있도록 해준다. 그러나 동시에 데이터의 일관성이 깨지는 케이스가 발생하기도 하는데..
올해도 돌아왔다 회고 이 블로그를 시작한 계기는 솔직한 마음으론 어디까지나 이력서에 한 줄 추가하기위한 개발 블로그였지만 요즘엔 그냥 내 공간 중 하나같다. 그만큼 글이 쉽고 가볍게 잘 써진다. (너무 가벼워서 잘 안써지고 날아가긴함) 작년까지만 해도 회고를 쓰는 스스로가 뭔가 유난스러워보였는데 그건 아마 이런 글은 그 해 무언가 이루거나 잘해낸 사람들이나 쓰는거라는 일종의 자격지심 비슷한 이유 때문이었던 듯 싶다. 지금은 그냥 작년에 그런 생각을 했던 내가 유난스러워서 부끄럽다. 올해는 가볍게 가볍게 ~_~ 1. 회사 얘기이직 올해 가장 큰 이벤트 중 하나였다. 2년 반 가까이 다닌 회사를 퇴사하고 새로운 회사로 이직을 했다. 기존 회사가 신사옥을 지으면서 판교에서 과천으로 이전하는데 도저히 과천으로..

오랜만에 다시 봐도 웃겨서 내 블로그에도 박제 문서 제대로 안읽고 대충 뇌피셜로 개발하다가 탄생했다. (사이드 프로젝트였어서 다행) 동작? 제대로 했을리가없다. 출처: 플젝 함께했던 동료 개발자의 블로그
깃헙 이슈를 둘러보다가 재미있는 글을 발견했다.https://github.com/mockito/mockito/issues/1013 Enable mocking static methods in Mockito · Issue #1013 · mockito/mockitoStatic methods mocking with Mockito This is a placeholder ticket for enabling mocking static methods in Mockito. Example action items that are totally negotiable and can ran in parallel. We're look...github.com 해당 이슈는 2017년 3월 Mockito 깃헙에 올라온 이슈로 당시엔 Mo..
왜 쓸까?Spring Retry에선 특정 메서드를 지정한 만큼 재시도 처리할 수 있도록 하는 기능을 제공한다. 일반적인 유스케이스는 외부 인프라(DB, API, 메시지 큐 등등..)와의 소통 및 처리과정에서 재시도 처리가 필요한 로직들일 것이다. 대개는 간헐적이고 일시적으로 발생하는 장애 상황에 대응하기 위한 전략으로 사용된다. 따라서 외부 API 호출 시 함께 사용되는 경우가 많으며, 관련 예제들도 보통은 Feign, RestTemplate 등의 클라이언트 관련 기술들과 함께 작성된 경우가 많다.사용해보기Spring Retry를 사용하기 위해선 아래 두 개의 의존성이 필요하다.dependencies { ... implementation 'org.springframework.retry:spring..
Redis(이하 레디스)는 Key-Value 형태의 데이터를 저장할 수 있는 일종의 NoSQL 데이터베이스 중 하나이다. 레디스는 특히 일반적인 DBMS 시스템과 다르게 디스크가 아닌 메모리에 데이터를 저장하기 때문에 데이터 조회 성능에서 매우 빠른 성능을 보인다. 또한, 레디스 내부에서 값 삽입을 비롯한 Operation 자체를 모두 싱글 스레드로 처리하기 때문에 동일 자원에 대한 레이스 컨디션으로 발생할 수 있는 문제를 원천적으로 예방해준다. (이것이 가능한 이유는 역시나 레디스가 메모리 기반으로 데이터를 관리해 빠른 속도를 보장하기 때문일 것이다.) 이러한 특징 때문에 레디스는 캐싱의 용도로 많이 사용되며, 그 밖에도 동시성 이슈가 우려되는 자원에 대한 락을 구현하기 위해서도 많이 사용된다. 그러..