자바 웹 프로그래밍 Next Step - 2장 문자열 계산기

들어가며

 

https://rawshrimpsushi.tistory.com/30

 

자바 웹 프로그래밍 next-step을 읽고

1. 들어가며 실전적으로 리팩토링, OOP에 맞는 코드를 짜보는 경험을 하게 해주는 책은 흔치 않습니다. 이론적으로 객체지향을 접근하거나 여러 디자인 패턴들을 소개시켜주면서 코드를 짜는 책

rawshrimpsushi.tistory.com

 

위 글에서 작년 Best 책으로 꼽았던 자바 웹 프로그래밍 Next-step을 단원 별로 정리하겠다고 했는데 그 일환입니다. :)

 

모든 단원을 정리하지는 않을 예정이고 실습하면서 인상깊고 꼭 기록에 남기고 싶었던 단원들만 위주로 기록할 예정입니다.

 

2장 - 문자열 계산기 구현

 

뒤에 불지옥 리팩토링...이 기다리고 있는 것에 비해 정말 부드러운 내용으로 시작합니다. 간단한 java 문법만으로 짤 수 있는 요구사항을 만족시키면 됩니다.

 

2. 1 요구사항

문자를 구분자로 분리한 후 각 숫자의 합을 반환해야 한다.

쉼표 또는 콜론을 구분자로 가지는 문자열을 전달하는 경우 구분자를 기준으로 분리한 각 숫자의 합을 반환한다.
앞의 기본 구분자 외에 커스텀 구분자를 지정할 수 있다. 커스텀 구분자는 문자열 앞 부분의 "//"와 "\n" 사이에 위치하는 문자를 커스텀 구분자로 사용한다.

예를 들어 "//;\n1;2;3;"과 같이 값을 입력할 경우 커스텀 구분자는 세미콜론이며 결과 값은 6이 반환되어야 한다.문자열 계산기에 음수를 전달하는 경우 RuntimeException으로 예외 처리 해야 한다.

 

요구사항에 따라 제가 구분한 입력 케이스는 다음과 같습니다.

 

1. 기본 구분자를 통한 입력

2. 커스텀 구분자를 통한 입력

3. input이 없는 경우

4. 음수 입력(예외)

  4.1 커스텀 구분자가 -가 아닌데 -1과 같은 숫자가 주어진다.

  4.2 커스텀 구분자가 -이고 --1과 같은 숫자가 주어진다.

5. 커스텀 구분자에서 정의되지 않았는데 콜론과 콤마를 사용하지 않은 다른 문자가 등장 (예외)

 

그리고 현재 요구사항에는 정의되지 않았지만 추후에 다른 입력 요구사항이 나올 수 있다고 가정하고 코드를 작업하였습니다.

 

2. 2 구현

 

그래서 저는 각 역할을

 

입력 구분 -> 파싱 -> 합 구하기.

 

이렇게 나누었습니다.

 

입력 구분에서는 각 입력을 받아 구분된 입력 유형 중 어느 곳에 매칭되는지 파악해줍니다. 매칭을 위해서 정규식을 사용하였습니다.

 

 

 

Input Delimiter class들은 InputStrategy interface를 구현하고 있습니다. InputStrategy interface는 해당 input이 현재 타입인지 구분해주는 isType과 해당 타입일 경우 Delimiter와 Input을 가져올 수 있게 하고 있습니다. 이는 전략 패턴을 사용하기 위함입니다. 위에서 새로운 Input 전략이 들어올 수 있다고 가정하고 코딩하였고 그럴 경우 기존 코드를 최대한 변경하지 않는 선에서 기능 추가를 하고 싶었습니다. 위처럼 구현한다면 새로운 Input 유형 기능 추가를 해야할 때 해당 Input 유형을 구분해주는 Input Delimiter class를 추가해준 뒤 inputStrategies에 추가만 해주면 됩니다. inputStrategies는 DI를 통해 외부에서 주입받고 있습니다. 어떤 전략을 사용할 지 정하는 객체를 만들어 넣어주거나 Spring MVC에서 빈 컨테이너가 해주듯 싱글턴으로 만들어 주입해주는 방법을 사용할 수도 있습니다.

 

그 뒤엔 Input을 전략에 따라 parsing해 준 뒤 덧셈을 수행하면 됩니다. 그리고 InputType 유형에 맞지 않는 경우 어떤 InputDelimiter의 정규식과도 매칭되지 않을테니 간단히 error를 return하면 됩니다.

 

 

음수 처리의 경우 String input을 int 값으로 각각 parsing하는 Integer.parseInt를 wrapping 하여 음수인지 검증하는 로직을 더하였습니다. 음수인지 검증하는 로직을 어디 넣을지 고민을 많이 했는데 덧셈보단 해당 수가 어떤 수인지 다룰 수 있는 Parser 도메인에서 다루는 것이 맞다고 판단하였습니다.

 

2. 3 개선할 점

빈 컨테이너를 만들어 DI를 주입해주는 코드까지는 과하다고 생각하여 구현하지는 않았습니다. 김영한님께서 강의에서 언급해주셨듯이 영화 배역을 정하는 이들이 따로 있는 것이 자연스럽기 때문에 DI를 관리하는 클래스는 있는 것이 좋다고 생각합니다. 하지만 추후에 11~13 장에서 해당 내용을 직접 구현해보기도 하기 때문에 생략하였습니다. :)

 

모든 코드는 아래에서 확인할 수 있습니다.

 

https://github.com/SHEOMM/BanranBook/tree/master/StringCalculator