[텍스트 게시판] 6단계 - 명언 삭제, 리팩토링

이다혜·2023년 10월 26일
0

Java 텍스트 게시판

목록 보기
6/17

요구사항


  1. 종료 입력시 종료
  2. 등록 입력시 명언 등록
  3. 등록시 생성된 명언 번호 출력
  4. 등록할 때마다 명언번호 증가
  5. 목록 입력시 현재까지 생성된 명언 목록 출력
  6. 명언번호로 명언 삭제
  7. 존재하지 않는 번호로 삭제 시도시 예외 처리
  8. 명언 수정
  9. 파일을 통한 영속성
  10. json 파일 빌드

Code


  • 한 함수안에 모든 기능을 넣어놓으면 코드가 복잡하기 때문에 각각의 기능을 함수로 분리하는 리팩토링작업을 해주었다.
  • 여러 함수에서 사용하는 Scanner와 마지막 명언 번호, 명언 list는 지역변수가 아니라 전역변수로 선언해주고 생성자로 초기화 했다.
void actionRemove(String cmd) {
        int id = getParamAsInt(cmd, "id", 0);

        if (id == 0) {
            System.out.println("id를 정확히 입력해주세요.");
            return; // 함수를 끝낸다.
        }
        System.out.printf("%d번 명언을 삭제합니다.\n", id);
    }
  • cmd에 삭제? 뒤에 이어지는 queryString에서 "id"를 찾아서 반환하는 getParamAsInt() 메서드를 따로 분리했다.
  • 따로 분리한 이유는 수정에서도 같은 기능이 필요하기 때문에 코드 중복을 줄이기 위해서 이다.
int getParamAsInt(String cmd, String paramName, int defaultValue) {
        String[] cmdBits = cmd.split("\\?", 2);
        String queryString = cmdBits[1];

        String[] queryStringBits = queryString.split("&");

        for (int i = 0; i < queryStringBits.length; i++) {
            String queryParamStr = queryStringBits[i];

            String[] queryParamStrBits = queryParamStr.split("=", 2);

            String _paramName = queryParamStrBits[0];
            String paramValue = queryParamStrBits[1];

            if (_paramName.equals(paramName)) {
                try {
                    // 문제가 없을 경우
                    return Integer.parseInt(paramValue);
                } catch (NumberFormatException e) {
                    // 문제가 생긴 경우
                    return defaultValue;
                }
            }
        }

실행 결과


어려웠던 점


삭제 기능에서 항상 "삭제?id=1"의 형태로 요청이 들어올거라고 생각하고 단순히 코드를 구현했는데, 그렇지 않을 경우도 있으니 요청에서 queryString들을 추출하고 그 안에서 또 파라미터 이름과 값들을 분류해야한다는 생각은 하지 못했다.
여러 요청에 대응하기 위해 코드를 수정하는 과정이 어려웠지만 재밌기도 했다.

0개의 댓글