[우테코 7기] 백엔드 프리코스 1주 차 회고

728x90
  자바를 이용해 프로그램을 처음 만들다 보니 긴장도 많이 했고,
모르는 것이 많아 검색하며 알아가는 데 많은 시간을 투자한 1주 차였다ㅠㅜㅜㅠ


 

🔥내가 제출한 코드 풀이 🔥

 

[TDD] 문자열 덧셈 계산기 TDD 방식으로 구현하기!

> TDD(Test Driven Development) 개발 방식이란? - 테스트 코드를 먼저 작성하여 프로그램이 잘못됐다는 것을 증명하고, 이를 고쳐나가면 프로그램을 개발해 나가는 개발 방법론=> 잘못된 점을 찾고 수정

tyulsjjava.tistory.com

 



🔆 TDD 방식 사용하며 느낀 장점들!


 문제를 설계하며 처리해야 할 예외 케이스들이 예상보다 많다는 것을 깨닫고, 이에 따라 테스트 코드를 먼저 작성하는 TDD 방식을 적용해 보기로 결심했다. 자바도, TDD도 처음이었기 때문에 며칠 동안은 TDD 방식을 적용한 자바 코드를 읽고 익히는 데 집중했다. 어느 정도 흐름을 이해한 후 간단한 질문들을 기반으로 테스트 코드를 작성하고, 그 코드를 초록불로 만들며 하나씩 기능을 구현해 나갔다. 이 과정을 통해 각 기능의 의존성을 낮추고 필요한 함수들만 정의할 수 있어 코드가 더욱 깔끔해졌다. 처음에는 TDD 방식에 대해 반신반의했지만, 문제를 하나씩 해결해 나가는 데 큰 도움이 되어 앞으로도 계속 사용해야겠다.
 기존에는 터미널에 출력하며 일일이 디버깅하는 방식으로 코드를 작성했다. 하지만 테스트 코드를 먼저 작성하는 방식으로 전환하니 문제를 체계적으로 해결할 수 있었다. 이전에는 콘솔을 사용해 한 번에 하나의 테스트만 확인할 수 있었지만, TDD 방식 덕분에 여러 테스트의 결과와 상태를 한눈에 확인할 수 있게 되어 훨씬 효율적이었다. 과거에는 프로그램 전체 로직을 한꺼번에 생각하며 구현하다 보니 함수들이 복잡해지고 이를 해결하는 데 많은 시간이 들었지만, TDD를 통해 각 함수에 하나의 기능만 구현하고 기능 하나하나에 집중하며 작업할 수 있었다. 그 결과, 코드가 더 이상 복잡하지 않고 깔끔하게 작성되었고, TDD 방식이 권장되는 이유를 몸소 체감하게 되었다. 앞으로도 TDD 방식을 꾸준히 적용하고 공부해야겠다.


🔆 try-catch 구문


 try-catch 구문을 사용하면서 단순히 throw new Error() 대신 IllegalArgumentException 같은 적절한 예외 타입을 사용하는 것이 더 좋다는 생각이 들었다. 실제로 찾아보니 Error는 주로 JVM의 심각한 오류에 사용되므로, 논리적인 오류 처리에는 사용하지 않는 것이 좋다는 점을 알게 되었다.


🔆  기본 구분자와 커스텀 구분자 형식에 대한 데이터 저장 방식


 기본 구분자인 ,와 :로 구분된 데이터를 리스트로 관리했다. 바로 정규식을 사용해 관리할 수도 있었지만, 추후에 기본 구분자를 추가하거나 변경할 때 정규식을 전부 수정하는 수고를 덜기 위해 리스트로 따로 관리한 후 필요할 때 정규식으로 합쳐 사용했다. 또한, 커스텀 구분자 형식인 //와 \n은 각각 CUSTOM_SEPARATOR_START와 CUSTOM_SEPARATOR_END로 저장해 두어, 커스텀 구분자 형식이 변경될 때 상수만 수정하면 되도록 하였다.


🔆 Pattern.quote


 예외 케이스를 생각하면서, 커스텀 구분자로 정규식 문자가 들어오면 어떻게 될지 고민해 보았다. 커스텀 구분자를 리스트에 추가하고 이를 join 해서 사용할 때 정규식 문자로 인식되어 원하는 결과가 나오지 않았다. 정규식 문자를 일일이 처리해야 하나 고민하던 중, 정규식 문자를 문자열 그대로 저장해 주는 Pattern.quote라는 문법을 알게 되었다. 이를 통해 .나 (, \ 등의 문자를 그대로 처리할 수 있게 되었다.


🔆 커스텀 구분자가 숫자나 \n을 포함하면 오류 발생


 이 부분에서 많은 고민을 했다. 예를 들어, 커스텀 구분자가 3이고 문자열이 132333이라면 [1, 2, 33]이 되어야 할지 [1, 23, 3]이 되어야 할지 판단하기 어려웠다. 그래서 커스텀 구분자로 숫자가 포함되면 오류를 발생시키도록 하였다. 또한, 커스텀 형식에서 \n이 포함되면 //와 \n 사이에서 커스텀 구분자를 찾는 데 오류가 생길 수 있어, 이 경우에도 오류를 발생시키도록 구현하였다.


🔆 리팩토링


 테스트 코드에서 `JUnit`과 `AssertJ`를 사용해 보지 못했기 때문에 처음엔 간단한 문법만 찾아서 테스트 코드를 작성했다. 모든 기능을 구현한 후, 관련 문법을 공부하면서 ParameterizedTest를 사용하여 중복된 패턴을 제거하고 그룹화하여 리팩토링을 진행했다. 또한, Application 클래스에서 중요한 점은 main 함수의 역할을 최소화하는 것이었다. 처음엔 출력 함수와 실행 명령들을 main 함수에서 처리했지만, 실질적인 계산을 담당하는 함수를 추가로 구현해 main에서는 실행만 하도록 역할을 분담하였다. 각 함수도 하나의 책임만 갖도록 세분화하여 리팩토링을 완료하였다.


💭 다음 미션에서 시도할 것


1. 테스트 코드와 해당 기능을 같이 커밋하여 보기 편하도록 할 것이다.
2. 커밋 컨벤션을 더 찾아보며, 미숙했던 커밋 메시지를 개선할 것이다.
3. 순간순간 떠오르는 호기심이나 생각을 따로 정리해, 이를 통해 더 깊이 공부할 수 있도록 하겠다.

4. 더 좋은 에러 메시지를 작성하도록 고민해본다.

 

 

728x90