[워밍업 클럽 2기 BE 클린코드&테스트 코드] 1주차 발자국
시작
사실 마감 직전까지 이런 스터디가 있는 줄도 몰랐다. 인프런에서 볼 수 있는 Josh Long의 Spring Boot 밋업이 재밌길래 그걸 보느라 인프런을 들락날락 하다가 우연히 워밍업 클럽 배너를 봤다. 최근 나의 학습 패턴도 예전같지 않고, 마음가짐도 점점 시들어가는 걸 느끼는 와중이었다. 처음에는 CS 스터디를 신청하려고 했다. 다시보니 스프링에서의 테스트 코드 작성에 관한 스터디가 있었기에 바로 노선을 변경했다.
나는 올해 초, 다른 교육기관에서 클린코드와 리팩터링, TDD에 대한 과정을 수료했다. 그 과정에서 배운 점이 많고 지금도 실무에 많이 적용한다. 굉장히 좋은 과정이었지만, 딱 하나 아쉬운 점이 있었다. 해당 과정은 순수 자바로만 진행된다는 것이다. 클린코드와 리팩터링은 순수 자바만으로도 내 실무에 바로 적용할 수 있었다. 하지만 TDD는 그렇지 않다. TDD 그 자체는 깨우쳤는데, 내 실무 코드는 스프링 프레임워크 위에서 논다. 결국, 스프링 기반 프로젝트에서 TDD를 하는 방법은 순수 자바 TDD와는 꽤 많이 달랐다. Layer 별로 개발해야하고, DB 테스트, Mocking 등 다양한 상황과 변수들이 있었고 배운 걸 써먹기에는 한계가 있었다. 이번 스터디를 진행하며, 이전에 배운 클린코드를 복기하고 스프링을 사용한 TDD를 학습하고자 한다.
1주차 학습
1주차에는 추상과 구체, 사고를 줄이는 코드 작성법, 객체지향적인 코드(SOLID)에 대해 학습했다.
클린 코드 파트는 내가 올해 초에 수료한 교육기관의 과정이 지금 우빈님의 수업과 굉장히 유사하다. 그도 그럴 것이, 두 분 다 우아한테크코스에 관련되어 계시기 때문에 커리큘럼과 추구하는 클린 코드가 비슷할 것이라 생각한다. 덕분에 내가 배웠던 것을 잘 복기하고 있다.
추상
1주차에서 가장 중요하다고 생각하는 부분은 추상에 대한 고찰이다. 컴퓨터는 끝없는 추상의 연속이다. 나 역시 개발자는 끊임없이 무언가를 추상화하는 직업이라고 생각한다. 그렇기 때문에 더더욱 추상과 구체에 대해 이해해야한다.
구현체에서 인터페이스를 뽑아내는 것, 변수나 메서드의 이름을 잘 짓는 것도 추상화이다. 구체에서 어떤 개념을 뽑아내는 것이 추상이기 때문에, 추상화된 것들을 보면 구체가 뭘 할 지 대충 예상할 수 있어야 한다. 메서드로 예를 들어보자. 메서드는 메서드 시그니처(메서드 명과 매개 변수 타입&개수)와 구현(내부 코드)으로 나뉘어져 있다. 메서드 시그니처만 보고, 어떻게(How) 구현되어 있는 지 알 수는 없지만 무엇을(What) 해줄 것인 지는 유추할 수 있어야한다. 그렇지 못한 메서드 시그니처는 추상화에 실패한 것이며 이를 사용할 팀원, 미래의 나에게 무례한 것이다.
클린 코드
강의에서는 뇌 메모리 적게 쓰기. 즉, 코드를 읽는 사람으로 하여금 기억해야할 컨텍스트를 줄이는 것이 중요하다고 한다. 이 부분은 매우 동의하고 강의에 나온 것들 모두 실무 개발할 때에도 적극적으로 활용하고 있는 부분들이다. Early Return, 사고의 depth 줄이기, 공백 라인을 대하는 자세, 부정어를 대하는 자세, 해피 케이스와 예외 처리 이다.
개인적으로 Early Return과 사고의 depth 줄이기 부분은 조금 조심해서 적용해야한다고 생각한다.
Early Return
이전에도 Early Return에 대해 학습한 적이 있어서, Early Return을 할 수 있으면 최대한 사용한다. 그런데 커리어 내내
if
,else-if
,else
만을 사용해왔던 내 상사는 이 부분을 잘 이해하지 못한다. 작성한 코드를 곰곰이 쳐다보면, 그냥else
를 사용하는 게 이해하기 쉽겠는데? 하는 부분들이 있다. 또한, 강의에서도 우빈님이else
를 불가피하게 써야할 때가 있다는 뉘앙스로 말씀하셨고, 나 역시 너무너무 억지로 Early Return을 하는 것은 그리 좋은 습관인 것 같지 않다.사고의 depth 줄이기
이 부분도 Early Return과 비슷한 맥락인데, 억지로 depth를 줄이려고 불필요한 메서드를 만들거나 스트림을 사용하게되는 경우가 많다. 스트림을 적극 활용하는 것이 분명 자바 생태계에서 일반적으로 좋지만, 스트림을 잘 모르는 개발자들에게는 조금 난해할 수도 있다. 후배 개발자라면 같이 공부하겠지만 상사가 스트림을 모르면 난처하다..ㅎㅎSOLID
객체지향하면 SOLID는 빼놓을 수 없다. 이에 대해 자세하게 학습하였고, 각각의 원칙을 기존 코드를 리팩터링하며 코드로 적용해보았다. SOLID에 대한 내용은 미션에서 작성하였으므로 생략한다.
객체지향 적용하기
상속과 조합, VO, 일급 컬렉션, Enum 등을 학습하였다. 이 파트는 코드 따라치기가 분량이 너무 많아서 조금 힘들었다. 그래도, 조합에 대해 알아보고 VO, 일급컬렉션, Enum 등 아는 것들을 복기해볼 수 있는 좋은 파트였다. 나도 Enum 사용하는 것을 매우 좋아하는데, Enum을 구현체로 만드는 것은 해보지 못했다. 또, Enum 각각의 구현체를 인라인으로 생성하여 오버라이드하는 것 역시 신기한 방법이었다. Enum의 원리에 대해 다시 공부해보려고 한다.
미션
이번 주 미션은 총 두 개 였으며, 무엇이든 추상화된 것을 구체화해보는 것과, SOLID를 자기 언어로 표현 + 코드 리팩터링이다.
추상화된 것을 구체화
내가 퇴근하면서 생각한 것이라, 퇴근 그 자체를 구체화해봤다. 우리가 퇴근이라고 하면 어쨌든 업무를 마무리하고, 근무지에서 나와서 집으로 향하는 것을 말한다.SOLID를 자기 언어로 표현 + 코드 리팩터링
해당 미션은 인프런 블로그에 좀 자세하게 길게 썼기 때문에 중복된 내용일 것 같다. 개발자는 중복을 제거하는 것도 중요하기 때문에 중복 제거를 위해 작성하지 않고 링크만 첨부하겠다.
아직 1주차라 미션이 꽤 간단했다고 생각한다. SOLID에 대해 다시 고민해보는 것은 꽤 좋은 미션이었다. 취준할 때나 생각하지, 실무에 들어선 이상 SOLID를 지켜가며 개발하긴 어렵다. 하지만 사실 SOLID를 지켜야 리팩터링하기에도 테스트하기에도 갑자기 바뀌는 요구사항에 대응하기에도 좋은 코드라는 것을 너무나도 잘 알고있다. 이번 미션을 계기로 실무에서도 SOLID를 생각해보려고 한다.
댓글을 작성해보세요.