✍️ 악취 8 : 산탄총 수술 코드에 변경이 생겼을 때 관련 있는 여러 모듈 혹은 클래스 혹은 메서드를 수정해야 한다면 코드의 응집도는 낮고 결합도는 높은 상황일 가능성이 높다. 따라서 이런 현상이 발견된다면 관련 있는 데이터를 한 곳으로 옮겨서 응집도를 높이고 책임을 명확히 분리해서 결합도를 낮출 필요가 있다. 여기 낮은 응집도와 높은 결합도의 산탄총 악취를 해결하기 위한 세 가지 리팩토링 기법이 있다. 1. "함수 옮기기, 필드 옮기기" 필요한 변경 내역을 하나의 클래스로 모으기 2. "단계 쪼개기" 공통으로 사용되는 메서드의 결과물을 하나로 묶기 3. "함수 인라인, 클래스 인라인" 흩어진 로직을 한 곳으로 🍊 필드 옮기기 좋은 데이터 구조를 가지고 있다면, 해당 데이터를 기반한 행위를 메서드로 작..
✍️ 악취 7 : 뒤엉킨 변경 좋은 코드는 응집도는 높고 결합도는 낮아야 한다. 응집도는 관련 있는 데이터 혹은 기능이 한 곳에 잘 밀집되어 있는가를 말하고, 결합도는 상호간 의존하는 정도를 의미한다. 가령 서로 연관이 없는 A, B 모듈이 수정됐을 때, 양쪽에서 모두 C 모듈의 수정을 요구한다면 응집도가 낮고 결합도는 높다고 할 수 있다. 이처럼 한 모듈이 여러 가지 이유로 수정되어야 한다면 역할이 제대로 나눠지지 않았을 수 있다. 서로 다른 문제는 서로 다른 모듈에서 해결해야 한다. 뒤엉킨 변경을 해결하기 위한 세 가지 리팩토링 기법이 있다. 1. "단계 쪼개기" 서로 다른 문맥의 코드를 분리 2. "함수 옮기기" 적절한 모듈로 함수를 옮기기 3. "클래스 추출하기" 모듈이 클래스 단위라면 🍊 단계 ..
✍️ 서론 논리적으로 연관된 상수를 정의할 때 사용하는 자료형 enum. enum은 심볼릭하게 그 자체로도 의미를 가지지만 필요에 따라 필드를 추가하거나 메서드를 추상화해서 enum이 책임질 수 있는 코드를 구현할 수 있다. 🍊 simple enum enum의 가장 단순한 사용법으로 보통 상태 값이나, 분기를 위한 플래그로 사용된다. public enum Operator { PLUS, MINUS, MULTIPLY, DIVIDE; } public class Calculator { public double calculate(double a, double b, Operator op) { if (op == Operator.PLUS) { return a + b; } else if (op == Operator.MI..
✍️ 서론 이벤트의 콜백 메서드를 인터페이스의 추상 메서드로 정의하고, 이벤트에 관심 있는 클래스는 콜백 인터페이스를 구현함으로써 간단한 Listener를 만들 수 있다. 예제 코드로 이해해 보자. 여기 Member의 가입 로직이 포함된 MemberService가 있고, @Service public class MemberServiceImpl implements MemberService { @Autowired private MemberDao memberDao; @Override public void join(int memberId, String name) { Member exist = memberDao.get(memberId); if (exist != null) throw new RuntimeExcepti..
✍️ 악취 6 : 가변 데이터 자바는 변수의 값을 변경하거나, 레퍼런스 변수로 인스턴스의 값을 변경할 수 있다. 이처럼 데이터의 변경이 자유로운 장점도 있지만, 데이터 변경으로 문제가 생기는 경우가 발생한다. 가령 일부 메서드에선 데이터의 변경이 올바른듯하지만 다른 메서드에선 데이터의 변경이 곧 예상치 못한 에러로 이어지는 경우가 있다. 가변 데이터가 유발하는 잠재적 리스크를 최소화하는 여 섯 가지 리팩토링이 있다. 1. "변수 쪼개기" 여러 데이터를 하나의 변수로 관리하지 않기 2. "질의 메서드와 변경 메서드 분리하기" 사이트 이펙트가 있는 메서드와 없는 메서드를 분리 3. "세터 제거하기" 필요한 경우에만 세터를 만들기 4. "파생 변수를 질의 메서드로" 계산해서 알아낼 수 있는 값이라면 변수가 아..
✍️ CompletableFuture in loop 다수의 쓰레드를 만들고, 반복된 작업을 비동기적으로 여러 번 수행하고, 수행 결과를 집계하는 코드를 작성해야 할 때가 있다. 가령 뽑기와 같은 확률 로직이 포함된 서비스의 테스트 코드 작성 시에 이와 같은 니즈가 발생한다. 이때 CompletableFuture를 사용하면 비동기 작업과 콜백 메서드를 매우 쉽게 정의할 수 있다. 아래 코드는 반복문 내부에서 CompletableFutre를 만들어 비동기적으로 작업을 수행해서 결과를 반환하고 콜백 메서드에서 결과를 집계하는 샘플 코드이다. public class ParallelAdder { private List synchronizedList = Collections.synchronizedList(new A..