간단한 소개
아래 있는 내용을 구현하면 된다. 이 때 JAVA Convention, Commit Convention 등 지켜야 할 사항이 있다.
이번에 지켜보고 싶었던 사항들
1. 구현 전에 readme에 기능을 작성하고, 그에 맞춰서 commit해보기
2. 커밋 메시지를 자세히, 제대로 작성해보기 (읽어봤을 때 이해가 되도록)
3. 예외 사항(IllegalArgumentException) 또한 고려하며 기능목록을 작성하기
4. 주석처리 깔끔하게 해보기
5. refactoring 제대로 하여 반복되는 코드 없도록 하기
6. Test로 삼을 만한 더미 데이터 만들어보기
7. 일급콜렉션 적용시켜보기
위 내용으로 TDD 훈련해보기!
TDD, 정의는 쉽고 체화는 참으로 어렵다.
정의는 쉽다. 테스트를 먼저 만들고 테스트를 통과하기 위한 것을 짜는 것 즉, 만드는 과정에서 '우선 테스트를 작성하고 그걸 통과하는 코드를 만들고'를 반복하면서 제대로 동작하는지에 대한 피드백을 적극적으로 받는 것이다.
TDD에서 내가 가장 중요하게 보는 부분은 이 Refactoring 부분이다.
JAVA convention 조건을 보면, else를 쓰지 않는다... 등이 있는데, 조건들이 죄다 내가 알고리즘 문제를 풀 때 습관들을 '너가 가지고 있던 습관들 다 하지 마렴^_^' 이런 느낌이라 일단은 기능을 다 구현을 마친 후에 refactoring하기로 마음먹었다. 그러면 언젠가 체화될 것이니.. 어떤 영상에서 refactoring=운동이라고 하더라. 시작했다면, 평생 가지고 가도록 하자!
구체적 연습 과정 잡기 ---> 이후 시행한 것은 형광펜으로 표시
1. directory 생성. JAVA에서 주로 쓰이는 package 명은 무엇일까? 용도에 따라 명칭이 다른 것일까??
2. java class와 그 클래스 속 메소드를 잘 생성해보기. 이 때 객체지향 SOLID 원칙 중 SRP(하나의 클래스는 하나의 역할만 한다.), ISP를 적용해본다. 함수(또는 메서드)가 한 가지 일만 하도록 최대한 작게 만들어라.
3. 내가 read me에 쓴 내용을 바탕으로 class 속에 기능들 추가. 기능들을 추가할 때마다 커밋하는 것 잊지 않는다.
4. commit 후 refactoring 과정
indent가 두 개 이상이 되지 않도록 한다.
메소드 인자 개수를 3개, 2개, 1개, 최소한 0개로 줄여본다.
5. 될 수 있는 다양한 입력값들에 대해 IllegalArgumentException을 적용해본다.
Directory 구조
domain/entity domain에는 가장 메인이 되는 기능들이 집약되어 들어가 있다고 보면 된다.
나는 굵직한 요구사항, 즉 User와 Computer의 입력을 받아 List로 만드는 과정을 이곳에 넣었다.
util 특정 비즈니스 로직과 독립적인 기능들, 상수 모음과 예외처리 기능은 util 패키지에 넣었다.model/repository 주로 안에 있는 것은 private 변수로 많이 들어간다. data의 틀을 만들기 위해 사용 MVC패턴에서 모델에 해당하는 부분을 java에서는 repository로 많이 사용한다고 한다.
나는 이 부분은 사용하지 않았다.
service 주로 게임을 run/play하거나 최종 결과값을 도출할 때, 비지니스 로직 처리할 때 많이 사용한다.
그리고 주로 모듈화 (여러개의 리포지터리에서의 데이터를 조회한 후 가공하여 리턴) 할 때 많이 사용한다고 한다.
나는 User와 Computer에서 전달받은 List들로 점수를 내는 Game에 대한 전체적인 rule을 볼 수 있는 파일로 지정하였다.
controller 클라이언트의 요청을 처리하거나, responsebody에 데이터를 담아 반환 controller 메서드의 리턴타입은 다양함.
controller는 최종적으로 게임을 play하는 곳이다. Service에 User과 Computer를 담아 게임을 실행시켰다.
view client에게 보여지는 부분 print되는 부분이나 웹/앱처럼 client와 관련된 부분이다.
나는 사용자에게 보여지는 출력 부분을 이곳에 배치하였다.
>>내 나름의 배치 로직도 생각해낼 수 있었다.
메소드는 하나의 일을 하도록 한다.
메소드를 쪼개는 과정이 생각대로 잘 되지 않아 일단 구현 후 쪼개 보았다.
위 메소드에서 하는 일 (순서대로 나열)
1. UserNumber라는 새로운 ArrayList생성
2. 입력으로 num이라는 String값 받기
3. 일단 이 num이 3글자인지, 모두 1부터 9까지의 숫자로 이루어져 있는지 확인한다.
4. 확인이 되면 UserNumber라는 ArrayList에 아스키코드를 이용해서 하나씩 집어넣는다.
5. User에게 받은 숫자를 쪼개서 만든 리스트를 반환시킨다.
줄이 길어졌다고 하더라도, 메소드가 여러갈래로 나누어지면서 가시화가 훨씬 잘 된다.이러면 주석 따윈 필요 없을 듯 ? 메소드 명이 다 말해준다.
(과정 중 TroubleShooting) 메소드는 하나의 일을 한다는 말을 메소드 안에 if문이나 for문이 하나만 있어야 한다고 착각했다. 만약 game을 run/play 하는 함수라면 다른 레포지토리에 만들었던 클래스나 메소드를 전부 가져와서 실행해도 된다.
Convention
자바컨벤션은 checkList로 표시하며 지켜나갔더니 그리 어렵지는 않았다.
Google 또는 Naver JAVA Convention 확인
회고
기능별로 커밋을 하는 것에 대한 중요함을 몸소 익혔다. 커밋을 한 후 실패했을 때 브랜치 원위치로 코드를 다시 돌려놓고 생각하면, 내가 망쳤던 코드에서 삽질하며 오류 찾는 것보다 처음부터 시도하는 것이 효율이 좋을 때가 있다.
항상 무의식적으로 주석을 달아놓는 습관이 있었는데 이번에는 주석을 싹 다 지워버리고 변수/함수 명으로 승부를 보았다.
앞으로도 좋은 습관들이 계속 쌓아졌으면 좋겠다. 꾸준히 의식적인 연습을 해야겠다.
코드확인 링크
'BackEnd > JAVA\SPRING' 카테고리의 다른 글
[Spring] Spring으로 JWT 구현하기2 - Spring Security 라이브러리 (0) | 2023.02.11 |
---|---|
[SPRING] Swagger, 프론트와의 소통을 편하게 하는 자동 툴 (2) | 2023.02.11 |
[SPRING] Spring으로 JWT 구현하기1 - jwt-java 라이브러리 (2) | 2023.02.09 |
[SPRING] SPRING 기초, SPRINGBOOT 프로젝트 폴더 구조 (0) | 2023.01.15 |
[JAVA] 우아한테크코스 5기 지원 및 1주차 과제 (1) | 2022.10.30 |