Java & Spring Boot

1️⃣ 테스트 피라미드란 무엇인가?테스트 피라미드는테스트의 종류를 계층화하여 비율과 역할을 구분한 개념. 단위 테스트는 많고 빠르게,통합 테스트는 적절히E2E 테스트는 최소한으로 유지이렇게 밸런스를 맞추는 것이 테스트 피라미드의 핵심. 2️⃣ 구글의 테스트 피라미드구글은 테스트를 크기 기준으로 구분함.구분이름의미Small Test (소형 테스트)단일 클래스, 함수 단위 테스트빠름, 결정적, 외부 의존 XMedium Test (중형 테스트)여러 컴포넌트 간 연동 테스트DB, 네트워크 등 일부 의존Large Test (대형 테스트)시스템 전체 통합 테스트느림, 환경 의존, 복잡함 3️⃣ 테스트를 구분하는 두 가지 핵심 기준① 테스트가 결정적인가? (Deterministic)테스트는 언제 실행해도 결과가 같아..
1️⃣ 서비스란 무엇인가?스프링에서 흔히 말하는 "서비스 클래스"는 비즈니스 로직을 담는 계층으로 알려져 있지만,실제로는 역할에 따라 두 가지 종류로 나뉨.도메인 서비스: 비즈니스 규칙의 핵심 로직 담당애플리케이션 서비스: 로직을 조합하고 실행 흐름을 관리이 둘을 구분하지 않으면,서비스는 점점 비대해지고 결국 "모든 걸 하는 슈퍼 클래스"가 되어버림. 2️⃣ 도메인 (Domain) — “비즈니스의 중심 객체”도메인은 주문, 결제, 배송, 상품 같은비즈니스의 핵심 개념을 직접 표현하는 객체.즉, 실세계의 규칙과 제약이 녹아 있는 코드.@Entitypublic class Order { private OrderStatus status; private Money totalPrice; public..
1️⃣ 순환 참조란 무엇인가? 순환 참조란두 개 이상의 객체나 모듈이 서로를 직접 또는 간접적으로 참조하는 관계.class A { private B b;}class B { private A a;} 2️⃣ 순환 참조의 문제점 ⚠️ 1. 무한 루프서로가 서로를 호출하는 재귀적 구조가 생길 수 있음.특히 toString(), equals(), hashCode() 재정의 시 주의.public class A { private B b; public String toString() { return "A -> " + b; }}public class B { private A a; public String toString() { return "B -> " + a; }}// A.toStri..
1️⃣ 왜 문서화 주석이 중요한가?자바에서는 /** ... */ 형식의 주석을 JavaDoc 주석이라고 부름이건 단순한 설명이 아니라,컴파일러가 인식해서 공식 문서로 변환할 수 있는 API 계약 문서/** * 두 정수의 합을 반환한다. * * @param a 첫 번째 정수 * @param b 두 번째 정수 * @return 두 수의 합 */public int sum(int a, int b) { return a + b;} → javadoc 도구로 자동 HTML 문서 생성 가능 → IDE에서 마우스 올리면 바로 표시됨 2️⃣ “공개된 API”란 무엇인가?"공개된 API"란 단순히 public만 뜻하지 않음외부에서 사용할 수 있는 모든 요소public 클래스, public 메서드라이브러리에서 외부에 ..
1️⃣ “parallelStream() 붙이면 빨라지겠지?”많은 개발자가 스트림을 이렇게 사용함 list.parallelStream() .map(this::expensiveOperation) .collect(Collectors.toList()); "병렬 스트림"이니까 여러 CPU 코어를 활용해서 당연히 더 빠를거라 기대하지만,현실은 다름!병렬 스트림은 마법이 아님올바른 상황에서만 이득이 있고, 그렇지 않으면 오히려 성능이 나빠지거나 오류를 일으킬 수 있음 2️⃣ 스트림 병렬화의 원리병렬 스트림은 내부적으로 ForkJoinPool을 사용해요소들을 여러 쓰레드로 쪼개서 처리함IntStream.range(0, 1_000_000) .parallel() .forEach(i..
1️⃣ 마커란 무엇인가?"마커"란, 추가 메서드 없이 단순히 '특정 속성을 표시'하는 용도의 구조를 말함 자바에는 두 종류가 있음종류예시특징마커 인터페이스 Serializable, Cloneable타입 수준에서 표시마커 애노테이션@Override, @Deprecated소스 코드 수준에서 표시 둘 다 "이 객체는 ~한 성격을 가진다"는 의미를 전달하지만,적용 범위와 역할이 다름 2️⃣ 마커 인터페이스의 대표 예시자바 표준 라이브러리에서 이미 여러 예시를 볼 수 있음public interface Serializable {}public interface Cloneable {} 이 인터페이스들은 메서드를 하나도 가지지 않음그저 "이 객체는 직렬화/복제가 가능하다"는 타입 표시(marker)로만 쓰임 3️⃣ ..
1️⃣ 제네릭은 유연하지만, 타입 제약은 단단하다자바의 제네릭은 타입 안정성을 높이는 대신,타입 불일치에 매우 예민함List objList = new ArrayList();List strList = new ArrayList();objList = strList; // ❌ 컴파일 에러 직관적으로는 "String은 Object의 하위 타입이니까 괜찮지 않나?" 싶지만,List은 List의 하위 타입이 아님 왜냐하면, List에 Integer를 추가할 수도 있기 때문즉, 제네릭 타입은 "불변" 2️⃣ 이때 등장하는 것이 “한정적 와일드카드”?은 와일드카드(wildcard)로"어떤 타입이 올지 모른다"는 뜻 여기에 extends나 super를 붙이면 "한정(bound)"할 수 있음표현의미예시? extends TT..
1️⃣ 중첩 클래스(Nested Class)란?자바에서는 클래스 안에 클래스를 정의할 수 있음이걸 중첩 클래스(nested class)라고 함 종류는 크게 네 가지이다 👇 종류static 여부외부 클래스 참조주 사용처정적 멤버 클래스OX독립적인 유틸리티내부 로직 캡슐화비정적 멤버 클래스XO외부 인스턴스와 강하게 연결로컬 클래스XO메서드 내부의 임시 클래스익명 클래스XO짧은 1회성 구현 2️⃣ 비정적 멤버 클래스의 문제점비정적 멤버 클래스는 무조건 외부 클래스의 인스턴스에 묶여서 존재함class Outer { class Inner { void hello() { System.out.println("Hello from " + Outer.this); } ..
1️⃣ 왜 clone은 위험할까? 자바의 Cloneable 인터페이스와 Object.clone() 메서드는 객체의 복사를 쉽게 해줄 것 같지만, 실제로는 아님복사가 얕게(shallow) 이루어짐CloneNotSupportedException 예외를 신경써야 함상속 구조에서 불변식을 깨뜨리기 쉬움즉, 잘못 사용하면 버그가 생기기 쉽고, 안전한 복제를 위해선 주의 깊은 설계가 필요함 2️⃣ 얕은 복사로 생기는 문제class Person implements Cloneable { String name; List phones; @Override public Person clone() { try { return (Person) super.clone(); // ..
Java에서 병렬 처리나 비동기 작업을 구현할 때 Thread를 직접 생성해 사용하는 방식은 더 이상 일반적이지 않습니다. 요즘 Java에서는 ExecutorService를 사용하여 스레드 풀(Thread Pool)을 효율적으로 관리하는 것이 표준입니다. 특히 Executors 클래스에서 제공하는 팩토리 메서드들을 활용하면 다양한 유형의 스레드 풀을 간편하게 생성할 수 있습니다.이번 글에서는 Executors가 제공하는 대표적인 스레드 풀 4종류를 살펴보고, 각각의 사용 시나리오와 주의할 점을 예제 중심으로 정리해보겠습니다. newFixedThreadPool(int nThreads)이 메서드는 정해진 개수만큼의 스레드를 미리 생성하고, 그 스레드들이 재사용되며 작업을 처리합니다. 더 많은 작업이 들어오면..
둘기덕
'Java & Spring Boot' 카테고리의 글 목록