용로그
article thumbnail

UnsupportedOperationException가 뭐임 😅


기능 구현을 완료하고 ApplicationTest를 깔끔하게 통과하기를 바랬다. 어림도 없지.

Exception in thread "main" java.lang.UnsupportedOperationException

바로 UnsupportedOperationException.

처음에는 이게 뭔가 싶었다. 왜냐면 테스트코드가 아닌 내가 직접 실행시킬 때는 잘 동작하던 애플리케이션이 테스트케이스만 실패하니 말이다.

 

내가 테스트케이스를 잘못 만진 줄 알고 깃허브에서 그대로 복붙해와서 붙여봐도 같은 예외가 터졌다. 찾아보니 저 에러는 List 타입에 데이터를 저장, 삭제할 때 ArrayList로 초기화 해주어야 할 수 있는데, new로 생성하지 않은 List의 값을 변경하려고 해서 나는 에러였다.

 

List의 값은 분명 랜덤인데..

내가 알고 있는 요구사항으로는 가격을 입력한 뒤 랜덤으로 숫자가 반환되는데, 랜덤한 값을 생성, 삭제할 필요가 있을까? 라는 많이 무지한 생각을 했었다.

 

당연히 테스트케이스니 랜덤한 값을 직접 지정해줘야했고, 이는 List.of로 주어졌다. 그렇기에 랜덤한 수의 리스트를 반환하는 메서드에서 위에서 언급한 new 생성자로 생성한 후 반환해주어야 제대로 실행되었다.

 

이 이슈를 통해서 List를 new로 초기화하지 않으면 생성, 삭제가 불가능하다는 것을 알았다. 자료구조 공부좀 열심히 해야겠다..

@Test
    void 기능_테스트() {
        assertRandomUniqueNumbersInRangeTest(
                () -> {
                    run("8000", "1,2,3,4,5,6", "7");
                    assertThat(output()).contains(
                            블라블라~
                    );
                },
                List.of(8, 21, 23, 41, 42, 43),
                List.of(3, 5, 11, 16, 32, 38),
                List.of(7, 11, 16, 35, 36, 44),
                List.of(1, 8, 11, 31, 41, 42),
                List.of(13, 14, 16, 38, 42, 45),
                List.of(7, 11, 30, 40, 42, 43),
                List.of(2, 13, 22, 32, 38, 45),
                List.of(1, 3, 5, 14, 22, 45)
        );
    }

IllegalArgumentException 처리에 대해서


이 부분 정말 많이 헤맸던 것 같다. 우테코에서 제시한 바로, 예외상황에서는 IllegalArgumentException을 던지고 "[ERROR]" 메시지를 포함하라고 했었다.

 

하지만 나는 이 말을 

if (!inputMoney.matches(ONLY_NUMBER_REGEXP)) {
	throw new IllegalArgumentException(ERROR + ONLY_INPUT_NUMBER);
}

이렇게 알아들었다..

사실 우테코 말은 예외 상황시 IllegalArgumentException을 던지되, 그에 맞는 예외 처리를 한 후 메시지를 출력하는 것이었다.

 

우테코에서 추가로 온 이메일

나 말고도 다른 크루들이 많은 질문을 했던 모양이다. 우테코에서도 다시 한번 이메일을 보내며 상황에 대한 힌트를 제공하기도 했다. 여기서 말하는 로그란 메시지를 출력하는 것이다. (내가 처음 생각한 로그는 에러 그 자체..)

 

패키지 설계 구조


패키지 구조를 어떻게 설계할까에 대한 물음표는 아직도 완벽하게 해결되지 않은 상태이다. 그래도 이번 과제에서는 내가 평소에 개발하던 패키지 구조로 개발하면 클래스가 더 잘 분리될 것 같아서 한번 적용해봤다.

패키지 구조

패키지 구조를 애초에 도메인별로 나눠놓고 애플리케이션 전체 곳곳에서 필요한 클래스들은 global 패키지에 넣어놓은 모습이다. 각 도메인 안에서도 MVC를 지키고 있다.

 

아직까지도 이게 단순한 애플리케이션 개발이라는 것만 봤을 때 괜찮은 패키지 구조인지도 잘 모르겠다. 패키지 구조에 대해서도 많은 크루분들이 피드백을 주셨으면 좋겠다.

 

메서드명과 DecimalFormat에 대해서


뭔가 단락이 짧을 것 같아서 2개를 동시에 쓰려고 한다.

 

이번 과제에서는 특히 예외처리를 할 때 변수명에 숫자 관련 메서드명을 사용할 필요가 있었다. 하지만 숫자를 숫자 그 자체로 적을지, 영어로 바꿔서 적을지가 고민되었었다.

 

처음에는 영어로 바꿔서 적는게 가독성 자체는 좋다고 생각했지만, 생각해보면 1000(thousand)같이 긴 단어가 오면 오히려 보기 불편할 수 있다고 생각했다.

 

그래서 일단 메서드명을 지을 때 숫자 그 자체를 사용하기는 했지만, 이런 부분은 계속 생각해볼 필요가 있다고 생각한다. 이 외에도 아직까지 메서드명에 2단어 컨벤션은 약간 지키기 힘든 경향이 있었다. (더 노력해야죠..)

 

그리고 숫자를 출력할 때 0 3개를 단위로 ,(쉼표)를 출력해야 했는데, 이를 해결하기 위해서 처음에는 Enum클래스에 당첨 금액 자체를 String 타입으로 주기도 했었다.

 

하지만 String 타입으로 선언하니 생산성이 너무 떨어져서 정수형으로 바꿨다. 그러니 쉼표를 출력하는데에 있어서 로직이 몇 단계 더 생기면서 하나의 작업에 대해 코드가 너무 많아지는 것 같았다.

 

그래서 뭔가 방법이 없을까 알아보다가 자바에서 DecimalFormat이라는 기능을 제공해주었다!! DecimalFormat 클래스는 내 마음대로 String 타입에 커스텀을 할 수 있게 해주었는데, 아래와 같이 사용할 수 있었다.

 

DecimalFormat

DECIMAL_FORMATTER 상수에 대한 문자열은 다음과 같다.

이런 기능들은 자바에서 제공해 주는 기능인지 먼저 알아보고 적용해봐야겠다는 생각이 들었다.

 

3주 차 소감


프리코스가 벌써 반 이상 지나가고 끝을 보고 있다. 이번 3주 차 과제는 나에겐 정말 시간을 내서 하기 힘든 과제였다.

 

하필 우테코 프리코스 진행기간에 학교에서 싱가포르를 다녀와야해서 6박 8일 동안 싱가포르국립대에서 수업만 듣다 왔다. 그래서 그런지 호텔, 비행기 당연하고 놀이공원에서까지 과제를 했다. 

 

싱가포르까지 가서 코딩했다고 불평불만하는게 아니다. 오히려 싱가포르에서 코딩하는게 제일 재밌는 시간이었던 것 같다. 나름 정말

공을 많이 들인 3주 차 과제였기에 4주차 과제를 받기 전에 회고도 쓰고, 크루들에게 더욱 열심히 리뷰를 받아보려고 한다.

 

바쁜 일과를 보낸 일주일 속에서도 나에겐 우테코가 가장 중요했고, 내가 열심히만 한다면 가파르게 성장할 수 있는 지름길이라고도 생각했다.

 

지금 생각해도 이번 일주일 후회없이 보냈다. 이젠 하루라도 공부(프로그래밍)을 안하면 뭔가 불안하다. 강박 아닌 강박이 생겼지만 오히려 좋다고 생각한다. 이렇게 꾸준히 공부해야 내가 원하는 아웃풋이 나오는게 아닐까.

 

남은 프리코스도 다른 크루들이랑 더욱더 성장하는 나를 보면 좋겠다.

 

오랫동안 꿈을 그리는 사람은 마침내 그 꿈을 닮아 간다. -앙드레 말로

 

profile

용로그

@용로그

벨덩보단 용덩 github.com/wonyongChoi05