인프런 워밍업 클럽 3기 BE 클린코드 & 테스트 - 1주차

인프런 워밍업 클럽 3기 BE 클린코드 & 테스트 - 1주차

회고

1. 코드에 대한 태도의 변화

  • 단순히 작동만 하는 코드가 아니라 읽기 쉽고 이해하기 좋은 코드의 중요성을 깨달았다.

  • 추상화와 구체화를 통해 핵심적인 정보만 남기고 불필요한 정보는 제거하는 습관을 만들어야겠다.

2. 명확한 코드 작성

  • 변수와 메서드의 이름을 축약하지 않고, 명확하고 의미 있게 짓는 연습을 해야겠다.

  • 한 메서드가 반드시 하나의 기능만 수행하도록 구조화하는 습관을 만들어야겠다.

3. 논리적 흐름의 개선

  • 중첩된 조건문과 반복문을 최소화하며, 사고의 깊이를 줄이는 방법을 익히게 되었다.

  • 일찍 return 하거나 메서드를 나누면서 코드의 복잡성을 낮추고 가독성을 높여야겠다.

4. 객체 지향적 사고의 발전

  • 객체의 책임을 명확히 구분하고 객체 간 협력을 통한 프로그래밍이 중요하다는 걸 배웠다.

  • setter와 getter 사용을 자제하며, 객체 내부에서 자체적으로 데이터를 관리하고 변경하는 방식으로 접근하는 습관을 만들어야겠다.

     


    학습 일지 🌱

    추상과 구체

    클린 코드를 왜 쓰는 걸까?

    • 가독성! 읽기 쉬운 코드는 이해하기 쉽고, 유지보수 하기도 쉬워진다.

    • 결국 시간과 비용을 절약할 수 있다.

    프로그램의 개념

    • 프로그램 = 데이터(식재료) + 코드(요리 방법)

    추상화란?

    • 핵심 정보만 남기고 불필요한 정보는 생략하는 과정이다.

    • 구체적인 정보를 간단하고 명확한 이미지로 바꾸는 것이다.

    추상화 레벨의 중요성

    • 정보를 효과적으로 함축하거나 제거하면서 유추가 가능하게 한다.

    • 같은 레벨의 추상화로 일관성을 유지하면 코드 이해가 쉬워진다.

    좋은 이름 짓기 습관

    • 단수와 복수를 확실히 구분하기

    • 이름 줄이지 않기

    • 은어나 방언을 쓰지 않기

    • 좋은 코드에서 아이디어 얻기

    메서드 설계 팁

    • 한 메서드에 한 가지 주제만 담는다.

    • void 대신 의미 있는 반환 값을 고민한다. (테스트가 용이)

    • 매직 넘버와 매직 스트링을 상수로 추출해 명확히 의미 부여한다.


    논리적 사고의 흐름 🧠

    인지적 경제성

    • 뇌 메모리를 덜 쓰게 하기 위해 코드의 깊이(depth)를 줄인다.

    논리 구조의 개선

    • 가능한 한 빨리 return 해서 복잡한 조건문 줄인다. (Early Return)

    • else, switch 등 복잡한 분기문 사용 최소화한다.

    • 중첩된 조건문과 반복문을 최소화하고, 추상화를 통해 코드의 복잡성 낮춘다.

    • 변수는 가까운 곳에서 선언해 이해를 돕는다.

    코드 리팩토링 접근법

    • 메서드를 추출할 때 파라미터는 최소화한다.

    • 공백 라인에도 의미가 있다는 것을 기억하고, 복잡한 로직은 의미 단위로 나눠서 표현한다.

    부정어 사용 줄이기

    • 부정 표현은 최대한 지양하고 긍정적인 단어로 대체한다.

    • 메서드 명에도 긍정적이고 직관적인 표현 사용한다.

    예외 처리

    • 의도된 예외와 예기치 못한 예외 명확히 구분한다.

    • 예외가 발생할 가능성을 최대한 낮춘다. (사용자 입력이나 외부와의 접점)

    • Null 처리 주의하고 Optional을 제대로 활용한다.


    객체지향 패러다임 🚀

    프로그래밍 패러다임의 종류

    • 절차 지향: 순서대로 명령을 처리하는 방식

    • 객체 지향: 객체 간의 협력을 통해 프로그램이 작동하는 방식

    • 함수형: 외부 요인 없이 항상 같은 결과를 내는 순수 함수로 프로그래밍하는 방식

    객체지향의 핵심 개념

    • 객체: 데이터를 추상화한 필드와 이를 처리하는 코드의 결합체

    • 캡슐화: 내부 데이터를 외부로부터 숨기고 일부만 공개해 관리하는 것

    • 다형성: 인터페이스를 통해 다양한 구현체로 교체할 수 있게 설계하는 것

    • 관심사의 분리: 특정 기능과 책임을 명확하게 나누어 높은 응집도와 낮은 결합도를 유지하는 것

    객체 설계 시 주의할 점

    • 객체의 책임을 명확히 정의한다.

    • 외부 세계와 어떤 방식으로 소통할지 고민한다.

    • setter와 getter 사용을 최소화하고, 객체 내에서 데이터 변경을 처리한다.

    • 불필요한 필드는 최소화한다.

    • 데이터는 최대한 불변으로 관리하기 (final 사용 권장).

    객체가 주는 장점

    • 절차 지향에서 잘 드러나지 않는 개념을 명확히 표현할 수 있다.

    • 관심사를 명확하게 구분해 유지보수가 쉬워진다.

    • 객체 간 협력을 통해 높은 추상화 수준에서 로직을 처리할 수 있다.


    SOLID 원칙

    • 단일 책임 원칙 (SRP): 한 클래스는 하나의 책임만 수행하기

    • 개방 폐쇄 원칙 (OCP): 기존 코드를 변경하지 않고 기능 추가하기

    • 리스코프 치환 원칙 (LSP): 부모 클래스를 자식 클래스로 바꿔도 동일한 결과를 보장하기

    • 인터페이스 분리 원칙 (ISP): 인터페이스는 꼭 필요한 메서드만 정의하기

    • 의존 역전 원칙 (DIP): 구체적인 구현체가 아닌 인터페이스(추상화)에 의존하기


    객체지향 실전 적용하기 🌟

    상속 vs 조합

    • 상속보다는 조합을 사용하는 게 좋다.

    • 상속은 유연성이 떨어지지만, 조합은 낮은 결합도로 유연성을 높일 수 있다.

    Value Object vs Entity

    • Value Object: 모든 값이 같아야만 동일한 객체로 취급 (식별자 없음)

    • Entity: 식별자가 같으면 다른 값들이 달라도 동일한 객체로 취급 (식별자 있음)

    일급 시민 (First-class citizen)

    • 다른 요소처럼 변수에 할당하고, 함수의 인자로 전달하거나 반환할 수 있는 요소이다.

    • 함수형 프로그래밍에서 함수 자체가 일급 시민이다.

    일급 컬렉션

    • 컬렉션을 객체로 감싸 하나의 필드로만 관리하는 객체이다.

    • 의미를 명확히 하고 컬렉션 관련 로직을 담을 수 있다.

    • 외부에서 직접 조작하지 못하게, 반환 시 새 컬렉션을 만들어 반환한다.

    Enum 활용법

    • Enum은 특정 도메인 개념을 명시적으로 표현하는 상수의 집합이다.

    • 자주 변하지 않는 개념은 Enum으로, 자주 변경된다면 DB로 관리하는 게 좋다.

    • 실무에서는 Enum에 설명을 위한 필드(description)를 추가하면 좋다.

    다형성 실전 활용

    • 추상화된 스펙을 인터페이스에서 정의하고, Enum을 통해 조건과 행위를 구현체로 관리한다.

    • 유연하고 확장할 수 있는 구조를 만들 수 있다.

    도메인 지식 다루기

    • 도메인 지식은 만드는 게 아니라 발견하는 거라는 점 기억한다.

    • 설계할 때는 근시적, 거시적 관점 모두 고려해서 최대한 미래를 예측한다.

    • 현실을 완벽히 복제하는 게 아니라 유연하게 대응할 수 있는 설계를 목표로 한다.

댓글을 작성해보세요.

채널톡 아이콘