전체 글

· Spring
RestTemplate vs OpenFeign 은 Spring에서 외부 REST API를 호출할 때 자주 비교되는 기술입니다. 두 가지 모두 HTTP 클라이언트 역할을 하지만 사용 목적과 추상화 수준, 코드 작성 방식에서 차이가 있습니다. 1. RestTemplateSpring에서 오래된(Deprecated 예정) HTTP 클라이언트로, HttpClient나 OkHttp 위에 추상화되어 있음.직접 HTTP 요청/응답을 구성해야 하므로 유연하지만 코드 양이 많고 반복적.RestTemplate는 동기식 호출만 지원 (비동기 필요 시 WebClient 사용 권장). 1) 장점HTTP 요청을 세밀하게 커스터마이징 가능 (헤더, 인증, 타임아웃 등).오래된 레거시 코드나 기존 시스템에서 호환성이 높음.Sprin..
1. 배경 정산 시스템에서 동시성 이슈가 발생하는 상황은 주로 여러 프로세스 또는 사용자/스레드가 동시에 동일한 정산 대상 데이터에 접근하거나 변경하려 할 때 발생한다. 정산은 신뢰도 하락 (파트너, 회계, 고객에게 잘못된 정보 제공), 복구가 매우 어려움 (특히 집계 후 송금까지 완료된 경우) 등 금전적 정확성이 요구되기 때문에, 아주 사소한 동시성 문제도 치명적인 오류로 이어질 수 있다. 2. 해결 방법 고민 2-1 낙관적 락(Optimistic Lock)[개요]엔티티에 @Version 필드를 두고 JPA가 이를 활용해 업데이트 시점의 버전을 체크 트랜잭션 커밋 시점에 DB에 있는 버전과 다르면 OptimisticLockException 예외 발생 [문제점 및 제약]충돌 발생 시 처리 비용 증가 ..
1. 배경 외부 시스템 문제로 장애가 발생하면, (너무 억울하지만) 고객은 이를 인지할 수 없기 때문에 서비스에 대한 고객 경험 하락과 함께 부정적인 인식이 생길 수 있다. 그렇기 때문에 외부 시스템을 연동할 때는 반드시 그 시스템의 장애가 서비스 장애로 이어지지 않도록 주의를 기울여야 한다. 조금의 장애도 발생하지 않는 서비스는 없기 때문에 항상 외부 시스템의 장애를 염두에 두고 연동해야 하며, 해당 시스템 장애 시에 서비스의 영향 범위를 최소화할 수 있는 고민이 필요하다. 그럼, 외부 시스템 장애를 회피할 수 있는 몇 가지 방법을 살펴보자. 1) 의존성 제거반드시 필요한 기능이 아니거나 대체할 방법이 있다면 의존 관계를 맺지 않는 것이 서비스의 안정성을 높일 수 있는 가장 쉬운 방법이다.예를 들어, ..
1. 배경 1-1 진입점이란‘진입점’은 사용자 요청의 시작점을 의미한다. 애플리케이션 또는 시스템에서 사용자 요청이 최초 진입되는 지점이 바로 진입점 이다.그 중에서도 SQL 진입점은 데이터베이스 시스템으로의 쿼리 전송 시, 애플리케이션 또는 시스템에서 쿼리가 전송된 시작점을 의미한다.기존에 모든 SQL 요청에 대해 다음 방식으로 진입점 정보를 SQL 로그 주석(/* handler...)으로 남기는 작업을 진행. 1-2 진입점 정보가 남아야 하는 이유모든 SQL 요청마다 진입점 정보가 남는다면 다음과 같은 큰 이점을 누릴 수 있다. 1) 성능 최적화특정 진입점에서 발생하는 과도한 데이터베이스 액세스나 비효율적인 쿼리를 식별하는 데 도움이 됩니다.DBA분들이 제공한 slow query 목록이 있습니다. ..
1. 배경테스트 환경테스트 환경은 프로젝트 설정을 할 때 가장 중요한 부분 중 하나이다. 가장 어렵고 귀찮은 작업이기도 하지만 처음 한번만 고생하면 추후 테스트 작성 시에 걱정 없이 아주 깔끔한 테스트 코드를 짤 수 있게 된다. 하지만 그만큼 프로젝트 환경 설정에서 가장 많은 시간을 들이게 되고, 많은 시행착오를 겪는 구간 중 하나라고 볼 수 있다. 테스트 환경을 만드는 과정에서 신경써야 할 부분은 다양하겠지만 그중에서도 특히나 주의해야할 부분 중 하나는 바로 멱등성이다. 멱등성을 간과한 경우에는 예상치 못한 상황에서 다른 테스트 혹은 외부 모듈로 인해 테스트가 간헐적으로 실패할 수 있으며, 이 경우 실패 구간을 찾기 매우 어렵다는 특징을 가지고 있기 때문이다. 여기서 멱등성(idempotent)이란? ..
· OS
프로세스메모리에 적재되고 CPU 자원을 할당받아 프로그램이 실행되고 있는 상태.   스레드프로세스의 한계과거에는 프로그램을 실행할 때 프로세스 하나만을 사용해서 이용했었다. 하지만 기술이 발전됨에 따라 프로그램이 복잡해지고 다채로워짐으로써 프로세스 작업 하나만을 사용해서 프로그램을 실행하기에는 한계가 있었다. 과거에는 파일을 다운받으면 실행 시작부터 실행 끝까지 프로세스 하나만을 사용하기 때문에 다운이 완료될때까지 하루종일 기다려야 했다. 그렇다고 동일한 프로그램을 여러 개의 프로세스로 만들게 되면, 그만큼 메모리를 차지하고 CPU에서 할당받는 자원이 중복되게 될 것이다. 스레드(Thread)는 이러한 프로세스 특성의 한계를 해결하기 위해 탄생 하였다.  스레드의 개념하나의 프로세스 내에서 동시에 진행되..
· network
REST는 HTTP의 메서드를 활용해 CRUD를 구현하고, URI를 통해 자원을 명시하는 등 HTTP 통신의 특성을 최대한 활용하는 아키텍처  REST API구성 요소자원(RESOURCE) - URI자원을 구별하는 ID는 /orders/order_id/1와 같은 HTTP URI이다. 행위(Verb) - HTTP METHODHTTP 프로토콜의 Method를 사용 표현(Representations)리소스에 대한 표현 (HTTP Message Body)Client가 자원의 상태(정보)에 대한 조작을 요청하면 Server는 이에 적절한 응답현재는 JSON으로 주고 받는 것이 대부분   제약 조건Client-Server Architecture (서버-클라이언트 구조)REST 서버는 API 제공, 클라이언트는 사용..
1. 접근 배경일반적인 서비스에서는 여러 도메인 객체의 다양한 필드들을 유저나 관리자의 API 호출 등으로 수정하게 된다. 단순히 조회수 등이 추가 되는 것이 아니라 도메인의 메인 프로퍼티들이 변경된다. 이런것들은 보통 Restful 에서 PUT /도메인이름/{id} 같은 API 를 통해 수정이 되게 되는데, 구현 방식에 따라 몇 가지 차이가 있을 수 있다. 클라이언트에서 수정요청 보낼 시, 필요한 모든 필드를 채워서 보내는 경우-> 이 경우에는 해당 요청을 받아낼 Request 용 DTO 등을 만들거나 해서 해당 정보를 받아온 후, 무조건 기존에 있던 데이터의 DTO 의 모든 필드를 다 assign 해버리면 된다. 변경이 되든 안되든 그 값이 다 담겨져 있기 때문.반대로 모든 필드가 안 채워서 오는 경..
코딩스토리
코딩스토리