워밍업 클럽 3기 BE 클린코드&테스트 - 1주차 발자국

워밍업 클럽 3기 BE 클린코드&테스트 - 1주차 발자국

강의 요약

 

섹션 2. 추상 (抽象)

  • 우리가 클린 코드를 추구하는 이유

    • 가독성

      • 글이 잘 읽힌다.

      • 이해가 잘 된다.

      • 유지보수 하기가 수월하다.

      • 우리의 시간과 자원이 절약된다.

  • 추상이란?

    • 사물을 정확하게 이해하기 위해서 사물이 지니고 있는 여러 가지 측면 가운데서 특정한 측면만을 가려내어 포착하는 것이다. 어떤 일면만을 추상하는 것은 다른 측면을 버린다는 것과 같다.

  • 추상화를 하는 이유?

    • 적절한 추상화는 복잡한 데이터와 복잡한 로직을 단순화하여 이해하기 쉽도록 돕는다. 즉 읽기가 좋다.

  • 추상화의 가장 대표적인 행위

    • 이름 짓기

    • 메서드와 추상화

    • 메서드 선언부

    • 추상화 레벨

    • 매직 넘버, 매직 스트링

 

섹션 3. 논리, 사고의 흐름

  • 뇌 메모리 적게 쓰기

    • Early return

      • else의 사용을 지양

    • 사고의 depth 줄이기

      • 중첩 분기문, 중첩 반복문

      • 사용할 변수는 가깝게 선언하기

  • 공백 라인을 대하는 자세

    • 공백 라인도 의미를 가진다. (복잡한 로직의 의미 단위를 나누어 보여줌으로써 읽는 사람에게 추가적인 정보를 전달할 수 있다.)

  • 부정어를 대하는 자세

    • 부정어구를 쓰지 않아도 되는 상황인지 체크하기

    • 부정의 의미를 담은 다른 단어가 존재하는지 고민하기 or 부정어구로 메서드명 구성

  • 해피 케이스와 예외 처리

    • 예외가 발생할 가능성 낮추기

    • 어떤 값의 검증이 필요한 부분은 주로 외부 세계와의 접점

    • 의도한 예외와 예상하지 못한 예외를 구분하기

  • Null을 대하는 자세

    • 항상 NullPointException을 방지하는 방향으로 경각심 가지기

    • 메서드 설계 시 return null을 자제한다

 

섹션 4 객체 지향 패러다임

  • 단일 책임 원칙 (Single Responsibility Principle)

    • 하나의 클래스는 단 한 가지의 변경 이유만을 가져야 한다.

    • 객체가 가진 공개 메서드, 필드, 상수 등은 해당 객체의 단일 책임에 의해서만 변경 되는가?

    • 관심사의 분리

    • 높은 응집도, 낮은 결합도

  • 개방 폐쇄 원칙 (Open-Closed Principle)

    • 확장에는 열려 있고, 수정에는 닫혀 있어야 한다

    • 추상화와 다형성을 활용해서 OCP를 지킬 수 있다.

  • 리스코프 치환 원칙 (Liskov Substitution Principle)

    • 상속 구조에서, 부모 클래스의 인스턴스를 자식 클래스의 인스턴스로 치환할 수 있어야 한다.

    • LSP를 위반하면, 상속 클래스를 사용할 때 오동작, 예상 밖의 예외가 발생하거나, 이를 방지하기 위한 불필요한 타입 체크가 동반될 수 있다.

  • 인터페이스 분리 원칙 (Interface Segregation Principle)

    • 클라이언트는 자신이 사용하지 않는 인터페이스에 의존하면 안 된다.

    • ISP를 위반하면, 불필요한 의존성으로 인해 결합도가 높아지고, 특정 기능의 변경이 여러 클래스에 영향을 미칠 수 있다.

  • 의존 역전 원칙 (Dependency Inversion Principle)

    • 상위 수준의 모듈은 하위 수준의 모듈에 의존해서는 안 된다. 둘 모두 추상화에 의존해야 한다.

    • 의존성의 순방향 : 고수준 모듈이 저수준 모듈을 참조하는 것

    • 의존성의 역방향 : 고수준, 저수준 모듈이 모두 추상화에 의존하는 것

       

    • 저수준 모듈이 변경되어도, 고수준 모듈에는 영향이 가지 않는다.

 

섹션 5 객체 지향 적용하기

  • 상속과 조합

    • 상속보다 조합을 사용하자!

    • 상속은 시멘트처럼 굳어지는 구조다. 수정이 어렵다.

    • 조합과 인터페이스를 활용하는 것이 유연한 구조

  • Value Object

    • 도메인의 어떤 개념을 추상화하여 표현한 값 객체

    • 값으로 취급하기 위해서, 불변성, 동등성, 유효성 검증 등을 보장해야 한다.

  • 일급 컬렉션

    • 컬렉션을 포장하면서, 컬렉션만을 유일하게 필드로 가지는 객체

    • 컬렉션을 추상화하며 의미를 담을 수 있고, 가공 로직의 보금자리가 생긴다.

    • 만약 getter로 컬렉션을 반환할 일이 생긴다면, 외부 조작을 피하기 위해 꼭 새로운 컬렉션으로 만들어서 반환해주자.

  • Enum의 특성과 활용

    • Enum은 상수의 집합이며, 상수와 관련된 로직을 담을 수 있는 공간이다.

    • 특정 도메인 개념에 대해 그 종류와 기능을 명시적으로 표현해줄 수 있다.

    • 만약 변경이 정말 잦은 개념은, Enum 보다 DB로 관리하는 것이 나을 수 있다.

  • 다형성 활용하기

    • 변하는 것과 변하지 않는 것을 분리하여 추상화하고, OCP를 지키는 구조

  • 추상화와 다형성 활용하여 반복되는 if문 제거. OCP 지키기

  • 숨겨져 있는 도메인 개념 도출하기

    • 도메인 지식은 만드는 것이 아니라 발견하는 것

    • 객체 지향은 현실을 100% 반영하는 도구가 아니라, 흉내내는 것이다.

    • 설계할 때는 근시적, 거시적 관점에서 최대한 미래를 예측하고, 시간이 지나 만약 틀렸다는 것을 인지하면 언제든 돌아올 수 있도록 코드를 만들어야 한다.


발작국 1주차 회고

  • 클린 코드와 객체 지향 설계에 대한 학습을 통해 코드의 가독성과 유지 보수성을 높이는 방법에 대해 많은 것을 배웠습니다. 이론으로만 알고 있던 부분들을 실제 코드를 수정해 가면서 배우니 훨씬 더 이해가 잘 되었던 것 같습니다. 빠르게 제 것으로 만들어 현업 프로젝트에 적용해 보고 싶습니다.

댓글을 작성해보세요.

채널톡 아이콘