메모장 프로그램 만들기

HYEMIN LEE·2022년 11월 24일
0

팀프로젝트

목록 보기
1/2

오늘은 팀 프로젝트가 있는 날이다. 아침부터 발제를 했는데 본격 프로젝트에 들어가기에 앞서 메모장 구현을 오늘 하루동안 해보고 내일까지 제출하기로 했다.

팀명과 각 팀원의 깃허브 아이디 정보와 블로그 정보이다

팀명 : 조미김

팀장 : 조성현 - dangddoong 땅뚱로그
기술팀장 : 김관호 - bigquann97 nicq.log
팀원 : 김학윤 - khakyy 케이
팀원 : 이혜민 - yichi22 yichi22.log
팀원 : 김동균 - ca1af calaf.log

처음에는 필수 요구 사항을 보면서 필요한 기능이 뭐가 있는지 정리했고 그 기능 안에서도 어떤 걸 세부적으로 구현해야하는지를 상의했다. 또한 네임컨벤션은 어떻게 정할 것인지 협업을 위해 세부적인 네이밍을 어떤 목적이 있는지 알아볼 수 있게 해달라는 것 역시 정했다.

또한 지금은 디비를 배우지 않았기 때문에 디비 역할을 하는 클래스 안의 자료형은 어떤 식으로 정할 것인지 상의를 하다가 Hash맵순서 보장이 안 된다는 것을 알았고 ArrayList로 작성을 하기로 했다.

그 후 큰 그림으로 각 클래스들이 어떤 식으로 동작할지 상의했고 서로 의문인 점을 나누고 필수 구현에 들어있어서 수정을 해도 되는지 의문인 점은 두 팀장님들이 튜터님께 가셔서 물어보고 오셨다.

그런 후 업무분담을 고민했는데 너무 간단한 프로그램이라 분담하기도 애매한데다 팀원 모두가 메모장 프로젝트에 대한 이해를 갖출 수 있도록 협업을 진행하는 것이 목표여서 그냥 메모 클래스, 디비 역할을 하는 메모리스트 클래스, 그 클래스들을 이용해 추가, 수정, 삭제 하는 것을 각각 한 명이 맡아서 하되 화면 공유를 키고 서로 머리를 합치고 이해했는지 확인하기로 했다.

메모 클래스는 동균님이 주로 작성을 하셨다. 필드가 뭐가 필요한지 고민을 하시고 시간값을 받아오는 것을 모르셔서 관호님께 물어보고 생성자를 작성하셨다. 처음 생성자에서는 시간 데이터만 안 받아오지 각 메모가 들고 있는 고유 값이나 유저들에게 받아오는 정보를 전부 파라미터로 받고 있었다.

고유값은 받아오는 값이 아니라 내부적으로 생성하는 값이니 생성자에 있을 필요가 없다는 의견에 고유값을 파라미터에서 빼셨고 관호님이 추가적으로 이해를 도우시기 위해 설명을 해주셨는데 파라미터에는 유저들에게 받는 값만 넣는 것이고 서버에서 넣는 값은 받아올 필요가 없으니 넣을 필요가 없다는 것이었다.

이후에 팀원들끼리 고유 번호 값을 어떻게 줄 것이냐로 의견이 나뉘었는데 static이 붙은 값은 모든 객체들이 공유를 하는 값이라고 해서 count를 static으로 선언해주기로 하고 public을 할 것이냐 private를 할 것이냐로 의견이 갈렸었는데 전날에 튜터님의 강의를 정주행하다가 public을 하면 값을 막 바꿀 수 있다고 했던 것을 기억해서 count 값이 막 바뀌면 안 되지 않냐로 설득을 해 private static count = 0; 으로 고유 번호에 count++을 해주기로 했다.

이후 getter를 작성하시고 수정 문제 때문에 setter를 작성하시다 다들 꼬여서 헤매니까 관호님이 setter는 필요할 때 작성하면 된다고 교통정리를 해주셨다.

메모리스트 클래스는 내가 주로 작성했다.

private ArrayList<Memo> memoList = new ArrayList<>();

가 필드로 들어가는 건 알겠는데 그 이후에 어떻게 해야하는지를 잘 모르겠어서 어떡하지 하면서 헤매고 있으니까 성현님이 일단 필요한 기능을 하나씩 만들어보자고 해주셨고 메모리스트 클래스 같은 경우에는 DB와 같은 역할이니 그걸 생각하면서 구현해보라고 관호님이 조언을 해주셔서 하나씩 할 수 있었다.

자바의 클래스의 첫 글자는 대문자로 시작해야한다는 것을 팀프로젝트를 하면서 처음 알았다.

ArrayList를 잘 사용해보지 않아서 당장 insert에서부터 헤맸는데 그건 memoList에는 Memo 클래스로 만들어진 객체들이 담기니까 그걸 파라미터로 받아와서 넣어주면 되지 않나 상의해서 결정했고 관호님이 ArrayList의 기능이 뭔지 모르겠으면 뒤에 .을 쳐보고 함수를 정한 후 그 뒷부분에 Ctrl + p 를 해보면 어떤 인자들이 필요한지 알 수 있다고 알려주셔서 add를 사용해 추가할 수 있었다. add의 인자가 2개인데 왜 하나만 들어는지 질문하니 오버로딩의 개념이라고 하셨다.

이후 전체를 뿌려주는 건 그냥 memoList를 반환했고 낱개로 뿌려주는 것도 구현하는게 좋을 것 같다고 성현님이 조언해주셔서 함수를 만들고 파라미터로 고유값을 받아오는 것까지는 했는데 그 이후에 for문이냐 equal()이냐로 의견이 나뉘어서 다시 관호님이 호출되었다. equal()은 ArrayList를 ArrayList랑 비교하는 거라서 못 쓰고 for문을 써야한다고 정리해주셨다.

또 인텔리제이의 신기한 기능을 알려주셨는데 for문을 돌리고 싶은 아이의 뒤에 . 을 찍고 for를 쓰면 어떤 형식으로 작성을 할건지 선택을 할 수 있고 선택하면 그 형식으로 아예 코드가 만들어진다는거였다.

그리고 삭제 기능 역시 위와 다를게 거의 없어 복사해서 이름만 바꾸고 return 값은 없어서 void로 해주었다. 삭제를 위해 remove()를 써줬다.

이후에 관호님이 내 쪽에서 자꾸 xml이 업데이트 된다는 말에 gitignore 쪽을 건드리셨다가 JDK 파일이 싹 날라가버려서 새 레파지토리를 팠다.

클래스를 전부 구현한 후에는 추가 수정 삭제에 대한 함수를 만들어줬는데 프론트엔드단을 우리가 클래스 고민한다고 머리쓰는 사이에 관호님이 다 만들어놓으셔서 가이드라인이 잘 잡혀있었다.

insert는 동균님이 만들어주셨다. 유저명 패스워드 메모를 받아오는 거였는데 처음에 메모 객체를 어떻게 만들어야하는지 감을 못 잡으셔서 다들 조금씩 조금씩 힌트를 주면서 도와드렸다. 우리는 비밀번호를 숫자 4자리로 제한했는데 그 탓에 받아온 값이 숫자인지 검증을 하고 그리고 그 자릿수가 4자리인지도 검증을 해야해서 처음에는 받아온 값을 숫자로 변환해주는 Integer.parseInt(변수)를 썼다가 if문에서 오류가 걸리는 바람에 scanner.nextLine()을 썼던 걸 scanner.nextInt()로 바꾸고 우리는 착한 고객님만 받는다 생각하자고 했다. <- 훗날 관호님을 괴롭게 한 원인 중 하나

Delete의 경우에는 학윤님이 만드셨는데 머리로는 알겠는데 코드로 뽑아내기가 힘들다고 하셔서 다른 분들이 많이 도와주셨다. 내가 만든 DB용 리스트에 원하는 번호가 없는 경우 처음에는 Exception을 띄워줘서 오류가 나는 바람에 그 부분을 수정하는 건 어떤지 의견을 냈는데 관호님이랑 성현님이 원하는 값을 가져오지 못한다 해서 데이터를 담고 있는 파일에서 만들어진 코드는 건드리는게 아니다라는 걸 알려주셔서 또 하나를 배웠다.

원하는 번호가 없는데 return memo를 어떻게 하나 바보짓을 했는데 그냥 return null을 해주면 되는거였다.

마지막으로 modify는 성현님이 만드셨는데 만드시다가 memo 클래스에서 setter를 만들다가 필요할 때 쓰자고 넘긴 부분을 구현하셨다.

그 후 저녁 시간이라 밥 먹고 다시 합시다 라고 했는데 배가 안 고파서 그 사이에 내가 거하게 사고를 쳐놨다.

처음에는 delete가 잘 돌아가는 지 실험했을 때 비어있으면 무한루프에 빠졌던 걸 기억하고 그 위에 DB 역할을 하는 리스트가 비어있으면 return해서 함수 밖으로 빠져나가는 코드도 작성해줬다. 이때 수정 부분도 그런 문제가 있을 수 있다는 걸 생각을 못해서 빼먹었고 다 하고도 심심해서 할 거 없나 찾다가 숫자로 받는 부분들은 문자로 받으면 오류가 나길래

while (!scanner.hasNextInt()) {
            scanner.next();
            System.out.print("다시 입력");
            scanner.nextLine();
        }

를 넣어서 숫자가 들어가지 않으면 아예 값이 안 들어가도록 했고 그걸 전부 쓰려다 보니 코드가 너무 드러워져서 따로 scanIsNum이라는 함수를 만들어서 갖다 박아놓고 필요한 곳마다 집어넣어놨다.

지금이 밤이라 자세히는 기억이 안 나는데 scanner.nextInt()를 하고 난 뒤 뭔가를 출력하려고 하면 자꾸 중복 출력이 되길래 찾아보니 nextLine()Enter 값까지 반환하지만 nextInt()는 그렇지 않아 버퍼가 비지 않은 상태기 때문에 비워줘야한다는 걸 알고서야 비밀번호를 4자리 숫자로 잘 입력한 후 출력했을 때 2번 출력되는 걸 고쳤다.

덕분에 코드가 더 더러워져서 관호님이 장난으로 그만하라고 코드리뷰때 힘들다고 하셨는데 동균님까지 돌아오시는 바람이 우리 둘이 이것만 더 고쳐볼게요 하면서 관호님의 일을 더 늘려버렸다.

성현님이 집안 어른분과 식사를 하러 가셔서 8시가 조금 넘어서 관호님이 리팩터링을 하시면서 코드리뷰를 하셨는데 처음에는 데이터를 담는 클래스 부분부터 보시면서 변수명이 명확하지 않은 부분을 고치셨고 이후 로직이 담긴 클래스를 보시면서 변수명을 더 직관적으로 바꾸시고 하나하나 설명하시면서 수정하셨다. 그래서 System.out.print(문자열)에 문자열 부분을 다 일일이 쓰는 걸 하드 코딩이라 한다는 걸 알았다. 그러시면서 나중에 사용자가 문구가 마음에 안 든다 바꿔달라 했을 때 일일이 찾아서 수정을 할 수 없기 때문에 printer 클래스에

public static final 자료형 이름 =  "문자열"

모음을 만들어놓고 가져다 쓰실거라고 설명을 하시면서 변경을 하셨다.

이후에 한 작업은 내가 사고쳐놓은 숫자 판별 함수를 다른 방식으로 쓰시는 것이었는데 가장 먼저 하신 일이 nextInt()를 한 후에는 nextLine()을 해줘야하니 그 부분을 다시 전부 nextLine()으로 바꾸시고 더러웠던 코드를 정리하신 후 숫자를 판별하는 함수를 하나 따로 빼셔서 try - catch문으로 숫자가 아닌 경우 숫자인지 아닌지 판별해주는 로직이 돌아가는 while문에 조건으로 들어가는 변수에 -1을 return 해주어서 -1이 나오지 않을 때까지 돌아가도록 하셨다.

이후에 내가 만들어놓은 리스트가 비었을 경우 빠져나가는 로직을 리팩터링 하셨는데 여기서 관호님의 멘탈이 탈탈 털려버리셨다.

나 같은 경우는 비었으면 무조건 빠져나가도록 만들었는데 관호님은 사용자에게 뒤로 돌아갈 것인지 묻고 빠져나가는 로직을 짜셨는데 3번인가? 즈음 시도해도 빠져나가지를 않고 자꾸 아래 코드를 실행해서 보는 사람도 같이 멘탈이 갈려나갈 뻔 했다. 내가 했을 때는 그냥 return 해도 빠져나갔는데 관호님은 return을 해도 빠져나가지지 않는 것 때문에 뭐가 문제일까 서로 고민하다가 내가 if문 아래에 else를 쓰지 말고 return을 밖으로 빼보시는 거 어떤가 제안해서 해결을 봤다.

이후에 잘 돌아가는지 실험을 하시다가 내가 보지 못한 수정 부분에서도 무한루프에 빠진다는 것을 보시고 그 코드를 복사해서 붙여넣어 오류를 해결해주셨다.

메모 수정 부분에서 원래 저장된 내용을 가져와 수정하는 작업을 하고 싶었는데 너무 늦은데다 오늘은 워밍업 느낌이기도 하고 관호님의 멘탈도 탈탈 털려버리셔서 성현님이 지금 너무 힘 빼면 안 된다 말리셔서 그건 하지 않기로 했다.

하지만 아직 잠도 안 오겠다 찾아보다가 scanner는 썼으면 꼭 close 하는 버릇을 들여야 한다는 걸 알았다. 다음에 참고해야지.

사실 나는 첫 주차에는 예비합격생이라 미니 프로젝트를 하지 않아서 어떤 식으로 하는지 몰랐는데 이렇게 하나하나 정하시면서 하시는 걸 보고 많은 걸 배운 것 같다.

올리는 걸 깜빡하고 잠들다니 나는 바보인게 틀림없어.

profile
개발자의 길에 한 걸음 더

0개의 댓글