분류 전체보기
-
강행돌파는 결국 언젠가 한 번은 해야 한다Today I Learned 2022. 10. 11. 23:59
오후에 홀맨님이 올려주신 미국의 게임 개발자 '존 카맥'이 팟캐스트에서 이야기한 내용을 요약한 글을 보았다. 직접적으로 인용해주신 내용 말고도 흥미로운 내용이 있어 살펴보았다. Q: 어떻게하면 존 카맥 같은 프로그래머가 될수 있나? A: 열심히 하는 수밖에…주당 40시간 일은 파트타임으로 적당. 진지하게 잘 하려면 60시간 이상은 일 해야. 그게 현실이다. 모든 사람이 그렇게 할 필요는 없다. 하지만 훌륭한 걸 만들려면 딴 방법 없다. Q: 어떻게 대단한 것을 만들었나? A: 시스템 레벨의 생각이 중요. 모든 것에 1등일 필요는 없다. 그러나 난 하이 레벨부터 하드웨어까지 스택의 돌아가는 것을 모두 안다. 그럼 전체를 최적화하기 위해 무엇을 희생할지 결정할 수 있다. 새로운 것을 만들려면 이 시스템 레벨..
-
무시무시한 소스코드 중복을 줄이는 메서드화의 힘 (레벨 테스트 6일차 작업 회고)Today I Learned 2022. 10. 10. 23:53
백엔드에서 회원가입 예외처리 로직을 짜는 데 오후 일과 시간을 할애했다. @RequestBody로 전달되는 DTO 데이터들의 상태를 검사해 예외를 처리해줄 수 있을 경우 일차적으로 예외를 발생시키도록 Spring Validation 관련 어노테이션들을 사용했다. DTO에서 @NotBlank와 @Pattern 어노테이션으로 각 데이터가 지정한 유효성에 맞는지 검사하고, 유효하지 않은 결과가 Controller에서 BindingResult의 구현체를 통해 전달되어 오류가 있음이 확인될 경우 오류 메세지를 받아 Exception을 발생시키도록 했다. 테스트에서는 예외에 해당되는 상황이 발생했을 때, 예외를 정상적으로 발생시키는지 테스트를 수행해줘야 했다. 일단은 하나의 테스트 메서드마다 MockMvc를 이용해..
-
성능의 최적화가 오히려 코드 가독성에 좋지 않은 영향을 미칠 수 있다Today I Learned 2022. 10. 9. 23:59
테스트 주도 개발 스터디 3회차에 참여하면서 인상깊게 느꼈던 내용을 정리했다. 다중 통화 로직을 구현하면서 각 환율 간의 변화율을 하나의 쌍으로 갖는 객체 Pair를 정의하고, 해당 Pair 객체의 동등성을 비교하는 테스트 코드를 작성하는 과정이 있다. private class Pair { private String from; private String to; } public boolean equals(Object object) { Pair pair = (Pair) object; return from.equals(pair.from) && to.equals(pair.to); } public int hashCode() { return 0; } 책에서는 hashCode의 값으로 0을 사용할 경우 해시 테이블에..
-
메가테라 웹 개발자 과정 15주차 주간 회고주간 회고 2022. 10. 9. 23:51
메가테라 웹 개발자 과정 15주차를 겪으면서 느꼈던 점들을 정리했다. 레벨 테스트 구현, 어디까지 왔나? 완성까지 2주일의 시간이 주어진 레벨 테스트 1주차가 눈 깜빡할 새 지나갔다. 앞으로 쓸 수 있는 시간은 예비군을 다녀와야 하는 목요일 주간을 제외하면 4일 정도가 남았다. 현재 남아있는 작업으로는 크게 회원가입, 예외처리, 컴포넌트 및 스토어 단위 테스트 작성, 인수 테스트 작성, 도메인 객체에 이미지 URL 데이터 추가, CSS 작업, 문서 정리 정도를 꼽아볼 수 있을 것 같다. 예상했던 것보다 가시밭길이 많았다. 14주차에 고통을 겪으면서 발판을 다져놨기 때문에 이번 레벨 테스트가 양이 좀 더 많긴 해도 비슷한 맥락으로 해낼 수 있겠지? 싶었다. 그러나 진짜 고통은 14주차에 매듭짓지 않고 갔던..
-
@SpyBean, @MockBeanToday I Learned 2022. 10. 8. 23:59
그동안 Spring 백엔드 애플리케이션을 구현하면서 Controller를 테스트할 때 왜 어떤 상황에서는 @SpyBean을 쓰고 어떤 상황에서는 @MockBean을 쓰는 것인지 구체적으로 알지 못한 채 사용하고 있었다. JpaRepository처럼 실제로 인스턴스를 만들어 사용할 수 없는 것이면 @MockBean을 붙이고, 나머지는 모두 @SpyBean을 붙인 뒤에 테스트하는 건가 보다... 정도의 느낌으로 사용하고 있었는데, 의외의 지점에서 혹시 이건가? 싶은 영감이 들었다. 바로 Jest에서 지원하는 함수 중 하나인 jest.spyOn()을 사용해보면서였다. 다음 소스코드 하단부의 테스트 코드에는 changeReceiverInput 함수가 실행되었을 때 publish 함수가 실제로 실행되었는지를 검증..
-
관심사의 분리를 잘 하면 테스트 코드 작성이 수월해진다 (레벨 테스트 5일차 작업 회고)Today I Learned 2022. 10. 7. 22:23
테스트가 잘 만들어지지 않는 이유는 관심사의 분리가 잘 되지 않아서였다 요 며칠 동안 계속 프론트엔드 테스트 코드에 대한 이야기만 하고 있는 것 같다. 하지만 지금 안 하고 넘어간다 한들 언젠가는 결국 고통받을 것이기 때문에 할 수 있을 때 잘 하고 넘어가고 싶었고, 트레이너님께서 찾아오셨을 때 여쭤봤던 것들도 대부분 프론트엔드 테스트 코드에 대한 내용이었다. 오늘은 트레이너님께서 테스트 코드가 잘 작성되지 않을 때에는 기존 소스코드의 관심사가 분리되어 있지 않을 가능성이 있기 때문에 소스코드의 관심사를 분리해야 할 필요가 있다는 말씀을 해 주셨는데, 인상이 깊게 남아 내용을 정리해보고자 한다. 다음은 상품 목록을 렌더링하는 페이지 내 컴포넌트의 예시 소스코드이다. 최종적으로 구현되어야 할 컴포넌트의 U..
-
문서와 테스트는 어느 정도로 심도있게 작성하는 게 맞는 걸까...? (레벨 테스트 4일차 작업 회고)Today I Learned 2022. 10. 6. 23:55
오늘 구현하려 했던 목표는? 예외처리를 제외한 주문, 주문 내역 로직 구현 (계정 개념을 아직 정의되지 않았으므로 잔액 개념은 우선은 임시로 별도의 Store에서 관리하도록 한 뒤, 추후 계정 개념을 만들 때 이관) 어제 트레이너님께서 알려주셨던 Mocking 재할당 관련 이슈를 자정을 넘기고 다시 수정해서 적용해보려 했는데 적용되지 않는 이슈가 계속 발생했다. 더 이상 매달렸다가는 남은 기간 동안의 컨디션에도 악영향을 미칠 것 같아 잠시 롤백시킨 뒤 새로 구현해야 할 부분들을 우선 구현해보기로 했다. (해당 문제는 오늘 프론트엔드에서 새로 구현한 단위 테스트를 작성하던 중 문제를 해결할 수 있는 경우를 찾아 똑같은 방법으로 적용해볼 수 있을지 시도해보려 한다.) 작업을 하면서 프론트엔드의 동작이나 백엔..
-
프론트엔드 단위 테스트에 하루종일 고통받다 (레벨 테스트 3일차 작업 회고)Today I Learned 2022. 10. 5. 23:59
오늘 구현하려 했던 목표는? 상품 목록 조회, 상품 상세 목록 조회 단위 테스트, 인수 테스트 코드 작성 마치고 통과시키기 선물하기 로직 구현을 위한 사전 준비로 로그인 개념 구현, 선물하기 구현 진행 프론트엔드 테스트 중 인수 테스트를 제외한 Component, Store에 대한 단위 테스트는 지난 14주차를 진행하면서 제대로 완성하지 못했었던 옥의 티였다. 일단 오전 시간 동안 상품 목록 조회, 상품 상세 목록 조회 부분의 동작은 로그인과 관련된 것을 제외하면 모두 동작하게 만들었지만, 단위 테스트 구현은 거의 되어있지 않았다. 사실 월요일에 단위 테스트를 위해 Mocking을 무엇을, 어떻게 하는 것이 좋을지 고민했지만 답이 잘 나오지 않아 미뤄두고 있었다. 결국 언젠가는 해야 한다면 지금 확실하게..