SimpleDateFormat 동시성 문제부터 불변 객체까지
서비스의 날짜 변환 유틸에서 간헐적으로 발생한 ArrayIndexOutOfBoundsException을 추적하며 찾은 SimpleDateFormat 동시성 문제의 원인과 같은 유형의 사례, 불변 객체를 정리합니다.
서비스의 날짜 변환 유틸에서 간헐적으로 발생한 ArrayIndexOutOfBoundsException을 추적하며 찾은 SimpleDateFormat 동시성 문제의 원인과 같은 유형의 사례, 불변 객체를 정리합니다.
데드락이 생기는 네 가지 조건과 운영체제의 예방·회피·감지·무시 전략을 정리하고, InnoDB·JVM·tryLock·락 순서 정렬 같은 실제 도구가 각각 어느 전략에 해당하는지 예제 흐름도로 연결합니다.
한 프로그램 안의 여러 스레드가 같은 데이터를 건드릴 때 쓰는 스핀락·뮤텍스·세마포를 기다리는 방식과 소유권 차이로 비교하고, 순서 신호와 우선순위 역전까지 예제 흐름도로 정리합니다.
JVM 메모리 구조와 Mark·Sweep·Compaction, 세대별 GC의 동작 원리를 정리하고, Serial GC부터 G1 GC, ZGC까지 주요 GC 알고리즘의 단계와 Stop-The-World 구간을 흐름도로 비교합니다.
jstat으로 GC 상태를 모니터링하는 방법과 Young·Old·Metaspace 영역별 증상에 따른 GC 튜닝 기준을 힙 구조, 튜닝 흐름 그림과 함께 정리합니다.
Java의 함수형 인터페이스 Supplier의 정의와 사용법을 예제로 정리하고, 값이 필요한 순간까지 호출을 미루는 지연 초기화에 활용하는 방법을 정리합니다.
이펙티브 자바 2장 중 생성자 대신 정적 팩터리 메서드를 쓰는 장단점과 명명 방식, 매개변수가 많을 때 점층적 생성자 대신 빌더 패턴과 계층적 빌더를 쓰는 방법을 예제와 흐름도로 정리합니다.
레거시 QnaService의 질문 삭제 로직에서 단위 테스트 가능한 비즈니스 로직을 도메인 모델로 옮기는 리팩터링 미션의 요구사항과 리뷰 피드백을 정리합니다.
익명 클래스를 람다로 바꾸고, 람다로 합계 로직의 중복을 없애고, 스트림의 map, filter, reduce와 Optional로 조건 반환·기본값·예외 처리를 구현한 미션 기록입니다.
Set 컬렉션의 size()와 contains()를 학습 테스트로 확인하고, JUnit5의 @ValueSource·@CsvSource로 중복 코드를 제거한 뒤 받은 리뷰 피드백까지 정리한 미션 기록입니다.
들여쓰기 depth와 메서드 크기 제한, else 금지 조건 아래 문자열 사칙연산 계산기를 구현하고, 리뷰 피드백에 따라 if-else 분기를 연산자 enum으로 바꾼 과정을 정리합니다.
문자열 덧셈 계산기를 TDD로 구현하고, 리뷰 피드백에 따라 상수화, 멤버 변수의 지역 변수 전환, 들여쓰기를 줄이는 메서드 분리, 테스트 개선을 적용한 기록입니다.
로또 자동 구매 기능을 TDD로 구현하고, 리뷰를 반영해 당첨 상수를 enum 안으로 옮기고 전략 인터페이스 이름을 구체적으로 바꾼 기록입니다.
보너스 볼로 2등을 판정하는 로또 3단계를 enum과 일급 컬렉션으로 구현하고, 리뷰를 반영해 enum 상수 정리, 서비스 객체 싱글톤, 스트림 리팩터링을 적용한 기록입니다.
로또 수동 구매 기능을 값 객체와 일급 컬렉션으로 구현하고, 리뷰를 반영해 view 쪽 입력 객체, 수동·자동 로또를 합치는 메소드, 스트림으로 구조를 바꾼 기록입니다.
사다리 미션 2단계에서 참여자 이름과 함께 사다리를 출력하는 기능을 구현하고, 생성자 책임 분리, Object 대신 제네릭과 Supplier 활용, 오버엔지니어링 기준에 대한 리뷰 피드백을 정리합니다.
사다리 미션 3단계에서 실행 결과를 출력하는 기능을 구현하고, Utils 이름과 논리적 의존성, 명령과 조회 분리, enum 패키지 위치, 메서드 응집도에 대한 리뷰 피드백을 정리합니다.
사다리 미션 4단계에서 코드를 리팩터링하며 받은 방어적 복사, 메서드 이름과 역할, 내부에서만 쓰는 enum, 전략 인터페이스 주입에 대한 리뷰 피드백을 정리합니다.
자동차 경주 게임을 처음 구현하며 받은 View 책임 분리, 축약어 지양, 경계값 테스트, 생성자에서 자동차 생성, 유틸리티 클래스의 private 생성자에 대한 리뷰 피드백을 정리합니다.
자동차 이름과 우승자 판별 기능을 추가하며 받은 클래스 변수 작성 순서, 원시값 포장, String.format, stream 활용에 대한 리뷰 피드백과 일급 컬렉션으로 정리한 코드를 기록합니다.
자동차 경주 코드를 MVC 패턴으로 리팩터링하며 받은 사용자 정의 예외, 실패하는 테스트, 정적 팩토리 메서드, 전략 패턴에 대한 리뷰 피드백을 정리합니다.
넥스트스텝 수강신청 미션 2단계에서 DB 테이블 설계 없이 강의(Session)의 도메인 모델부터 TDD로 구현하며 받은 수강 인원 검증 위치, enum에 메시지 보내기 리뷰 피드백을 정리합니다.
수강신청 미션 3단계에서 2단계의 도메인 구조를 유지하며 DB 테이블과 매핑하고, 도메인 의도가 드러나는 메서드 이름과 SessionUserMapping 목록에 대한 리뷰 피드백을 정리합니다.
for문 대신 자바 Stream으로 리스트·맵 변환, enum 값 찾기, 합계, 중복 체크, null 처리, 문자열 합치기, reduce를 작성한 예제를 정리합니다.
자바의 익명 클래스가 무엇인지 정리하고, 조건만 다른 합계 함수의 중복을 조건 전달로 줄이는 예제, 인터페이스를 이름 없이 구현하는 방법과 람다와의 관계, 사용할 때의 이점을 흐름도와 함께 정리합니다.
Collection을 감싸고 그 외의 멤버 변수를 두지 않는 일급 컬렉션의 정의와 장점 일곱 가지를, 로또 번호를 정렬해 보관하는 LottoNumbers 예제 코드와 함께 정리합니다.
자동차 이름을 String 대신 Name 객체로 감싸는 예제로, 원시 타입 변수를 포장하면 유효성 검증 책임이 값 객체 안으로 옮겨져 Car의 역할이 분명해지는 이유를 정리합니다.
Track에서 Cars를 만들던 반복문을 Cars.from()으로 옮기는 예제로 정적 팩토리 메서드가 객체 생성 로직을 감추는 방식을 살펴보고, from·of·getInstance 등 네이밍 컨벤션을 정리합니다.
Bean Validation의 @NotNull, @NotBlank, @Min, @Size, @Pattern 같은 검증 어노테이션 종류와, @Valid로 요청 값을 검증하는 흐름과 사용 예시를 정리합니다.
Jackson의 @JsonIgnoreProperties로 특정 프로퍼티를 직렬화·역직렬화에서 제외하는 방법과, ignoreUnknown=true로 클래스에 없는 JSON 프로퍼티를 무시해 역직렬화 오류를 막는 방법을 정리합니다.
Collectors.toMap()으로 Map을 만들 때 키가 중복되면 발생하는 IllegalStateException(Duplicate Key)과, 세 번째 인자인 Merge Function으로 값을 병합해 해결하는 방법을 정리합니다.
NPE를 막기 위해 사용했던 컬렉션 null 체크(CollectionUtils.emptyIfNull, Optional.ofNullable, isEmpty)와 Lists.partition, Function.identity()로 Map 만들기를 예제와 흐름도로 정리합니다.
프록시 서버를 거쳐 이미지를 받아 오는 코드에서 getBody() null 체크와 RuntimeException catch가 빠져 발생한 NPE의 원인과, 방어 코드·catch 추가로 해결한 과정을 정리합니다.
회원 등록·수정·조회 API를 예제로, 엔티티를 요청·응답에 그대로 쓰지 않고 별도의 DTO로 API 스펙과 엔티티를 분리하는 방법과 수정 API에서 커맨드와 쿼리를 나누는 방법을 정리합니다.
Java 21에서 정식 도입된 Virtual Thread가 Carrier Thread에 mount·unmount되는 방식을 운영체제의 멀티프로그래밍·멀티태스킹·멀티스레딩 개념과 연결해 흐름도로 설명하고, pinning을 포함한 장단점과 사용 시기를 정리합니다.
Java에서 멀티스레드로 공유 변수를 증가시킬 때 레이스 컨디션이 생기는 과정을 스레드 실행 순서 흐름도로 살펴보고, synchronized·ReentrantLock·AtomicInteger로 해결하는 방법과 volatile의 한계를 정리합니다.
스프링 부트 내장 톰캣 환경에서 서블릿을 등록하고, HttpServletRequest로 쿼리 파라미터·HTML Form·메시지 바디 데이터를 조회하는 방법과 HttpServletResponse로 텍스트·HTML·JSON을 응답하는 방법을 정리합니다.
회원 관리 웹 애플리케이션을 서블릿, JSP, MVC 패턴 순서로 만들어 보며 각 방식의 한계와 MVC 패턴이 등장한 이유, 그리고 MVC 컨트롤러에 남는 중복과 공통 처리 문제를 정리합니다.
프론트 컨트롤러 패턴을 v1부터 v5까지 단계적으로 발전시키며 뷰 분리, 서블릿 종속성 제거, 뷰 리졸버, 핸들러 어댑터가 스프링 MVC의 핵심 구조로 이어지는 과정을 정리합니다.
회원 서비스의 메서드마다 넣은 실행 시간 측정 코드를 예로 들어 핵심 관심사항과 공통 관심사항을 나누는 AOP의 필요성과, @Aspect와 @Around로 시간 측정 AOP를 작성하는 방법을 정리합니다.