오랜만에 다시 봐도 웃겨서 내 블로그에도 박제 문서 제대로 안읽고 대충 뇌피셜로 개발하다가 탄생했다. (사이드 프로젝트였어서 다행) 동작? 제대로 했을리가없다. 출처: 플젝 함께했던 동료 개발자의 블로그
전체 글
서버는 꺼지지 않아요깃헙 이슈를 둘러보다가 재미있는 글을 발견했다.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 자체를 모두 싱글 스레드로 처리하기 때문에 동일 자원에 대한 레이스 컨디션으로 발생할 수 있는 문제를 원천적으로 예방해준다. (이것이 가능한 이유는 역시나 레디스가 메모리 기반으로 데이터를 관리해 빠른 속도를 보장하기 때문일 것이다.) 이러한 특징 때문에 레디스는 캐싱의 용도로 많이 사용되며, 그 밖에도 동시성 이슈가 우려되는 자원에 대한 락을 구현하기 위해서도 많이 사용된다. 그러..
HTTP의 표준 메서드HTTP 표준 메서드를 하나씩 떠올려보자. 아마 대부분의 사람들이 GET, POST, PUT, PATCH, DELETE 이렇게 5가지 메서드를 생각할 것이다. (그 외에도 HEAD, OPTIONS 등..) 위 5가지 메서드들은 마치 일종의 불변상수와도 같아서 HTTP라는 녀석이 처음 세상에 나올때부터 함께 존재했던 것과 같은 착각을 불러일으킨다. 하지만 HTTP는 1990년대 초에 처음으로 명세되어 거진 30년이 가까운 시간동안 끊임없이 발전해왔고, 특히 PATCH 메서드는 비교적 최근인 2010년에야 RFC5789를 통해 HTTP의 표준 메서드로 채택되었다. HTTP 스펙 살펴보기 위 두 이미지는 순서대로 HTTP/1.0과 HTTP/1.1의 스펙에 명시된 Method Defini..
문제상황@TransactionalEventListner를 사용하는 코드에서 문제가 발생했다. 문제를 유발한 코드는 아래와 유사했다.@Service@RequiredArgsConstructorpublic class GroupService { private final GroupRepository groupRepository; private final ApplicationEventPublisher applicationEventPublisher; @Transactional public void deleteGroup(long groupId) { groupRepository.deleteById(groupId); applicationEventPubl..
누군가 JVM이 무엇인지에 대해, 그리고 정확히 어떤 역할을 하는지에 대해 물어본다면 명확하기보단 두루뭉실한 대답이 많이 나올 것만 같다. 그냥 대충 뭐.. 자바 코드 실행시키고 관리해주는거야.. 자칭 Java가 주력인 개발자이면서 JVM 위에 대충벌레가 기어다닌다는 것.. 매우 부끄러운 일이다. JVM의 정의와 하는 역할에 대해 다시 한 번 정리해보자! Java Virtual Machine (JVM) JVM은 자바 가상 머신(Java Virtual Machine)의 줄임말이다. JVM은 자바 코드를 OS 독립적으로 실행시켜줄 수 있는 매우 중요한 도구이다. OS가 무엇이든간에, 해당 OS에 맞는 JVM을 설치하기만 하면 자바 코드를 실행시킬 수 있다. 우리는 Azul, 오라클, 아마존 등의 벤더 사에..
이전에 게시했던 ReentrantLock과 유사하게 자바에선 synchronized 키워드를 통해 특정 클래스 및 인스턴스에 대한 동기화를 제공한다. 개인적으론 synchronized 키워드를 직접 코드단에 사용하기보단 코어한 라이브러리들을 뜯어보며 발견한 경우가 대부분이었기에 동기화라는 키워드로 느낌만 대충 이해하고 있었다. 하지만 synchronized는 사용 방식에 따라 락 범위에 약간의 차이가 있고, 이를 이해하지 않고 사용하면 예상치 못한 문제를 만나게 될 수 있다. synchronized를 락의 관점에서 정리해보자! 1. synchronized method 아래와 같이 메서드 단위로 synchronized를 선언할 수 있다. public class SampleClass { public sync..