Boot Camp/[우테코] 프리코스

[4주차] bridge 미션

계란💕 2022. 11. 20. 21:17

  Ex) bridge 요구 사항

java
열기
  • 메서드 라인 10 이하
  • 모든 메서드를 파라미터 3개 이하로 구성한다..
  • 들여 쓰기 3이하: while문 안에 if 절 까지 허용
  • BridgeGame 클래스에서 input, output을 사용할 수 없다.
  • 입력은 저장된 라이브러리를 이용한다
  • Console로 입력 받는 부분은 Input 클래스에서만 사용 가능하다.

 

 

  • README
java
열기

 

 

  • InputView 
    • 이 클래스에서만 console을 통해 입력 받을 수 있다. 
java
열기

 

 

  • BridgeNumberGenerator
    • 숫자를 생성할 수 있는 메서드를 가진 인터페이스
java
열기

 

 

  • BridgeRandomNumberGenerator
    • 0, 1을 랜덤으로 만들 수 있는 클래스
    • BridgeNumberGenerator를 implement 한다.
java
열기

 

 

  • BridgeMaker
    • SuccessHandler, FailureHandler로 나눠서 구현한다.
    • 프로젝트 할 때, 로그인 성공, 실패 처리할 때 핸들러를 이용했던 게 생각나서 구분했다.
    • 메서드 라인 조건 때문에 모둔 걸 잘게 쪼갰는데 왜 쪼개라는 건지 보니까 이해가 확 간다.
    • 메서드명으로 하여금 기능이 확실히 파악되도록 짜면 더 좋을 것 같다.
    • makeBridge() 라는 메서드는 List<String>을 반환해야하는데 {"U" , "D", "D"} 라는 문자열이 포함된 리스트를 반환하도록 메서드의 틀을 만들어 놓은 걸로 보인다. 그런데, 내가 기능 구현을 모두 마친 다음에 이거 깨달았다. 그
    • makeBridge() 
      • 다시 생각해보니, 우테코가 생각한 로직은 아래와 같지 않을까 싶다.
        • 1) Maker 클래스에서 InputView을 이용해서 사용자의 입력을 받는다. U, D, D 같은 값을 저장하고 반환
        • 2) List {"U", "D", "D"}를 가지고 generatedBridge {"U", "D", "U"}와 비교한다.
        • 3) BridgeGame 클래스에서 Output.printMap() 을 이용해서 현재 상황을 출력한다. 
          • 첫 번째 출력: [ O ]            [   ]
          • 번째 출력: [ O |    ]       [   | O ]
          •  번째 출력: [ O |    |    ]  [   | O | X ]
    • 결국, 테스트 코드는 통과할 수 있도록 조건에 맞게 makeBridge() 를 구성하고 실질적으로 다리 만드는 메서드 makeCustomBridge()를 새로 만들었다.
    • 클래스와 메서드 역할을 잘못 이해해서 makeCustomBridge() 라는 메서드를 만들었다. 입력 받은 숫자에 따라서 랜덤으로 다리를 생성하는 메서드이다.
sql
열기

 

 

  • BridgeGame
    • 이 클래스 내부 각 메서드의 역할을 이해 못해서 사실상 이 클래스 없어도 잘 돌아간다..ㅜㅜ
    • 게임의 역할을 할 수 있도록 BridgeMaker내에 메서드의 반환값을 가져와서 비교하는 내용을 move()에 넣는다.
      • 성공: printResult()를 호출한 다음 게임을 끝낸다. 
      • 실패: retry()를 호출하도록 게임 재시작/ 종료를 선택한다.
      • 그러면 application에서 move()와 retry()를 어떻게 가져올지도 생각해볼 문제인 것 같다.
java
열기

 

 

  • OutputView
    • 매개변수에 generatedStr은 사실상 필요없다.
    • 급하게 제출하느라 지우지는 못했다 ㅠ.ㅠ
java
열기

 

 

  • Application
java
열기

 

 

 

  Ex) Caused by: java.io.IOException: Pipe broken

  • 오류: IOException: Pipe broken
  • 원인: 클라이언트가 요청 받은 응답 데이터를 정해진 시간 안에 맞춰 처리하지 못하는 경우 발생한다.
    • Receiver에서 송신 받은 데이터를 정해진 시간에 처리하지 못하는 상황에서 sender가 요청을 계속 보내는 경우 
    • 데이터를 제 때 처리하지 못하는 경우
    • 네트워크가 느리거나 서버의 CPU 이슈로 속도가 느린 경우에 발생한다.
  • 해결
    • 어떤 메서드 안에서 예외 처리를 하는 부분이 있는데 그 부분을 메서드의 뒷부분으로 이동했더니 해결됐다.
    • 우테코 미션할 때마다 비슷한 오류가 많이 터졌다.
    • 해결 방법은?
      • 1) Request 후에 Response 를 기다린다. (클라이언트가 연속적으로 데이터를 보내는 게 아니라 하나의 레코드를 보낸 다음 서버에서 응답을 받은 다음 보내도록 한다.)
      • 2) Exception을 무시한다. (클라이언트가 비정상적으로 종료할 때, Broken pipe Signal이 발생하고 클라이언트의 종료를 서버에서 제어가 불가능하므로 시그널을 무시한다.)
      • 3) 클라이언트에서 연속으로 버튼 클릭하는 것을 차단하거나 예외 처리 부분에서 오류가 나지 않도록 한다.
      • 4) Timeout 값을 늘린다.
      • 5) 가용 스레드를 늘린다.

 

 

우테코 다음 일정

  • 12/14: 1차 발표 (2배수 선발)
  • 12/17: 최종 코딩테스트 13 - 18시 (5시간)
    • 장소: 선릉, 잠실 캠퍼스에서 오프라인으로 응시

 

 

4주차 회고

  • 메서드 라인 10 줄 이내로 맞추느라 오래걸렸다. 처음부터 쪼개서 만드는 연습을 해야겠다. 추가 요구 사항에 있어서 만족시키기 위해 반복하여 쪼개고 대부분의 변수는 전역 변수로 처리했다. 메서드를  나누니까 각각 어떤 역할인지 파악할 수 있어 깔끔했다.
  • 앞으로는 메서드명만 봐도 기능이 확실히 파악되도록 네이밍하면 더 좋을 것 같다.
  • else문 금지, 들여 쓰기 3 이상 금지 등 여러 조건이 있었는데 일단 코드를 모두 짜고 통과하는 것을 확인한 다음에 요구사항을 보면서 리팩토링했다. 
  • 우테코에서 기본적으로 만들어준 클래스와 메서드에 대해 이해가 잘 안되서 사실 손 가는대로 만들었다..ㅜ.ㅜ 그래서 Maker의 두 가지 메서드는 사실 거의 쓰지 않았다. 그러다 보니까 Game 클래스에 내용이 많았고 그 부분을 쪼개는데 리팩토링 시간을 다 쓴 것 같다.
    • 요구 사항과 클래스 조건에 맞춰서 새롭게 브릿지 미션을 시작해봐야겠다는 생각이 든다.
    • 다시 짠다면 Maker클래스에 있지만 Game의 역할에 가까운 코드는 분리해야겠다.
  • 이번 마지막 미션은 스스로 완성하고 싶어서 겨우겨우 완성했다. 처음에는 문제가 이해도 안 가고 글이 너무 길어서 짜증이 좀 났다 ㅎㅎ 그래서 문제 파악하는데만 며칠이 걸렸다. 마지막 날에는 완성해서 정상 동작하는 걸 확인하니까 뿌듯하고 성취감도 느꼈다. 
  • 클래스 요구사항을 만족시키지 못해서 사실 큰 기대를 하고 있지는 않다..ㅋ 그래도 공부할 수 있는 방법은 많으니까 결과에 연연하지 말아야겠다 ヽ(✿゚▽゚)ノ

'Boot Camp > [우테코] 프리코스' 카테고리의 다른 글

[3주차] lotto 미션  (1) 2022.11.16
[2주차] baseball game 미션  (0) 2022.11.09
[1주차] on-boarding 미션  (0) 2022.11.01