본문 바로가기
개발공부하며 느낀 인생 공부

스윙 게시판 삭제기능 도입[feat.3일만에 해결한...20220719 TIL]

by 날파리1 2022. 7. 19.

마침내 게시판 삭제기능을 도입하다...

스윙으로 게시판 기능을 만들고싶었던 건 사실 부끄럽지만 몇주도 전이다. 만들긴했었다. 어떠한 비지니스로직 과 인터페이스 구분없이

모델의 개념도,비지니스로직반영도..영속성(데이터 불러오기)도 없는 그런..걸 만들긴했다.

사실 저건 너무 보잘것 없고 제대로 된 기능(정말 어려운것도 아닌 딱 그냥 제대로 저장과 삭제 불러오기를 하는..그런 간단한 ..것 말이다.)을 한 게시판을 만들고 싶었고 지난 금요일부터 고민했다. 심지어 게시판 과제를 그전에 했는데도..내가 원하는 방식의 게시판은 정말 또다른 미션이었다.

 

가장 큰 문제는 무엇이었나?

문제는 정말 수 없이 많았지만 기능실현을 위한 문제를 하나 뽑자면 

로직보다 스윙의 인터페이스가 작동하는 원리에 익숙치 않았다. 프로그래밍, 
말그대로 순서대로 하나씩의 일을 처리할줄 몰랐다.

왜 컴퓨터를 언어라고 하는지 알겠다. 정말 이 순서를 어떻게 나누냐에 따라 달라지는데 이러한 수백개의 코드들이 꼬리를 무니 정말 도미노처럼 디버깅이 불가능해지고 어디서부터 수정을 하더라도 또다른 도미노가 말썽을 부렸다. 정리를 해보겠다.

 

문제1. 프로그램이 실행되고 작동되는 순서를 명확히 나누지 않고 머릿속으로만 그려 코드를 그려내었다

-> 뒤죽박죽 코드로 하나의 실행이 전체를 포함하고 전체의 실행이 오직 한가지 실행만을 위한 이상한 프로그램작동이 되었다.

배운점. 프로그램 기능 큰 틀을 나누고 각 기능이 어디까지의 행동을 할지 명확히 나누어본다. 그리고 각 기능을 수정이 쉽도록 분리한다.

스윙은 정말 순서하나하나를 정말 각각 명시해줘야하는 아주 까다로운 아이다. 

스윙 특징

1. 요소를 지우더라도 찌꺼기는 남는다.

2. 그 찌꺼기를 visible(false)로 반드시 제거해줘야 요소가 드디어 제거된 것이다.

3. 항상 그런건지 확실친 않지만 어떠한 요소에 추가를 했다면 이전 요소(보이는 인터페이스상의 요소)에 추가되는 것이 아니라 컴퓨터의 메모리상에 추가된 것이다. 즉 다시 이전 요소를 지우고 보이지 않게 한 다음 더해준 새요소를 생성해서 붙여준다.

 

문제2. 뒤죽박죽 코드는 다른 사용자뿐 아니라 심지어 미래의 나도 어렵게 한다.

나 조차도 읽고 이게 무슨기능을 하는거지? 라고 하며 처음으로 돌아가는 상황이 자주 발생했다. 정말...비효율은 또 다른 이상한 코드를 낳는다.

 

문제3. 시스템아웃 및 테스트 코드로 이것이 제대로 작동하는지 중간중간 체크하지 않고 느낌으로만 코드를 짰다.

말 그대로 정신나간 아티스트 마냥 필에 충만한 코드를 짰다. 문제가 생기면 가설을 내놓긴하는데 그마저도 내삘링에 의존한 가설이고 되면 좋고 안되면 멘붕인 그런 ... 그래서 찾은것이 시스템아웃으로 결과를 찍어보는 것과 테스트 코드로 확인하는 것.

 

문제4. 무작정짜니 쓸데없는 변수생성이 너무많고 각 기능을 다 따로 지정해줘야하니 나도 헷갈린다.

이것도 문제2번과 일맥상통한다. 다루는 변수가 너무 많다보니 관리가 안된다. 무조건 필수적인지 따지고 간결하게 중간중간 리팩토링!

 

문제5. 마지막 가장 큰 문제, 문제 1번과 일맥상통하기도한다. 요소들을 매번 완전히 지워주고 안보이게해주지 않았고(지우긴했는데 매동작마다 일줄은 몰랐다.) 또한 지우고 메소드 분리 과정에서 null 처리를 어떻게 해야할지 몰랐다.

분명 메소드로 분리가 필요한 작업인데 (그렇지않으면 또 악성 도미노 효과를 유발하는..)

그래서 분리를 하고 필요한 요소를 필드화시켰더니 null 이 나온다.

정말 지긋지긋.. 필드화라는 것이 단순히 인스턴스 생성과 동시에 가장 먼저 선언 혹은 생성해준다는 것을 까먹은 것은 아니지만..단순히 클래스 전역에 접근가능하다고 생각했다. 근데 메소드화 해서 분리시킨후 이전 화면을 지워주려니 계속 null...

 

이유는??

 

어떤 컨테이너를 필드 선언후 new Container 는 괜찮지만 그 컨테이너가 한 번 작동한 상태에서 어떤 작업후의 컨테이너를 보여주려면 말했듯이 이전 보여줬던 컨테이너를 지워야한다. 근데 지우려면 다시 컴퓨터가 필드를 변수를 거쳐 들어가기 때문에 null 나온다 즉 무슨말이냐면

 

private Component component;  (어떤 컨테이너적 요소 생성)

 

component.removeAll().  (항상 새로 추가전 이전 나타났던 요소들을 제거해주기 위해 입력

 

component = new 추가할 요소    (지운 후 새 요소를 용기에 다시 넣음)

 

이 순서라면 저 removeAll() 메서드가 없으면 원하는 요소가 추가된 후 이후 추가할때 이전 컴포넌트가 잔상이 남아 겹치는 오류가 발생하고 removeAll() 메서드를 넣으면 null...

저 단 2줄의 코드가 딱 살렸다. 단순한데 강력하다.. 

앞에 아무것도 없다면 새로 추가하고 있다면 지우고 넣어라.

 

마지막 문제인 스스로 삭제 문제

위의 WritingListPanel 을 생성한 후 WritingListPanel 내부에서 스스로를 삭제야할 일이 생겼다.

그래서 그것을 포함한 상위 용기선택법을 찾는데 하도 없길래 생각을 하다

스스로가 스스로를 지우고 추가할 순 없을까?를 생각하고 시도했는데 됬다!

 

완벽한지는 모르지만 일단 원하는대로 되었다. 

최고인줄은 모르지만 내가 할 수 있는 현재의 최선을 선택했다고 생각한다.

말그대로다 저것이 흠잡을 코드인건 이루 말할 필요 없겠지만 그래도 나에겐 너무도 큰 문제들을 해결해준 현재로서의 최선의 코드이다.

더 배우고 더 개선해나가자!

 

마치며...

이번 프로젝트 주는 스트레스를 굉장히 많이 받았다.

지난 프로젝트의 실패(처참한...) 와 2주가 지난 현재도 강의에서 가르쳐준 기능을 온전히 습득했다고 생각했는데도 아무것도 제대로 구현못하는 무기력함...고민한 흔적에 비해 나아지지 않는 결과물... 또 다른 이월? 혹은 코스중단? 의 무서움 등등..

전혀 즐기지를 못했다. 당연히 옳지 못한 걸 알지만 내가 평균 한참 이하인가라는 자질을 의심했고 해도 될까?라는 무기력감이 덮쳤다.

 

출처 네이버 웹툰 킬베로스2

 

 

문득 그런 며칠밤을 보내자 잠을 전혀 자지 않고 실력은 없지만 희망찾던 나보다 잠보 더 자는데도 더 무기력하고 행복하지 않은 나를 발견했다. 그건 옳지 않다고 생각했다.

 

휴 그렇지만 내가 잘하수 있는걸 하자. 나는 끈기가 있다. 뭐든 오래하고 잘할 때까지 아무리 넘어져도 한다. 나답게 하기로 했다. 사고하지 않고 반복적인 끈기가 아니라 조급해 하지 않는 끈기를 가지고 행복하기로 했다. 

오늘 일기 끄읏

 

출처 네이버 웹툰 킬베로스2

 

댓글