레거시 코드 리팩터링 — 1단계
레거시 QnaService의 질문 삭제 로직에서 단위 테스트 가능한 비즈니스 로직을 도메인 모델로 옮기는 리팩터링 미션의 요구사항과 리뷰 피드백을 정리합니다.
레거시 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 목록에 대한 리뷰 피드백을 정리합니다.
Collection을 감싸고 그 외의 멤버 변수를 두지 않는 일급 컬렉션의 정의와 장점 일곱 가지를, 로또 번호를 정렬해 보관하는 LottoNumbers 예제 코드와 함께 정리합니다.
자동차 이름을 String 대신 Name 객체로 감싸는 예제로, 원시 타입 변수를 포장하면 유효성 검증 책임이 값 객체 안으로 옮겨져 Car의 역할이 분명해지는 이유를 정리합니다.
클린 코드 2장을 읽고 의도를 분명히 드러내는 이름, 그릇된 정보를 피하는 이름, 클래스·메서드 이름, 해법·문제 영역에서 가져온 이름, 의미 있는 맥락을 더하는 방법을 정리합니다.
클린 코드 3장을 읽고 함수를 작게 만들어 한 가지만 하게 하는 방법과 추상화 수준, switch 문, 함수 인수, 부수 효과, 명령과 조회 분리, try/catch 블록 분리를 예제와 함께 정리합니다.
클린 코드 4장을 읽고 주석이 나쁜 코드를 보완하지 못하는 이유와 코드로 의도를 표현하는 방법, 법적인 주석·결과를 경고하는 주석·TODO 주석·중요성을 강조하는 주석 같은 좋은 주석을 정리합니다.
클린 코드 5장을 읽고 파일 길이, 신문 기사 같은 위→아래 구성, 빈 행과 세로 밀집도, 수직 거리, 가로 공백 등 코드 형식을 잡는 기준과 팀 규칙의 중요성을 정리합니다.
클린 코드 6장을 읽고 자료 추상화, 절차적 코드와 객체지향 코드의 확장 방향이 반대인 자료/객체 비대칭, 기차 충돌 예제로 본 디미터 법칙을 정리합니다.
클린 코드 7장을 읽고 오류 코드 대신 예외를 쓰는 이유, try-catch-finally부터 작성하는 방법, checked 예외가 캡슐화를 깨는 문제, 외부 API 감싸기, 특수 사례 객체와 null을 반환하지 않는 방법을 정리합니다.
외부 패키지나 프레임워크를 사용할 때 생기는 경계 문제를, java.util.Map을 Sensors 클래스로 감싸 필요한 기능만 노출하는 예제로 정리합니다.
클린 코드 10장을 읽고 클래스 체계와 클래스를 작게 유지해야 하는 이유, 단일 책임 원칙, 응집도, OCP로 변경하기 쉬운 클래스, 인터페이스로 변경에서 격리하는 방법을 정리합니다.
클린 코드 11장을 읽고 시스템 제작과 사용의 분리, Main 분리, 추상 팩토리, 의존성 주입 개념을 예제와 함께 정리합니다.
클린 코드 11장 후반부를 읽고 시스템 확장과 횡단 관심사, 자바 프록시와 스프링 AOP 예제를 비교해 관심사를 분리하는 방법, POJO 시스템이 주는 기민함을 정리합니다.
클린 코드 학습을 11장까지 진행한 상황을 돌아보고, Spring 기초를 보완한 뒤 12장부터 이어가겠다는 계획을 정리합니다.
인프런 워밍업 클럽 백엔드 스터디 2기 1주차 회고로, 추상화와 이름 짓기, SOLID 원칙을 적용해 주문 검증 로직을 리팩터링한 과정을 정리합니다.