인프런 워밍업 클럽 백엔드 1주차 후기
내가 워밍업 클럽을 신청한 이유
우선 나는 백엔드 개발자로 재직한지 갓 1년이 된 몹시 주니어인 개발자이다.
아직 1년 차인 내가 왈가왈부할 실력도 아니고, 다른 회사의 환경을 경험을 한 건 아니지만, 우리 회사의 환경은 뭐랄까.. 내가 공부한 내용과는 괴리가 컸다. Spring Boot를 공부했지만 Spring legacy 환경을 쓰고 있고, JPA를 공부했지만 오직 Mybatis로 구성된 환경이다. (지금 계속 개선되고 있지만 배포도 아직 FTP로 많이 한다...ㅠ)
내가 겪은 어려움은 Mybatis를 사용하면서 VO 개념도 쓰고 있긴 하지만, 대부분의 반환 타입이나 매개 변수로 단순한 Map 타입의 객체를 받아서 이를 컨트롤러나 서비스 객체에서 get() 또는 put() 메서드를 활용해서 단순히 절차지향적으로만 쓰는 느낌이 강했다. '오브젝트'와 '객체 지향 사실과 오해' 같은 객체지향 관련한 명저를 읽으면서 객체지향 찍먹을 해봤기에 아직 초급 단계도 못 벗어난 내가 봐도 이거는 자바를 잘 쓰고 있는 느낌을 못 받았었다. 이에 회사 코드를 리팩토링을 시도했지만, 나도 결국 한낱 초보자라 결국 선배들과 비슷한 코드를 작성하며 흘러가고 있는 것이 나에게 큰 고민거리였다.
이렇게 리팩토링에 대한 갈망만 가진 채 회사를 다니던 중 우빈님의 강의 'Readable Code'를 발견하게 되었고, 소개 영상과 목차를 통해 강의를 수강하기로 마음 먹었다. 또한 운이 좋게도 이번 워밍업 클럽 과정에 속한 것을 발견하게 되었고, 나와 같은 고민을 가진 분들과 소통하고 싶어 신청하게 되어 열심히 들으며 많은 가르침을 얻고 있는 중이다.
추상의 중요성
먼저 강의 시작의 asis의 지뢰찾기 코드를 한 번 보고 충격 받았다. "우리 회사 코드랑 흡사하구나?" 모든 비즈니스 로직이 한 메서드에 들어 가 있는 "조상" 코드를 보며 이것을 어떻게 읽기 좋게 바꿀 것인지가 몹시 궁금해졌다. 그리고 추상이란 행위가 프로그래밍에 있어서 많이 중요함을 느꼈다. 어떤 식으로 이름을 지어줘야 후손이 쉽게 읽을까에 대한 고민을 하게 되었고, 당장에 i, temp 같은 땜빵용 변수명, 메서드명들을 찾아 코드를 읽어보며 의미있게 변경해봤다. 이것만 해보아도 코드 흐름을 상당히 편히 읽히게 할 수 있겠구나 느꼈다.
객체 지향의 중요성
객체 지향에 대해서 많은 것을 배울 수 있었다. 특히 일급 컬렉션에 대해서는 이번 개발에 바로 적용해서 써먹어 보았다.
이번에 개발할 때 어떤 리스트 컬렉션을 만들어서 데이터를 순회해서 가공했어야 했는데, 이를 일급 컬렉션 객체를 만들어 해당 객체 안에서 추상화된 메시지만 던져 수행시키니 훨씬 응집도가 높아졌고, 호출하는 쪽은 내부 로직은 신경 안 써도 된다는 점에서 이런 것들이 객체 지향의 초석이구나를 느낄 수 있었다. 나의 인프런 온라인 스승님 "김영한" 님의 강의 명언 중 하나인 "백문이불여일타", 보지만 말고 쳐보는 것이 중요함은 이런 것임을 느꼈고 앞으로 강의에서 배운 점은 바로바로 써먹어볼까 한다
미션 수행
Day 4의 미션은 코드를 리팩토링 하는 것이었는데, 강의에서 너무 잘 알려주셔서 어렵지 않게 풀어볼 수 있었다.
public boolean validateOrder(Order order) {
if (order.getItems().size() == 0) {
log.info("주문 항목이 없습니다.");
return false;
} else {
if (order.getTotalPrice() > 0) {
if (!order.hasCustomerInfo()) {
log.info("사용자 정보가 없습니다.");
return false;
} else {
return true;
}
} else if (!(order.getTotalPrice() > 0)) {
log.info("올바르지 않은 총 가격입니다.");
return false;
}
}
return true;
}
위와 같이 indent가 깊고, if-else로 되어있다보니 이전의 문맥(컨텍스트)를 머릿속에 계속 담아야 하는 불편함이 있었다.
또한 order의 변수들을 getter로 꺼내서 호출하는 쪽에서 내용을 판단하는 아주 무례한(?) 행동을 하고 있었다.
우빈님 강의에서 언급했듯이 뇌 메모리를 적게 쓰는 방향으로 리팩토링 하도록 노력하였다.
public boolean validateOrder(Order order) {
// 조기 종료
if (order.hasNotItems()) {
log.info("주문 항목이 없습니다.");
return false;
}
// 올바르지 않은 총 가격이면 조기 종료
if (order.isTotalPriceNotValid()) {
log.info("올바르지 않은 총 가격입니다.");
return false;
}
// 사용자 정보 없으면 조기 종료
if (order.hasNotCustomerInfo()) {
log.info("사용자 정보가 없습니다.");
return false;
}
// 여기까지 오면 정상 종료
return true;
}
다음과 같이 수정하였는데, early return을 통해 유효하지 않으면 빨리 종료 시키도록 하여 if-else를 없앴고, order에게 메시지를 보내 묻는 형태로 바꾸어서 더는 getter로 꺼내 쓰지 않도록 해보았다.
후기
1주일 만에 강의를 통해 정말 많은 것을 느낄 수 있었다. 이를 통해 내가 아직 더 성장할 여지가 많다는 것도 느꼈고, 공부를 통해 회사 코드를 개선해보면서 후대에 이로움만 남겨줘야 겠다는 강한 동기도 얻었다. 다음 주차도 열심히 해봐야겠다.
아자아자 화이팅!
댓글을 작성해보세요.