![[인프런 워밍업 클럽 3기] BE 클린코드&테스트 - 2주차 발자국](https://cdn.inflearn.com/public/files/blogs/56633554-f5a3-4297-9d5d-222c46c72a73/스크린샷 2025-03-16 오후 11.53.00.png)
[인프런 워밍업 클럽 3기] BE 클린코드&테스트 - 2주차 발자국
💡 강의 핵심 내용 정리
📝Readable Code
1. 주석의 역할과 사용 원칙
🚫 주석을 최소화해야 하는 이유
주석이 많다는 것은 비즈니스 요구사항을 코드로 잘 표현하지 못한 것을 의미한다.
주석에 의존하면 적절한 추상화 수준을 유지하기 어려워 코드 품질이 낮아진다.
✅ 언제 주석을 사용해야 할까?
코드로 표현할 수 없는 의사 결정의 히스토리를 남길 때.
자주 변경되지 않는 정보만 포함하고, 지속적으로 관리해야 한다.
부정확한 주석은 차라리 없는 것보다 나쁘다.
2. 변수와 메서드 정렬 순서
🔍 변수 정렬 원칙
변수는 사용하는 순서대로 배치하여 가독성을 높인다.
📌 메서드 정렬 원칙
공개 메서드 (
public
) 먼저 배치상태 변경 > 판별 > 조회
순으로 배치.같은 기능을 하는 메서드는 그룹화하여 정렬.
**비공개 메서드 (
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 미션에는 꼭 강사님께 코드 리뷰 제출까지 해봐야겠다. 화이팅!!
댓글을 작성해보세요.