✍️ 악취 5 : 전역 변수(전역 데이터) 전역 변수, 가령 자바의 public static 변수는 어플리케이션 전반에 걸쳐서 접근하고 수정할 수 있기에 어느 위치에서 값이 참조되고 수정되는지 파악하기 어렵다. 이건 비단 전역 변수만의 문제가 아니라 클래스 필드도 그러하다. 클래스 필드가 외부에 public하게 노출되어 있다면 필드의 상태 변경을 파악하기 어려워진다. 전역 데이터를 위해 리팩토링을 활용할 수 있다. 1. 변수 캡슐화하기 🍊 변수 캡슐화하기 전역 변수와 클래스의 필드가 외부에 public하게 노출되어 참조 위치가 많아지면 상태 값을 추적하기 어렵다. 가령 단순 읽기 위해 변수를 참조했는지 값을 변경하기 위해 참조했는지 파악하기 어렵다. 게다가 변수에 값을 직접 할당하면 값에 대한 검증이 불..
✍️ 악취 4 : 긴 매개변수 목록 메서드의 매개변수가 많을수록 함수의 역할을 이해하기 어렵다. 고려해 볼 사항으로 과연 그 메서드가 한 가지 일을 하고 있는 게 맞는지, 불필요한 매개변수는 없는지, 논리적으로 그룹핑할 매개변수 목록은 없는지 검토해야 한다. 긴 매개 변수 목록을 위해 네 가지 리팩토링을 활용할 수 있다. 1. "매개 변수를 질의 함수로 바꾸기" 만약 어떤 매개변수를 다른 매개변수를 통해 알아낼 수 있다면 2. "플래그 제거하기" 매개 변수가 플래그로 사용된다면 3. "객체를 통째로 넘기기" 기존 자료구조에서 세부적인 데이터를 가져와서 플랫하게 넘기는 대신 4. "그룹핑해서 매개변수 객체 만들기" 일부 매개변수들이 반복적으로 넘겨진다면 🍊 매개 변수를 질의 함수로 바꾸기 메서드의 매개변수..
✍️ 악취 : 긴 함수 메서드가 너무 길다면 가독성이 떨어지고 짧은 메서드는 읽는 이로 하여금 많은 문맥 전환을 요구한다. 대부분의 상황에서 너무 긴 메서드는 의도를 파악하기 어렵기 때문에 짧은 메서드에 비해 리팩토링 우선순위가 높다. 긴 메서드를 위해 세 가지 리팩토링을 활용할 수 있다. 1. 함수 추출하기 (임시 변수를 질의 함수로, 매개변수 객체 만들기, 객체 통째로 넘기기, 함수를 명령으로 바꾸기) 2. 조건문 분해햐기 3. 반복문 쪼개기 🍊 함수 추출하기 1. 임시 변수를 질의 함수로 변수를 활용하면 반복되는 동일한 계산을 피할 수 있고 변수의 이름으로 의미를 표현할 수도 있다. 하지만 메서드를 추출할 때 변수는 걸림돌이 될 수 있다. 이때 변수도 마찬가지로 별도의 메서드로 추출한다면 기존에 추..
✍️ 악취 : 중복 코드 일반적으로 완전히 동일하거나 비슷한 코드를 중복 코드라고 한다. 중복 코드는 몇 가지 치명적인 문제를 가지고 있는데 코드를 읽는 사람 입장에서 비슷한 코드인지 유사한 코드인지 주의 깊게 읽어야 하며, 코드가 변경되면 동일한 모든 코드가 변경되어야 한다. 중복 코드를 위해 세 가지 리팩토링을 활용할 수 있다. 1. 함수 추출하기 2. 코드 정리하기 3. 메서드 올리기 악취 가득한 코드 @AllArgsConstructor @Getter public class Customer { private int id; @Setter private String name; @Setter private String address; } @Getter public class CustomerReposito..
✍️ 악취 : 이해하기 힘든 이름 깔끔한 코드에서 가장 중요한 것은 좋은 이름이다. 좋은 이름을 위해 크게 세 가지 리팩토링을 활용할 수 있다. 1. 함수 선언 변경 2. 변수 이름 변경 3. 필드 이름 변경 악취 가득한 코드 @AllArgsConstructor @Getter public class Person { private String name; private int age; } @Getter public class CustomerRepository { private static int sequenceId = 1; private List names = new ArrayList(); private List ages = new ArrayList(); private List ids = new ArrayL..
✍️ Argument Resolver, 아규먼트 리졸버 개념 Argument Resolver란, Client가 요청한 Request로부터 값을 참조하거나 객체를 생성해서 Handler(Controller)의 파라미터에 바인딩 할 때 사용하는 객체이다. 가령, 로그인 인증을 마친 Client가 Server로부터 자신의 UserId가 기입된 인증용 Token을 발급받았다고 가정해 보자. Client는 Request를 보낼 때마다 인증의 일환으로 Token을 보낼 것이고, Server는 유효한 토큰인지 검증을 거친 후 (필요에 따라) 토큰에 저장된 UserId를 꺼내서 Client의 요청을 처리할 것이다. Argument Resolver 없이 단순 User 조회 Controller는 다음과 같이 세 단계에 걸..