분류 전체보기 610

[단위 테스트] 4-1. 좋은 단위 테스트의 4대 요소: 4대 요소

블라디미르 코리코프 님의 "단위 테스트" 책을 정리한 포스팅입니다.1. 좋은 단위 테스트의 4대 요소요소설명문제 상황 / 원인해결 방안회귀 방지코드 수정 후 기능이 깨지는 것을 방지하는 테스트 역할코드 수정 후 테스트는 통과하지만 실제로는 동작하지 않음기존 동작을 명확히 검증리팩터링 내성코드 내부 구현이 변경되어도 테스트가 정상적으로 동작해야 함리팩토링 시 내부 동작 테스트 깨짐결과 기반 테스트구현 디테일 분리빠른 피드백테스트가 빠르게 실행되어야 실시간 피드백이 가능외부 의존성으로 느려지거나 무거워짐의존성 분리 (Fake/Stub)유지 보수성가독성, 유지 비용, 실행 비용 등을 평가 └ 이해 난이도테스트가 얼마나 직관적이고 쉽게 읽히는가복잡한 준비 코드AAA 패턴 사용설명적인 테스트 이름└ 실행 난이도..

Code/Test 2025.01.19

[단위 테스트] 3. 단위 테스트 구조

블라디미르 코리코프 님의 "단위 테스트" 책을 정리한 포스팅입니다.1. AAA 패턴테스트 코드를 세 단계로 구분하여 작성하는 패턴스위트 내 모든 테스트가 단순하고 균일한 구조를 갖게함단계설명Arrange테스트 대상(SUT) 및 의존성 설정Act테스트 대상 메서드 실행Assert결과 확인 (반환 값, 상태 변화, 호출 여부 등) 2. 권장 사항항목권장 사항이유 및 설명구절 수 제한한 테스트에는 한 act만단일 동작 검증조건문 회피분기문 피하기 (if, switch 등)복잡도 증가 (한 테스트에 여러 경우를 넣지 말고 분리해야 함)메서드 캡슐화복잡한 검증 로직 분리 (private 메서드로)반복 제거가독성 향상목적 명확화불변 위반 방지여러 호출로 결과 만들지 말 것불변성 깨질 수 있음 (한 동작 = 한 결과..

Code/Test 2025.01.07

[단위 테스트] 2-2. 단위 테스트란 무엇인가: 런던파와 고전파

블라디미르 코리코프 님의 "단위 테스트" 책을 정리한 포스팅입니다. 2. 런던파와 고전파격리 방식에 따라 크게 두 가지 스타일로 나뉨항목런던파 (London School)고전파 (Classical School)중심 철학상호작용 기반 (행위 검증)상태 기반 (결과 검증)테스트 단위코드 조각단일 동작TDD 방식하향식 (전체 설계/인프라 → 상위 → 하위)상향식 (하위 → 상위 → 전체 설계/인프라)의존성 처리모든 의존성을 Mock으로 대체공유 의존성만 Fake/Stub으로 격리 (나머지는 실제 객체 사용)장점빠르고 정밀함현실적인 테스트단점과잉 명세구현 의존성 높음문제 원인 추적이 어려움 예제) EmailSender더보기런던파// 인터페이스public interface EmailSender { void ..

Code/Test 2025.01.07

[단위 테스트] 2-1. 단위 테스트란 무엇인가: 단위 테스트란

블라디미르 코리코프 님의 "단위 테스트" 책을 정리한 포스팅입니다.1. '단위 테스트'의 정의작은 코드 조각을 단위로, 독립적으로 빠르게 검증하는 테스트 격리성독립적으로 실행 가능한 상태 (실행 환경이나 다른 테스트에 영향받지 않음)순서에 의존하지 않아야 함의존성 종류설명문제점해결 방법공유 의존성테스트 간에 공유되는 상태ex) 정적 가변 필드, 싱글턴, 전역 변수테스트 간 간섭 발생공유 제거각 테스트마다 초기화비공개 의존성코드에 드러나지 않는 숨은 의존성ex) JDBC, LocalDateTime.now() 등실패 원인 파악 어려움프록시추상화 (의존성 주입)프로세스 의존성외부 프로세스에 의존하는 시스템 구성 요소ex) RabbitMQ, Batch 등외부 시스템이 테스트에 영향Mock 객체 주입 예제) 공유..

Code/Test 2025.01.07

[단위 테스트] 1-2. 단위 테스트의 목표: 커버리지 지표

블라디미르 코리코프 님의 "단위 테스트" 책을 정리한 포스팅입니다.1. 테스트 스위트 품질 측정커버리지 지표전체 소스 코드 중 테스트에 의해 실행된 코드의 비율테스트 스위트의 품질을 평가하는데 자주 사용됨종류항목설명코드 커버리지전체 코드 중, 테스트 실행 시 실행된 라인의 비율- (실행된 코드 라인 수) / (전체 코드 라인 수)분기 커버리지조건문(if, switch)의 모든 분기가 테스트되었는지 측정- (통과한 분기 수) / (전체 분기 수)- 코드 커버리지보다 더 정밀하고 정확한 테스트 평가 가능 예시) 분기 커버리지더보기public boolean isEligibleForDiscount(int age, boolean hasCoupon) { if (age >= 18) { // 분기 1 ..

Code/Test 2025.01.06

[단위 테스트] 1-1. 단위 테스트의 목표: 단위 테스트 목표

블라디미르 코리코프 님의 "단위 테스트" 책을 정리한 포스팅입니다. 1. 테스트 코드 작성의 중요성새로운 기능을 개발할 때마다 새로운 버그 가능성이 존재함이를 방지하기 위해 지속적으로 테스트 코드를 작성해야 함하지만 코드 설계가 적절하지 못하면 테스트 코드 작성이 어려워지고, 테스트 코드 자체도 오류를 포함할 수 있음이처럼 잘못된 테스트 코드는 신뢰성을 떨어뜨려, 오히려 상황을 더 악화시킬 수 있음→ 테스트 코드의 품질도 본 코드만큼 중요하게 다루어야 함 2. 소프트웨어 엔트로피프로젝트는 시간이 흐를수록 코드베이스의 복잡성과 불확실성이 증가하는 경향이 있음 흐름엔트로피 증가코드 변경 시, 복잡도가 증가함예기치 못한 문제 발생복잡한 코드에 새 기능을 추가하면 부작용 발생 가능성이 커짐신뢰성 하락테스트가 없..

Code/Test 2025.01.06

[Effective Java] 12-2. 직렬화

조슈아 블로크 님의 "Effective Java" 책을 정리한 포스팅 입니다. 4. readObject 메서드는 방어적으로 작성하라readObject()는 또다른 public 생성자직렬화된 객체의 상태를 복원하는 메서드복원 중에 새로운 객체를 생성하는 역할을 함 매개변수로 바이트 스트림을 받는 생성자바이트 스트림을 받아서 객체 상태를 읽고 복원하는 방식바이트 스트림이 유효한지 먼저 검사해야 함 인수가 유효한지 검사defaultReadObject를 호출하여 기본 상태 복원 및 유효성 검사 매개변수를 방어적으로 복사해야 함클라이언트가 소유해서는 안되는 객체 참조를 갖는 필드를 모두 반드시 방어적으로 복사해야 함final은 방어적 복사 불가 clone()은 어떻게 복사될지 모르므로 사용하지 않도록객체가 어..

Java 2025.01.03

[Effective Java] 12-1. 직렬화

조슈아 블로크 님의 "Effective Java" 책을 정리한 포스팅 입니다. 1. 자바 직렬화의 대안을 찾으라자바 직렬화객체의 상태를 바이트 스트림으로 변환하여 저장하거나 전송할 수 있게 하는 기술역직렬화를 통해 객체로 복원 가능 위험성위험 유형설명보안신뢰할 수 없는 스트림을 역직렬화하면 원격 코드 실행 등 공격에 노출됨성능대용량 데이터를 역직렬화할 경우 서버 리소스를 과도하게 소모하여 DDoS에 악용될 수 있음 대안대안특징주요 용도JSON텍스트 기반, 사람이 읽을 수 있음브라우저 ↔ 서버 통신Protocol Buffer이진 기반, 성능 우수, 스키마 기반서버 ↔ 서버 통신 예) JSON더보기public class JsonExample { public static void main(String[..

Java 2025.01.03

[Effective Java] 11-2. 동기화

조슈아 블로크 님의 "Effective Java" 책을 정리한 포스팅 입니다. 1. wait와 notify보다는 동시성 유틸리티를 애용하라사용하기기 아주 까다로움으로 고수준 동시성 유틸리티를 사용하자 실행자 프레임워크스레드 풀 관리와 작업 실행을 위한 구현 제공스레드 생성과 관리를 추상화하여 직접 스레드 작업을 제어하지 않아도 됨 동시성 컬렉션동시 접근을 처리하기 위해 내부적으로 락 매커니즘을 활용여러 메서드를 원자적으로 묶어 호출하는 일 불가 ConcurrentHashMapBlockingQueue생산자-소비자 패턴에 적합큐가 비어 있을 떄 소비가자 대기하거나, 큐가 꽉 찼을 떄 생산자가 대기하는 방식으로 동작 동기화 장치멀티스레드 작업에서 스레드 간 협력을 지원하기 위한 유틸리티 CountDownLa..

Java 2025.01.03

[Effective Java] 11-1. 동기화

조슈아 블로크 님의 "Effective Java" 책을 정리한 포스팅 입니다. 1. 공유 중인 가변 데이터는 동기화해 사용하라synchronized배타적 실행원자적 실행해당 메서드나 블록을 한번에 한 스레드씩 수행하도록 보장해당 블록에 접근 시, 락이 걸림 스레드 사이의 통신로컬 캐시의 값이 메인 메모리와의 동기화를 수행함필드를 읽을 때, 항상 수정이 완전히 반영된 값을 얻지 않음스레드의 로컬 캐시와 메인 스레드의 동기화가 즉각적으로 이루어지지 않음한 스레드가 저장한 값이 다른 스레드에게 보이는 가를 보장하지 않음 Volatile스레드의 메모리 가시성을 메인 메모리로 일치시킴단위 연산일 경우, 스레드 통신을 보장하므로 동기화 연산을 생략할 수 있음 AtomicLongprivate static final..

Java 2025.01.01