2020-04-15 TIL

할 일 목록

  • pos 리팩터링 마무리 한 후에 정리 하고 회고
  • db 책 나머지 읽기
  • 파이썬으로 문제 한 문제 풀기
  • 디비 스터디

완료하지 못한 목록

완료 목록

  • 파이썬으로 문제 한 문제 풀기
  • pos 리팩터링 마무리 한 후에 정리 하고 회고

pos 시스템 만들기 회고

  1. 코드를 짜면서 목표로 한것

    • 객체 지향 생활체조 9 가지 규칙을 지키며 코딩한다.
    • 메서드, 변수, 클래스 이름을 누구나 알아들을 수 있도록 결정한다.
    • 책을 빌려주고 반납하고 늦게 반납할 경우 돈을 받는 동작이 되도록 만든다.
    • 레이어드아키텍처를 적용하여 도메인, 서비스, 컨트롤러, 레포지토리로 하기.
  2. 실제로 달성한 것

    • 객체지향 생활체조

      1. 한 메서드에 오직 한 단계의 들여쓰기만 한다.(한가지 일만 하도록)
      2. else 예약어를 쓰지 않는다.
      3. 한 줄에 점을 하나만 찍는다.
      4. 줄여쓰지 않는다.
      5. 모든 엔티티를 작게 유지한다.
    • 책을 등록하고 손님들이 책을 대출 반납할 수 있는 API들을 구현 하였다.
    • 메서드, 변수, 클래스 이름을 최대한 줋이지 않고 무엇을 하는지 명확히 알 수 있도록 명명 하였으며, 클래스 이름이나 메서드에 중복되는 단어들을 축약 하였다.
    • 레이어드아키텍처를 적용하여 도메인, 서비스, 컨트롤러, 레포지토리로 하였다.
  3. 새롭게 배웠던 부분

    • DB에 의존적인 코드를 작성하면 안된다.

      • 이것의 예로 BookLedger나 CashLedger를 사용하여 해당 책의 대출 상태와 사용자의 보유금액을 위의 두 객체로 부터 가져왔다. 그 이유는 DB에 그렇게 저장이 되있을 것이라고 생각 했기 때문이다. 하지만 그러지 않고, User와 Book의 객체가 상태로서 가질 수 있도록 해야한다. 자동차의 바퀴의 상태를 자동차의 바퀴에게 묻는 것이 아니라 자동차에게 물어보고, 자동차가 자신의 바퀴에게 물어본 후에 응답하도록 하는 방법 이것을 aggregation 이라고한다.
    • 예외처리를 하는 방법을 배웠다. 이전에는 throw가 뭔지 그냥 대충 알았는데, throw를 던지고 catch 하는 방법을 사용하면서 알게 되었다. 그리고 검사예외는 throw를 사용하기 위해 함수의 시그니처에 throws 예외 를 붙혀줘야 하고 try/catch로 잡아줘야 하지만 비검사 예외는 throws만 하고 시그니처에 굳이 throw를 붙힐 필요가 없다.
    • service 부분은 비즈니스 로직이 존재하는 곳이다. 그렇기 때문에 반드시 하나의 메서드가 존재할 수는 없다. 나는 이곳에서 책을 빌릴때 하는 행위를 여러가지 절차를 각각의 객체를 협력하게 하여 구현하였다.
    • 컨트롤러는 UI 레이어와 맞닿아 있는 매니저로 UI에 필요한 기능들의 나열을 나타낸다.
  4. 아직 하지 못한 부분

    • Test 코드에서 exception 부분의 테스트를 하지 못하였음.
    • 실제로 DB에 접근하는 JPA 부분을 프로그래밍 하지 못했음.
    • 유저의 보유금액과 책의 대여 상태를 book과 user에서 확인할 수 있도록 코딩하지 못하였음.(aggregation)
    • 컨트롤러 부분이 제공하는 기능에 비해 분류되지 않아있다.
    • 모든 케이스를 테스트 하진 못하였다.

      • 책 대여 거래를 진행하는 부분에 책을 빌리는데 성공한 테스트만 작성 했지, 거래를 진행할때 필요한 조건 3개를 실패할 때의 테스트는 작성하지 않았다.

        1. 유저는 돈이 충분히 있는지
        2. 책이 존재하는지
        3. 책이 이미 대출 됬는지
  5. 아쉬웠던 부분

    • 객체지향 생활 체조의 4규칙을 지키지 못했음.

      1. 모든 원시값과 문자열을 포장한다.
      2. 2개 이상의 인스턴스 변수를 가진 클래스를 쓰지 않는다.
      3. 일급 컬렉션을 쓴다.
      4. 게터/세터/프로퍼티를 쓰지 않는다.
    • 구현할때 정확한 설계를 결정하지 않고 여러번 수정하면서 리팩터링 하였음.
  6. 아쉬웠던 부분을 어떻게 해결하면 좋을지

    • 객체지향 생활 체조의 4규칙이 무엇인지 좀 더 깊게 공부하고, 실제로 사용 상황을 만들어 구현해보기
    • 설계를 체계적으로 해보기

      1. 구현을 하기 전에 요구사항을 도출
      2. 어떤 기능이 필요한지 도출
      3. 그 기능을 하기 위해 어떤 행동이 필요하고 어떤 상태를 가진 클래스가 필요한지 생각해본다.

Written by@Zero1
This blog is for that I organize what I study and my thinking, feeling and experience.

GitHub