분류 전체보기 414

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

블라디미르 코리코프 님의 "단위 테스트" 책을 정리한 포스팅입니다. 2. 런던파와 고전파격리 특성에 따라 나뉨 런던파작은 코드 조각 단위테스트 대상 시스템을 협력자에게서 완전히 격리모든 의존성을 Mock으로 대체코드 조각을 테스트 대역으로 분리 (단, 불변 비공개 의존성은 제외) 하향식 TDD전체 설계와 인프라부터 준비하고, 이를 기반으로 상위 레벨 테스트 및 하위 레벨 구현 장점입자성테스트 실패 시, 코드베이스의 어느 부분이 고장 났는지 명확히 알 수 있음의존성에서 문제가 발생하면 테스트가 실패함SUT의 문제인지 직관적으로 확인할 수 없음객체 그래프를 분할할 수 있음객체 그래프를 재생성하지 않아도 됨서로 연결된 클래스의 그래프가 커져도 테스트 용이 단점과잉 명세과도한 명세로 인해 테스트가 SUT의 세부..

Code 2025.01.07

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

블라디미르 코리코프 님의 "단위 테스트" 책을 정리한 포스팅입니다.1. '단위 테스트'의 정의단위 테스트란작은 코드 조각 단위로빠르고 자동으로 실행격리된 방식 격리단위 테스트는 격리된 환경에서 실행되야 함테스트는 순서에 의존하지 않아야 하며, 독립적으로 실행 가능한 상태여야 함 공유 의존성테스트 간에 공유되고 서로의 결과에 영향을 미칠 수 있는 상태나 데이터상태변경이 허용될 경우, 테스트 간 영향을 끼칠 수 있음공유 의존성을 제거하거나, 모의 객체로 대체정적 가변 필드 등 비공개 의존성애플리케이션의 실행 흐름에서 보이지 않는 의존성메모리 기반의 프록시로 대체데이터베이스 연결, 시스템 접근 등 프로세스 의존성애플리케이션 실행 프로세스 외부에서 실행되는 의존성의존성을 대체할 Mock 시스템 사용메시지 큐, ..

Code 2025.01.07

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

블라디미르 코리코프 님의 "단위 테스트" 책을 정리한 포스팅입니다.1. 테스트 스위트 품질 측정을 위한 커버리지 지표커버리지 지표테스트 스위트가 소스 코드를 얼마나 실행하는 지를 백분율로 나타내는 지표테스트 스위트의 품질을 평가하는데 자주 사용됨 문제점public String categorizeAge(int age) { if (age 테스트 대상 시스템의 모든 가능한 결과를 검증한다 보장할 수 없음 @Testpublic void testIsValidInput() { assertTrue(isValidInput("abcdef")); // 단일 입력값만 테스트}private boolean isValidInput(String input) { return StringUtils.isNotEmpty..

Code 2025.01.06

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

블라디미르 코리코프 님의 "단위 테스트" 책을 정리한 포스팅입니다. 1. 단위 테스트 현황비율제품 코드와 테스트 코드의 비율은 1:1~3 정도 새로운 기능과 버그 발생새로운 기능을 구현할 때 새로운 버그가 지속적으로 나타남 테스트 코드 작성의 어려움적절하지 않은 설계의 코드를 테스트할 경우, 테스트 코드를 작성하는데 어려움이 있음잘못된 테스트 코드는 오히려 상황을 더 악화시킬 수 있음 2. 단위 테스트 목표소프트웨어 엔트로피프로젝트에서는 시간이 지날수록 코드베이스의 복잡성과 불확실성이 증가하는 경향이 있음 엔트로피 증가코드 변경시 엔트로피는 증가함기존 기능에 영향을 주어 예기치 못한 문제가 발생테스트가 없는 프로젝트는 시작은 유리하지만 이내 진척이 없을 정도로 느려짐결국 코드베이스를 신뢰할 수 없음 목표..

Code 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 public class JsonExample { public static void main(String[] args) throws Exception { ObjectMapper mapper = new ObjectMapper(); // 객체를 JSON으로 직렬화 ..

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

[Effective Java] 10-2. 예외

조슈아 블로크 님의 "Effective Java" 책을 정리한 포스팅 입니다. 1. 추상화 수준에 맞는 예외를 던지라예외 번역상위계층에서는 저수준 예외를 잡아 자신의 추상화 수준에 맞는 예외로 변경스스로 처리하기 어려운 경우 사용 예외 연쇄근본 원인인 저수준 예외를 고수준 예외에 실어 보내는 방식디버깅에 도움이 될 경우 사용 2. 메서드가 던지는 모든 예외를 문서화하라예외가 발생하는 상황을 자바독의 @throws 태그를 사용하여 정확히 문서화하기비검사 예외는 선언의 throws에 포함시키지 말기 3. 예외의 상세 메시지에 실패 관련 정보를 담으라실패 순간을 포착하려면 발생한 예외에 관여된 모든 매개변수와 필드의 값을 실패 메시지에 담아야 함 4. 가능한 한 실패 원자적으로 만들라호출된 메서드가 실패하더..

Java 2025.01.01

[Effective Java] 10-1. 예외

조슈아 블로크 님의 "Effective Java" 책을 정리한 포스팅 입니다.1. 예외는 진짜 예외 상황에만 사용하라코드를 try-catch에 작성하면 jvm이 적용할 수 있는 최적화가 제한됨특정 상태에서만 호출할 수 있는 상태 의존적 메서드를 제공하는 클래스는 상태 검사 메서드도 함께 제공해야 함2. 복구할 수 있는 상황에는 검사 예외를, 프로그래밍 오류에는 런타임 예외를 사용하라검사 예외호출하는 쪽에서 복구하리라 여겨지는 상황API 설계자는 검사 예외를 던져주어 사용자로 하여금 해당 상황에서 회복해달라 요구한 것 비검사 예외런타임 예외프로그래밍 오류전제조건이 지켜지지 않을 경우가 대다수적절한 에러 메시지를 뱉으며 중단됨RuntimeException 클래스 에러복구 불가능jvm 단에서 나는 에러 (자..

Java 2025.01.01