[API 연동 시리즈] 외부 API와 연동할 때 주의할 점
·
카테고리 없음
서론 백엔드 개발을 하다보면 DB 연동만큼 자주하는 것이 외부 API 연동이라 생각한다. 외부 API 에는 외부 PG사, Open API, 혹은 큰 규모의 프로젝트라면 내부 마이크로서비스간 통신 등등이 있을 수 있다. 이번 포스팅은 외부 API 연동을 할 때 주의할 점을 다루고자 한다. 문제와 해결 방안도 다룰 예정이지만 이번 포스팅에는 전체적인 흐름만 훑고 더 딥한 내용은 다음 포스팅으로 다룰 것이다. 외부 API 연동시에 주의해야하는 점외부 API 연동의 목적이 무엇인가?외부 API 연동의 목적은 크게 나누면 다음과 같다.조회 API쓰기 API 조회 API를 사용하는 경우에는 쓰기 API 를 사용하는 경우보다는 주의해야하는 부분이 적다. 하지만 조회 API의 결과를 우리 서버에서 후처리를 하는 구조..
글쓰기를 다시 시작하는 이유와 회고
·
회고
서론블로그 글을 제대로 안 쓴지 한 6개월 정도는 되는 것 같다. 나름의 이유가 있었고 해당 이유가 뭔지를 이야기해보고 이때까지 무엇을 했는가하는 회고와 생각 정리 글을 끄적일려고 하려한다. 블로그 형식의 글을 오랜만에 쓰려하니까 뭔가 어색한 느낌도 들고 글을 읽거나 정리는 많이 했어도 내 생각을 적는 게 오랜만이라 표현이 두서가 없을 수도 있지만 시작이 중요하니 끝까지 적어내려 한다. 본론글쓰기를 멈춘 이유...사실 그동안 현타가 왔던거 같다. 글을 쓰고 내가 한 학습을 정리를 했던 것들이 의미가 없나? 라는 의구심을 많이 가졌었다. 요즘은 ai agent 가 워낙 성능이 좋다보니 무엇이든 결과물을 내는게 쉬워졌고 너도 나도 개발을 할 수 있게 됐다. "이렇게 특별한 인사이트나 학습 없이도 개발할 수..
1. 효율적이고 체계적인 소프트웨어 테스트
·
카테고리 없음
테스트를 하는 개발자와 하지 않는 개발자 테스트 케이스를 도출할 때 더 체계적인 접근법을 사용하여 놓치는 경우가 생길 확률을 줄일 수 있다.테스트 자동화를 적용해서 수동 테스트에 너무 많은 시간을 쓰지 않도록 하는 이점을 얻을 수 있다. 개발자를 위한 효율적인 소프트웨어 테스트 개발 과정에서의 효율적인 테스트 요구사항을 개발자가 이해를(요구사항 분석) 하고 나면 코드를 작성하기 시작한다.기능 개발을 유도하기 위해 개발자는 짧은 TDD 과정을 반복한다.하나의 클래스나 메서드로 구현할 수 없다. 개발자는 여러 단위(클래스나 메서드)를 만들게 된다. 각 단위는 다른 계약을 가지고 있고 서로 어율려 전체 기능을 구성하게 된다.개발자가 자신이 만든 단위에 만족하고 요구사항을 충족한다고 생각하면 테스트를 작성하기..
외부 PG API 연동기 — 트랜잭션, 타임아웃, 그리고 데이터 일관성
·
백엔드
들어가며야밤(YABAM)은 대학 축제 테이블 오더 & POS 서비스다. 실제 서비스를 운영했을 때는 운영 지침상 온라인 결제를 도입하지 못했지만, 서비스를 개선하는 과정에서 토스페이먼츠(TossPayments) PG API를 연동하게 되었다.외부 PG API를 붙이면서 단순히 HTTP 요청 하나 추가하는 문제가 아니라는 걸 금방 깨달았다. 트랜잭션 설계, 타임아웃 처리, 재시도 전략, 데이터 일관성까지 — 결제라는 민감한 도메인에서는 모든 엣지 케이스가 사용자 신뢰와 직결된다. 이 글은 그 고민의 과정을 정리한 것이다. 1. 외부 API와 트랜잭션, 왜 분리해야 할까?첫 설계와 문제점처음 생각한 구조는 단순했다.트랜잭션 시작PG API에 결제 승인 요청승인 응답 수신결제 결과를 DB에 저장트랜잭션 커밋이..
서버의 동시성만 고려하면 될까?[업데이트중]
·
카테고리 없음
주문 데이터 Polling 예제로 학습하는 조회 성능 개선과 도메인 데이터를 이해해야하는 이유
·
백엔드
개요야밤(YABAM) 서비스의 POS 주문 조회 API는 Polling 기반으로 구현되어 있어 트래픽이 배수로 증가하는 구조적 문제가 있었다. 이 글에서는 Single MySQL Polling, MySQL Replication, Redis ZSET 캐싱, SSE + Redis Pub/Sub 네 가지 선택지를 비교하고, 실제 성능 테스트 결과를 바탕으로 어떤 방법이 현실적으로 최선인지를 다룬다.1. 배경야밤 서비스의 주문 도메인야밤 서비스에서 POS 기능의 핵심은 실시간 주문 현황 조회다. 점주는 POS 화면에서, 손님은 테이블 주문 화면에서 주문 상태를 실시간으로 확인한다.주문 데이터의 상태 흐름은 아래와 같다.주문 생성 → 주문 접수 → 서빙 완료 ↘ (언제든) 주문 취소 ↗ 주문자는..
String, StringBuffer, StringBuilder 알고 사용하자
·
JAVA
문자열을 더하는 로직문자열을 더하는 방법으로 무엇이 있을까?String 의 + 연산String.concatStringBuffer or StringBuilder 의 append 메서드String 으로 문자열 더하기 String str = "String";str += "plus";문자열을 더하는 연산을 할 때는 String 으로 작성하면 무슨 문제가 발생할까String 으로 문자열 더하기 연산을 하면 더해진 문자열을 저장하는 String 객체를 하나 더 생성한다.새로운 객체를 생성하여 메모리에 할당하는 연산과 이전과 같은 객체가 많이 쌓여 GC가 수행되는 연산까지 합쳐져 오버헤드를 발생하기 때문에 String 으로 더하기 연산은 오버헤드를 발생한다.StringBuilder , StringBuffer 로 더하..
System.currentTimeMills(), System.nanoTime() 알고 사용하자
·
JAVA
시간 측정을 위한 메서드 로직보통 시간을 측정하기 위해 System.currentTimeMills() 이나 System.nanoTime() 을 사용하여 측정하고자 하는 시간을 측정한다.두 개의 차이점과 어떤 상황에 쓰는지 알아보자System.currentTimeMills()현재 시간과 UTC인 1970년 1월 1일 자정과의 차이로 밀리세컨드(1/1000 초) 값을 반환한다.public class TimeMeasureMillis { public static void main(String[] args) { long start = System.currentTimeMillis(); // 시작 시각 (ms) // 측정할 코드 for (int i = 0; i System...
깊은복사와 얕은복사란? Cloneable 을 사용하지 말자
·
JAVA
깊은 복사와 얕은 복사얕은 복사란?원시타입이 아닌 객체와 같은 참조형(reference) 타입의 변수를 그대로 복제를 한다면 값이 복사되는 것이 아닌 주소값이 복사되어 결국 같은 힙의 데이터를 바라보는 꼴이 되어 버린다public class Main { public static void main(String[] args) { Test t1 = new Test(10); Test t2; // 복사할 변수 t2 = t1; // 얕은 복사 System.out.println(t1 == t2); // 두개의 참조값이 같으므로 true t1.setValue(20); System.out.println(t2.getValue() == t1.getValue());// t1의 값을 변경했으므로 t2의 값도 변경됨...
자바의 제네릭 기초부터 deep dive
·
JAVA
Object 타입의 위험성타입이 불특정될 때 Object 타입을 사용하는 것의 문제 public class CastingDTO implements Serializable { private Object object; public void setObject(Object obj) { object = obj; } public Object getObject() { return object }}타입이 불특정적일 때 위처럼 Object 로 타입을 선언할 수 있다.public static void main(String[] args) { CastingDTO dto = new CastingDTO(); dto.setObject(new String()); String s1 = (Str..