[인프런 워밍업 클럽 3기] BE 클린코드&테스트 - 2주차 발자국

[인프런 워밍업 클럽 3기] BE 클린코드&테스트 - 2주차 발자국

💡 강의 핵심 내용 정리

📝Readable Code

1. 주석의 역할과 사용 원칙

🚫 주석을 최소화해야 하는 이유

  • 주석이 많다는 것은 비즈니스 요구사항을 코드로 잘 표현하지 못한 것을 의미한다.

  • 주석에 의존하면 적절한 추상화 수준을 유지하기 어려워 코드 품질이 낮아진다.

언제 주석을 사용해야 할까?

  • 코드로 표현할 수 없는 의사 결정의 히스토리를 남길 때.

  • 자주 변경되지 않는 정보만 포함하고, 지속적으로 관리해야 한다.

  • 부정확한 주석은 차라리 없는 것보다 나쁘다.


2. 변수와 메서드 정렬 순서

🔍 변수 정렬 원칙

  • 변수는 사용하는 순서대로 배치하여 가독성을 높인다.

📌 메서드 정렬 원칙

  1. 공개 메서드 (public) 먼저 배치

    • 상태 변경 > 판별 > 조회 순으로 배치.

    • 같은 기능을 하는 메서드는 그룹화하여 정렬.

  2. **비공개 메서드 (private)**는 공개 메서드에서 호출하는 순서대로 정렬.


3. 코드 리팩토링 & 가독성 향상

🏗 주석 없이 코드로 의미 전달하기 (Enum 활용)

java복사편집// 

기존 코드 private int gameStatus = 0; // 0: 게임 중, 1: 승리, -1: 패배 // ✅ 개선 코드 public enum GameStatus { IN_PROGRESS("진행 중"), WIN("승리"), LOSE("패배"); }

🎯 객체 역할 분리

  • GameBoard → 게임 진행 및 로직 담당 (비즈니스 로직)

  • MineSweeper → 사용자 입력/출력 제어 (컨트롤러 역할)


4. 패키지 구조 개선

📌 패키지는 "문맥"을 제공한다

  • 유지보수를 고려하여 적절한 수준으로 패키지를 나눈다.

  • 패키지 변경은 팀원과 협의 후 진행하는 것이 좋다.


5. IDE 도구 활용

코드 자동 정렬

  • Option + Command + L (Mac, IntelliJ)

🔍 코드 품질 유지 도구

  • SonarCube, lint (ESLint, ktlint)

  • .editorconfig를 활용해 일관된 코드 스타일 유지


6. 오버 엔지니어링 방지

🚫 불필요한 추상화 & 인터페이스 남발

  • 구현체가 하나뿐인 인터페이스는 불필요한 경우가 많다.

  • 추상화를 도입하면 정보가 숨겨지므로 복잡성이 증가.

  • 필요 이상으로 정보를 숨기면 코드 유지보수가 어려워진다.


7. 실무에서 코드 품질 vs 빠른 개발

균형 잡힌 선택이 필요하다

  • 완벽한 코드보다 실용적인 코드가 중요하다.

  • 클린 코드를 목표로 하되, 현실적인 개발 속도도 고려해야 한다.

  • TODO 주석 등을 활용하여 미래 리팩토링을 위한 가이드 남기기.


8. 결론: "완벽한 코드"는 없다

  • 클린 코드도 은탄환이 아니다. 적절한 수준에서 적용하는 것이 중요하다.

  • 테스트 코드도 잘 관리하지 않으면 오히려 유지보수 부담이 될 수 있다.

  • 가장 중요한 것은 도메인 지식을 늘리고, 코드가 어떤 비즈니스 요구사항을 해결하는지 파악하는 것


💻Practical Testing

1. 테스트 코드의 필요성

🤔 왜 테스트 코드가 중요한가?

  • 자동화된 테스트를 통해 빠르고 정확한 피드백 제공.

  • 사람이 직접 테스트하면 비효율적이고 실수가 발생할 가능성이 높음.

🚫 수동 테스트의 문제점

java복사편집@Test
void add_manual_test() {
    CafeKiosk cafeKiosk = new CafeKiosk();
    cafeKiosk.add(new Americano());

    System.out.println(">>> 담긴 음료 수 : " + cafeKiosk.getBeverages().size());
}

사람이 직접 확인해야 하므로 자동화되지 않고 오류가 발생할 가능성이 높음.

JUnit5 & AssertJ 활용한 자동화 테스트

java복사편집@Test
void add() {
    CafeKiosk cafeKiosk = new CafeKiosk();
    cafeKiosk.add(new Americano());

    assertThat(cafeKiosk.getBeverages()).hasSize(1);
    assertThat(cafeKiosk.getBeverages().get(0).getName()).isEqualTo("아메리카노");
}

자동화된 검증을 통해 일관성 유지
테스트 실패 시 바로 원인 파악 가능


2. 테스트 케이스 설계

🔍 경계값 테스트

  • 범위 (이상, 이하, 초과, 미만), 구간, 날짜 등 고려하여 테스트 설계.

     


    💡 미션 Day 7

    이번주 미션은 StudyCafe 라는 프로젝트(스터디 카페 이용권 구매 서비스)를 리팩토링하는 미션이었다.


    하지만, 시간이 부족하여 내 자신이 만족할 만한 코드를 작성하지 못하였고, 계속 수정하다가 결국 마감 시간 보다도 늦게 제출하고 말았다...
    이후에, 중간점검 날 다른 분들의 피드백도 보고 깨달은 바가 많았다. 꼭 다시 새로운 마음으로 리팩토링 하여 마감 기한에 상관 없이 다시 제출해보고, 지금 작성 중인 2주차 발자국에도 내가 어떤 과정 및 생각으로 미션을 수행했는지 업데이트 할 것이다.


    💡 한주 회고

    이번 한주도 엄청 바빴다. 읽기 좋은 코드 강의를 마무리하고 새로 테스트 코드 강의로 들어섰다. 이전 회사에서 테스트 코드를 제대로 짜본 적이 없고 또 그럴 환경이 뒷바쳐 주지 못해서 작성하지 못하였다. 그래서, 테스트 코드에 대한 갈증이 더욱 컸다. 이번 기회에 제대로 배우고 시야를 넓혀가야겠다. Day 11 미션에는 꼭 강사님께 코드 리뷰 제출까지 해봐야겠다. 화이팅!!

댓글을 작성해보세요.


채널톡 아이콘