
안녕하세요 거의 4개월만에 돌아온 우기의 취준일기입니다. 자바에 관련해서는 조금은 가볍게 시작해서 무겁게 블로그를 마쳤으면 좋겠습니다. 이번에 저희가 고민해야될 부분, TDD 라고들 하죠? Test Code, Refactoring을 알아보는 시간을 가졌으면 좋겠습니다. 예시를 통해서 한번 알아가보도록 했음 좋겠습니다.
❤ Production Code와 Test Code의 분리

자! 여러분들 실제로 서비스를 담당하는 Production 코드를 가져오게되었습니다. 이 코드가 정상적으로 작동하기위해선 main()이 있어야할겁니다. 하지만 일반적으로 실 서비스를 제공하는 코드와 실 서비스를 Test하는 코드가 따로 있어야하지 않을까요?
맞습니다. 저 코드가 만일 Test 코드라면 서비스하는 시점에서 같이 사용할 필요는 없다고 생각합니다.
일단 Test Code와 Production 코드로 서로 분리해보겠습니다.
❤ Test Code의 변화, 하지만 무언가 이상하다..!

Test Code 를 분리하여 각 메소드화까지 진행했습니다. 이는 Production 코드에 존재하는 메소드를 같이 사용하지않는 장점이 존재합니다. 하지만 프로그래밍을 할때는 한번에 메소드 하나의 구현에 집중해야합니다. 즉, 클래스가 가지고있는 모든 메소드에 관심을 가지지않고 자신이 테스트할 메소드에만 집중을 하는것이 옳습니다. 하지만 위 테스트코드는 모든 테스트를 진행해야하거나 주석처리를 해야하는 불편한 작업을 진행해야합니다.
또한 테스트 결과를 매번 수동으로 확인해야하는 불편함이 있습니다. 5+3 = 8 이라는 결과값에 대해서 8 이라는 부분은 프로그램이 옳고 그름을 판단하는것이 아닌 프로그래머가 직접 옳고 그름을 판단해야 한다는것입니다. 결국, 코드가 복잡해지면 일일이 확인해야 하며 프로그래머의 실수가 묻어나올 수 밖에 없는 구조를 가지고있습니다.
❤ JUnit, 혜성같이 나타난 당신 누구신가요?
앞서 나온 Test Code의 단점을 극복할수있는 라이브러리가 존재합니다 바로 JUnit! 입니다.
프로그래머가 관심을 가지는 메소드에 대한 테스트만 가능하며 결과값 확인을 프로그래밍을 통해 자동화하는것이 가능합니다.

JUnit에 생소한 사람들에게 지식을 조금 공유해보겠습니다.
@Before : Test의 초기화을 위해서 사용하는 Annotation, @RunWith, @Rule에서 초기화된 객체에 접근할수있는 제약사항을 @Before을 통해서 해결할수도 있다는 장점이 존재합니다
@After: 각각의 테스트 메서드가 실행된 후에 실행되는 메서드를 정의합니다.
@BeforeClass: 모든 테스트 메서드가 실행되기 전에 한 번 실행되는 메서드를 정의합니다.
@AfterClass: 모든 테스트 메서드가 실행된 후에 한 번 실행되는 메서드를 정의합니다.
@Test: 단위 테스트를 수행하는 메서드를 정의합니다.
@Ignore: 해당 테스트 메서드를 실행하지 않습니다.
@RunWith: JUnit 테스트 실행 방법을 지정합니다.
@Parameterized: 매개변수화된 테스트를 수행할 수 있도록 합니다.
@Test(expected = SomeException.class): 해당 테스트가 특정 예외를 발생시켜야 함을 나타냅니다.
@Test(timeout = 1000): 해당 테스트가 특정 시간 안에 실행되어야 함을 나타냅니다.
@TestConfiguration: 테스트 설정을 지정하는 클래스임을 나타냅니다.
이와 같이 매번 초기화, 후처리 작업을 통해 각 테스트 간에 영향을 미치치 않으면서 독립적인 실행이 가능하도록 지원하는 장점이 존재합니다.
❤ 글을 마무리하며, 느낀 점
글을 쓰다보니 Test Code를 왜 사용하는가? 인것보단 Test Code를 사용했을때 장점을 조금 나열했던거 같습니다.
하지만 Prodcution Code와 Test Code의 분리이유를 배울수 있었고, 이 때문에 가독성과 편리함이 증가했다고 생각합니다. 또한 저번 프로젝트를 진행했을때 Test Code를 무작정 작성했던 경험이 존재합니다. 과거의 잘못을 경험삼아 이번 기회에 블로그 포스팅을 할수있어서 기분이 좋습니다. 프로그래머가 관심을 가지는 코드에 대해서 테스트를 하는것이 먼저고, 다른 코드의 개연성을 줄이는것과 더불어 수동으로 확인해야했던 결괏값들을 자동화 하는것이 프로그래머의 도리? 라고 생각하고있습니다.
왜 ? 라고 생각했을때 장점부터 찾아보고 원본과 비교를 많이 보는 연습을 해야한다고 생각합니다. 새로운 기술을 배울수록 개발에대한 발전은 더욱 더 클것입니다 !
전 다음에 Test Code을 사용하면서 왜 Refactoring을 해야하나? 라는 주제로 다시 돌아오겠습니다.