본문 바로가기

전체 글58

[Java] Enum타입 사용하기 다음 주부터 진행되는 로또 미션의 프로그래밍 요구사항에는 java enum을 적용해 프로그래밍을 구현한다. 라는 내용이 있습니다. 이번 포스팅에서는 enum 타입이 무엇이고, 어떻게 사용할 수 있을지 직접 코드로 작성해보는 시간을 갖고자 합니다. Enum을 사용하지 않으면 불편한 점? 왜 enum 을 사용해야 하는지 알아보기에 앞서 과거 enum을 모르던 시절 사용자 입력값에 대한 선택지를 변환하여 특정 로직을 실행시키던 코드를 살펴봅시다. 로직 실행에 큰 문제는 없어보입니다만.. 사용하는 측면에서 문제가 많습니다. 선택지가 변경되어 Yes가 1이 아닌 Hell Yes!! 가 1이 된다면? selection 비교시 실수로 1이 아닌 100을 비교하는 코드가 있다면? 이렇게 상수를 열거형으로 사용하게 되면.. 2022. 2. 19.
[Java] Mockito를 사용하여 TDD 적용해보기 최근 우아한 테크 코스 교육 입과 선물(?)로 배민 5000원 쿠폰을 받았습니다. 감사하게도 쿠폰을 받았는데 가만히 있을 수 없죠. 이 쿠폰이 생성되는 과정을 Mockito를 사용하여 TDD 적용해보겠습니다. 물론 실제처럼 작성하려 하면 굉장히 복잡할테니 엄청난 축약 버전으로 코드를 작성해보고자 합니다. 본문을 시작하기 앞서 왜 Mocking을 하는 것일까요? 실제로 개발을 할 때는 다른 팀, 외부 관계사 등등 다양한 포인트로 요청을 보낼 것입니다. 그런데 테스트 코드를 작성할 때 각 실제 포인트로 요청을 보내야 할까요? 저는 아니라고 생각합니다. 갑작스런 전사휴가(?) 혹은 점검으로 응답을 받지 못하는 등 이유가 있겠죠 ㅋㅋ. (반박 댓글점 부탁드립니다 ㅋ) 그래서 대역을 사용하는 것이고 그 중에서도 .. 2022. 2. 17.
[Java] JUnit으로 System.in, System.out 테스트하기 deep dive 레벨 1 미션 레이싱카는 콘솔을 기반으로 진행됩니다. 1단계를 진행하며 작성한 단위 테스트에서는 입, 출력값을 테스트 할 필요가 없었지만 2단계 미션인 MVC리팩토링 과정에서는 컨트롤러를 테스트하는 방법에 대해 많이 고민하게 될 텐데요. 이번 포스팅에서는 입, 출력값에 대한 테스트를 추상클래스로 작성하여 상속을 통해 실제 테스트가 진행되는 코드를 깔끔하게 유지하면서 I/O를 테스트 할 수 있는 코드를 작성해보고자 합니다. Scanner 와 System.in 먼저 테스트를 진행하기 위해서는 사용자가 원하는 입력값을 입력해야 합니다. 이번 미션의 프로덕션 코드에서 아래 예시처럼 Scanner 인스턴스를 System.in 인자로 생성 했을텐데요. Scanner scanner = new Scanner(Syste.. 2022. 2. 16.
[Java] 대역으로 Junit 테스트 코드 작성하기 지난 포스팅에서 Random 값을 테스트 할 수 있는 StubNumberGenerator 를 만들어 간단하게 테스트를 진행해보았다. 이번 포스팅에서는 레벨 1 미션의 랜덤값에 의한 테스트를 자유자재로 할 수 있는 스텁 객체를 만들고자 한다. Stub 이란? Stub이란 구현을 단순한 것으로 대체한 것이다. 테스트에 맞게 단순히 원하는 동작을 수행해준다. 대역 테스트에는 실제 동작을 구현하는 Fake, 호출된 내용을 기록하는 Spy, 기대값을 반환 받는 Mock이 있다. 이번 테스팅은 단순히 원하는 동작을 수행해준다는 의미에서 Stub이라고 접두사를 붙였다. 처음 Stub 객체를 작성할 때는 내가 작성한 테스트가 동작하기 위한 객체를 만들었다. public class StubNumberGenerator i.. 2022. 2. 15.
[Java] 인터페이스로 분리하여 객체 테스트하기 level 1 첫 미션으로 프리코스에서 진행한 racingGame 을 페어 프로그래밍으로 구현하는 미션을 받았다. TDD로 구현하라는 미션덕분에 많은 크루들이 Random 값을 테스트하는 방법, System.in을 테스트하는 방법에 대해 궁금증을 품었고 그 중에서도 Random 값에 대한 테스트에 어려움을 겪었던 것 같다. 내 코드와 리뷰 나는 과거 Mockito를 사용한 경험이 있어 Mockito 라이브러리를 가져와 임의의 랜덤값을 제공하는 가짜 객체를 만들어 테스트 했다. MockRandomGenerator Random 값을 가짜로 전달해줄 수 있는 임의의 추상 클래스를 생성하여 상속받아 테스트했다. public abstract class MockRandomGenerator { MockedStatic.. 2022. 2. 13.
3-2 프로세스 관리 지난 포스팅에 이어 프로세스 관리에 대해 공부한 내용을 적어보고자 한다. 1. 인터럽트 인터럽트란 외부에서 발생한 예상치 못한 이벤트이다. 나를 프로세서, 운영체제 공부를 프로세스라고 가정해보자. 도서관에서 나는 운영체제 공부를 열심히 하고있다. 갑자기 친구(인터럽트) 가 찾아와 내게 아는 척한다. 나는 운영체제 공부를 멈추고 해당 페이지에 펜을 올려놓은 뒤 친구를 쳐다본다. 친구는 내게 네트워크 스터디(새로운 프로세스) 를 하러 가자고 한다. 나는 공부하고 있던 운영체제 책의 100p를 접어놓고 지난 스터디에 이어 네트워크 4강을 함께 공부하러 떠난다. 시간이 흘러 다시 자리에 앉아 100p부터 운영체제 공부를 시작한다. 위 과정을 인터럽트가 발생, 처리되는 과정이라고 할 수 있다. 프로세스는 인터럽트.. 2022. 1. 7.