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..
java 에서 equals 와 hashcode 를 재정의 해야하는 이유
·
JAVA
동등성(equality)과 동일성(identity)동일성(identity)자바에서 동일성은 비교되는 두 변수의 값이 같은지를 비교한다.물리적으로 같으냐를 생각해도 좋을 듯하다.‘==’ 연산자로 비교를 진행한다.동등성(equality)자바에서 동등성은 두 객체의 내용이 같은지를 의미한다.동일성과 비교해 논리적인 같음을 비교한다.모든 자바 클래스는 Object 클래스를 상속받는데 Object 의 equals 로 동등성을 비교한다.class Person{ private String name; public Person(String name) { this.name = name; } @Override public boolean equals(Object obj) { if (this == obj) re..
상속보단 조합을 선호하라 - Favor composition over inheritance
·
백엔드/아키텍처 & 패러다임 & 디자인 패턴
조합을 선호하라 - Favor composition over inheritanceis-a , has-a 관계의 차이관계실행되는 프로그램 내에는 여러 객체들간의 상호작용으로 이루어진다.이러한 객체들간의 상호작용을 위한 방식이나 형태를 모델링하는 개념이 관계이다.관계는 다음과 같은 종류로 나뉘어져 있다. is-a 관계is-a는 말 그대로 'A는 B이다'일 때의 '~이다'와 같다.Dog is a Animal 과 같은 관계를 가지는 것을 의미한다.코드에서는 관계를 상속으로 이를 표현한다. has-a 관계has-a 는 특정 객체를 다른 객체에 포함되는 관계를 의미한다.Computer has a CPU, RAM and MainBoard 같은 것을 의미한다.코드에서는 관계를 멤버 변수로 이를 표현한다. 상속의 문제점..