본문 바로가기

우아한테크코스 4기48

[Java] Java 예외처리와 StackOverFlow 인테리어 커머스 플랫폼 인턴 면접을 보며 "StackOverFlow는 왜 발생하나요?" 라는 질문을 받았습니다. 저는 정말 단순하게 메모리가 초과했기 때문입니다. 라고 답변했으나 아마 이는 썩 만족스럽지 못한 대답이었을 것입니다. 오늘은 그날의 기억을 되돌리며 StackOverFlow라는 에러를 알아보고 이어서 Java가 어떻게 예외를 처리하는지 살펴보고자 합니다. StackOverFlow StackOverFlow는 VM에서 런타임 시점에 발생시키는 에러로 application이 너무 깊이 재귀를 할 때 발생하는 에러입니다. 아니 그런데 왜 이름이 RecurseTooDeepError 이런게 아닌가요? 이렇게 이름이 생긴 이유는 Java의 메모리 구조를 통해 유추해 볼 수 있습니다. Java에서 인자나 지.. 2022. 2. 21.
[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.