이제 0.0 버전을 점차 개선해나가보려 한다. 따라서 리팩토링을 해보았다.
1. 리팩토링
(1) 클래스 분리
Application 클래스 안에 구현했던 코드를 개선해보고자 클래스를 분리했다. SOLID 원칙 중 하나인 SRP(단일 책임 원칙)를 따르고자 했기 때문이다. 또한 '좋은 코드, 나쁜 코드'에 따르면 클래스는 자신의 기능에만 충실해야 한다. 따라서 입력, 출력, 계산 기능에 맞게 클래스를 세분화 했다.
(2) 클래스 네이밍
구글 자바 스타일 가이드에 따르면 클래스 명은 명사 또는 명사구로 작성해야 한다. 따라서 InputHandler, OutputHandler, Calculator로 네이밍 했다.
https://github.com/JunHoPark93/google-java-styleguide
(3) 입/출력 기능을 위해 흔히 사용했던 Scanner는 Util 라이브러리 내에 위치한다. 따라서 입/출력을 위한 클래스를 동일하게 utility로 봐야할지, handler로 봐야할지 고민되었다. 이에 몇가지 질문을 던져보았다.
- 반복적으로 사용되는 메서드로 구성되어 있는가? No
- 잦은 수정을 요하는가? No
- 정적(static) 메서드로만 구성되어 있는가? No
1주차 미션의 요구사항에서는 입/출력 기능은 1번씩만 사용되었다. 또한 해당 클래스가 정적 메서드로만 구성되어 있지 않다. 반면에 Handler에 대해 찾아보니 Handler는 Manager 역할을 하는 존재다. 따라서 이번 주차에서는 입/출력 기능을 Handler의 역할로서 분리했다.
2. 테스트
(1) @Test 어노테이션의 역할
@Test가 붙은 메서드는 JUnit에 의해 테스트 메서드로 인식되어 실행된다. JUnit이 @Test 어노테이션을 감지하면 테스트 프레임워크가 해당 메서드를 자동으로 실행하고 결과를 기록한다.
@Test
public void test() {
}
(2) @Test 동작 원리
JUnit 프레임워크가 테스트 메서드를 실행하는 과정은 아래와 같다.
1) 테스트 클래스 로드 및 인스턴스화
JUnit은 테스트 클래스에 포함된 모든 @Test 메서드를 찾고, 테스트 실행을 위해 이 클래스의 새 인스턴스를 생성한다.
2) @BeforeEach 또는 @BeforeAll 메서드 실행
테스트 환경을 미리 설정하기 위해 필요한 초기화 작업이 있다면, @BeforeEach(각 테스트 전에 실행) 또는 @BeforeAll(모든 테스트 전에 한 번만 실행) 어노테이션을 사용할 수 있습니다.
3) @Test 메서드 실행
JUnit이 @Test가 붙은 메서드를 실행합니다. 각 테스트는 독립적으로 수행되어야 하므로, 테스트 메서드가 공유 상태를 사용하지 않도록 관리해야 합니다.
4) 결과 확인 및 Assertion
테스트 메서드 내에서는 assertEquals, assertTrue 등 다양한 assert 메서드를 통해 예상 결과와 실제 결과를 비교하여 테스트가 통과했는지 확인합니다. Assertion이 실패하면 테스트는 실패로 기록됩니다.
5) @AfterEach 또는 @AfterAll 메서드 실행
테스트가 끝난 후 정리 작업이 필요한 경우 @AfterEach(각 테스트 후 실행) 또는 @AfterAll(모든 테스트 후 한 번만 실행) 어노테이션을 사용합니다.
(2) 그렇다면 테스트를 왜 작성해야 하는가?
'좋은 코드, 나쁜 코드'에 따르면 코드가 처음 작성될 때, 그리고 수정될 때마다 코드가 의도한대로 작동한다는 것을 스스로 확신할 수 있는 방법이 필요하다. 또한 테스트는 이러한 확신을 하기 위한 주된 방법이라고 한다.
(3) 그래서 어떻게 작성했는가?
각 테스트 내에 있는 메서드의 네이밍을 한글로 지정해 메서드가 이행하는 역할이 무엇인지 알아보기 쉽게 표현했다. 또한 '좋은 코드, 나쁜 코드'에 따르면 기능뿐만이 아닌 동작을 테스트하라고 한다. 따라서 각 기능별 여러 개의 테스트 케이스를 통해 기능이 아닌 동작을 테스트 할 수 있도록 구현했다.
public class CalculatorTest {
private final Calculator calculator = new Calculator();
@Test
void 기본_구분자_분리() {
int result = calculator.separateInput("1,2,3");
assertEquals(6, result);
}
@Test
void 기본_구분자_여러개_분리() {
int result = calculator.separateInput("1,2:3,4");
assertEquals(10, result);
}
@Test
void 커스텀_구분자_분리() {
int result = calculator.separateInput("//;\\n1;2;3");
assertEquals(6, result);
}
@Test
void 음수_예외처리() {
Exception exception = assertThrows(IllegalArgumentException.class, () -> {
calculator.separateInput("1,-2,3");
});
assertEquals("음수는 허용되지 않습니다: -2", exception.getMessage());
}
}
'우아한테크코스 > 7기 프리코스' 카테고리의 다른 글
[우아한테크코스 7기 프리코스] 3주차 회고록 (0) | 2024.11.06 |
---|---|
[우아한테크코스 7기 프리코스] 2주차 회고록 (3) | 2024.10.28 |
[우아한테크코스 7기 프리코스] 1주차 회고록 (2) | 2024.10.22 |
[우아한테크코스 7기 프리코스] 첫째주 2일차 회고록 (0) | 2024.10.16 |
[우아한테크코스 7기 프리코스] 첫째주 1일차 회고록 (0) | 2024.10.15 |