본문 바로가기

전체 글

(126)
reseilence4j를 이용한 장애 대처 들어가면서 데이터 베이스나 외부 API 서버에서 장애가 발생하면 개발한 서버에서도 역시 장애가 발생할 수 있다. 특히 외부 API를 이용할 때는 외부의 시스템 장애를 고칠 수 있는 방법이 없는 경우도 존재할 것이다. 이런 장애 상황을 대체하기 위해서는 어떻게 해야 할까? 그런 상황에서 reseilence4j 같은 라이브러리를 이용하면 쉽게 장애에 대응하는 코드를 작성할 수 있다. reseilence4j란? Netflix Hystrix에서 영감을 받아서 개발된 가벼운 결함 관리 라이브러리이다. Circuit breaker, Retry, Bulkhead, RateLimiter, TimeLimiter 같은 솔루션을 제공하고 있다. Core Modules (핵심 모듈) 다섯 가지의 핵심 모듈을 제공하고 있는데 ..
[WireMock] WireMock을 이용하여 Mock API 서버 사용하기 들어가면서 외부 API를 사용하게 된다면 어떤 응답이 올지? API 사용 시 장애 상황에 어떻게 서버가 동작하는지에 대한 대안을 테스트하기 위해서 모킹을 하고 싶은데 그 방법을 몰라서 이것저것 검색을 해보았다. 그중에서 WireMock을 이용한 모킹 처리에 대해서 알아보자. WireMock 이란? http 기반의 API 서비스를 모킹하기 위해서 사용하는 테스트 라이브러리다. 목 서버를 만드는 방식은 JAR파일을 통해서 가동하는 방식과 wiremock 이미지를 통해서 컨테이너를 띄우는 방식이 있다. Test code 작성하기! standalone 방식 우선 컨테이너 기반으로 목서버를 사용하지 않고 standalone으로 사용하려면 다음 의존성이 필요하다. 버전은 공식문서를 참고해서 필요한 버전을 명시하면 ..
[Spring] RedisCacheManager에 대해서 들어가면서 스프링에서 캐시를 기능을 추상화하여 사용자가 쉽게 캐시를 이용할 수 있도록 @Cacheable과 같은 어노테이션을 제공하는데 캐시를 저장하는 저장소와 상호작용하는 인터페이스는 CacheManager라는 인터페이스가 담당한다. 레디스를 캐시로 사용하는 경우에는 CacheManager를 상속받은 레디스 전용 캐시매니저이다. 레디스에 어떻게 키를 저장하는지 궁금해서 간단한 테스트코드와 디버거를 이용해서 공부해보았다. Spring boot starter redis 의존성을 추가하고 로컬에서 Redis를 가동하고 연결 설정까지 하고 실습을 진행했다. 실습한 스프링 부트의 버전은 3.2.1이다. 데이터 캐시(저장) 스프링이 제공하는 추상화를 이용하려면 우선 Cache 객체를 매니저를 통해서 조회해야한다...
스프링 AOP를 적용하는 방법 Aop가 무엇인가? 관점 지향 프로그래밍을 위한 기술로 프록시를 활용하여 공통 관심사를 분리하는 기술이다. @AspectJ 지원 활성화하기 aop를 활성화하기 위해서 자바 코드를 통해서 활성화를 한다. @Configuration @EnableAspectJAutoProxy public class AppConfig { } 하지만 @EnableAspectJAutoProxy의 기본값이 enable이기 때문에 생략해도 aop가 적용된다! Aop 클래스 설정 aop과 관련된 로직을 구현할 클래스를 생성하면 @Aspect를 통해서 aop라는 메타 데이터를 작성해주어야한다. 이때 주의할 점으로는 @Aspect를 선언하더라도 오토 스캔의 대상이 되지 않기 때문에 @Component나 @Bean을 통해서 빈으로 등록하는 ..
[Mongo DB] 도규먼트 CRUD 들어가면서 몽고 DB에서 CRUD 하는 방식에 대해서 알아보자. 공부한 책의 예제를 기반으로 작성했기 때문에 movies 컬렉션에서 데이터를 다루는 방식으로 소개하겠습니다. Create 단건 삽입 insertOne 메서드를 이용해서 문서를 만들 수 있습니다. 이때 생성된 문서는 _id 기본키가 추가되어 저장됩니다. db.movies.insertOne( { "title" : "Stand by Me"} )일괄 삽입 많은 수의 문서를 한 번에 전송하면 삽입 속도가 빨라집니다. 한 번에 일괄 삽입할 수 있는 데이터의 크기에는 제한이 있어서 초과되는 데이터는 여러개의 일괄 삽입 요청으로 분할되어 처리됩니다. db.movies.insertMany( [ { "title" : "Stand by Me"}, { "titl..
지역성 지역성이 중요한 이유란? cpu와 메모리 그리고 저장 장치 간의 속도 차이로 인한 병목 현상을 최소화하기 위해서는 필요한 데이터가 빠른 장치에 존재하는 것이 중요하다. 이때, 필요한 데이터의 특징에는 지역성이 존재하기 때문에 지역성을 고려한 전략이 필요한 것 1. 시간 지역성 시간적 지역성은 최근에 참조된 주소의 내용은 곧 다음에 다시 참조되는 특성이다. 일상 예시) 티몬에서 유명가수그룹 BTS 티켓팅을 10시에 시작한다고 했을 때, 10시부터 11시까지는 고객들이 BTS의 티켓팅 정보를 많이 요청할 것이다. 이때, 티켓팅과 관련된 정보를 보조 저장 장치에서 조회하지 않고 주기억장치에서 가져온다면 데이터를 조회할 때, 더욱 빠른 속도로 처리가 가능하다. cs 예시) 하나의 cpu에서 멀티 태스킹을 수행하..
TIMESTAMP, DATETIME, DATE 타입이란? 들어가면서 최근 면접을 갔는데 TIMESTAMP에 대해서 질문을 받았다. 하지만 시간 관련 속성에 대해서 깊게 생각해본적이 없어서 대답을 해도 틀리게 대답을 했다. 이번 기회에 시간을 나타내는 속성이 어떤 것인지 공부를 하고 정리를 해보았다. DATE 타입 DATE는 년, 월, 일 까지의 시간 정보가 포함된 타입이다. 표현 가능한 범위는 1000-01-01 ~ 9999-12-31이다. DATETIME 타입 DATETIME에서는 년, 월, 일, 시, 분, 초 까지의 시간 정보가 포함된 타입이다. 표현 가능한 범위는 1000-01-01 00:00:00.000000 ~ 9999-12-31 23:59:59.499999이다. MySQL에서는 최대 마이크로초(6자리) 정밀도의 소수 초 부분이 포홤될 수 있다. TI..
Vim 유용한 명령어 팁 들어가면서 처음 vim을 배운 계기는 코딩 테스트에서 효과적으로 코드를 작성해서 시간을 벌기 위해서 배우기 시작했습니다. 하지만 쓰다 보니 vim이 제공하는 마우스 없는 개발이 너무 마음에 들어서 vim을 점차적으로 적용해나가며 고수가 되기 위해서 노력하는 중입니다. 그러는 도중에 vim을 잘 사용하기 위한 지침서 하나를 알게 되어 읽으면서 몰랐던 vim의 팁을 정리한 글입니다. 행 들여쓰기 IDE에서 tab 키로 들여쓰기를 사용하곤 했는데 vim에서는 어떻게 들여쓰기를 할까? 바로 >, {숫자}, >G 를 통해서 들여쓰기를 할 수 있다. 비주얼 모드에서는 직관적으로 들여쓰기를 할 행을 지정해서 ’>‘을 입력하면 지정한 행이 들여쓰기가 적용된다. 숫자 증가, 감소하기 커서를 숫자 위에 위치한 상태에서 C..