우테캠 회고- 레거시 코드 리팩터링

김병호·2021년 7월 18일
1

https://github.com/next-step/jwp-refactoring/tree/etff

끝판왕이 왔다! 분량이며 난이도가 정말 높았던 미션이다.
치킨집라는 도메인을 두고 서비스 리팩터링을 하는 미션이다. 레거시 코드로부터 치킨집을 지키야 한다.

처음에는 도메인 분석이다. DDD 전략적 설계에서 업계 관계자들이 쓰는 용어를 정리하는 작업을 할 것을 소개하고 있다. README 파일에 용어를 정리하는 작업을 했다.

요구 사항과 용어사전을 만들었으면 테스트 만들기이다. 리팩터링은 좋은 작업이다. 하지만 테스트를 통해 내가 한 작업이 제대로 작동될 것이라는 보장이 있어야한다. 이번에 내가 실수한점은 Mock에 너무 의존을 했다는 점이다.

처음 내가 작성한 테스트이다.

   @Nested
    @DisplayName("create 메서드는")
    class Describe_create {

        @Nested
        @DisplayName("메뉴가 주어지면")
        class Context_with_menu {
            final Menu givenMenu = new Menu();

            @BeforeEach
            void setUp() {
                MenuProduct menuProduct1 = new MenuProduct();
                menuProduct1.setQuantity(1);
                MenuProduct menuProduct2 = new MenuProduct();
                menuProduct2.setQuantity(1);

                Product product1 = new Product();
                product1.setPrice(BigDecimal.valueOf(1000));
                Product product2 = new Product();
                product2.setPrice(BigDecimal.valueOf(1000));

                givenMenu.setPrice(BigDecimal.valueOf(1000));
                givenMenu.setMenuProducts(Arrays.asList(menuProduct1, menuProduct2));

                when(menuGroupDao.existsById(any()))
                        .thenReturn(true);
                when(productDao.findById(any()))
                        .thenReturn(Optional.of(product1));
                when(productDao.findById(any()))
                        .thenReturn(Optional.of(product2));
                when(menuDao.save(any(Menu.class)))
                        .thenReturn(givenMenu);
            }

            @Test
            @DisplayName("주어진 메뉴를 저장하고, 저장된 객체를 리턴한다.")
            void it_returns_saved_menu() {
                Menu actual = menuService.create(givenMenu);

                assertThat(actual).isEqualTo(givenMenu);
            }
        }

계층형 테스트를 작성했는데 지금봐도 너무 길다. 이해는 잘될까 그런 생각도 든다. 예외케이스까지 고려를 하니 테스트 파일이 정말 길어졌다. 리뷰어가 봤을때는 어떨까.

그래서 처음부터 다시했다. 워낙 분량이 많아서 다시하는것도 체력소모가 컸다.
https://blog.kingbbode.com/52

글을 정독하고 다시 작성했다.

이번 미션에서 내가 잘못했던 것은 Mock에 너무 집착한 것이다. 익숙하기도 했기때문인데, Mock의 문제점을 느꼈다. 리팩터링을 하며 나는 내부 구현을 JPA로 변경하였다. 내부 구현이 바뀌어서 Mock의 결과값도 수정을 해야겠다. 구현에 맞춰서 작업을 하다보니 테스트에 까지 변경이 발생했다.


전문가의 조언을 들었다. 이번에 절실히 느끼게되었다. 다음에 레거시 리팩터링을 하게되면 통합 테스트를 만들어야겠다.

JPA를 쓰면 편하다. 하지만 편함속에는 경계할 것들이 있기마련이다. 객체간의 의존성을 어떻게 끊을 것인가를
많이 고민하게 되었다.
우아한객체지향 조영호님의 발표를 바탕으로 리팩터링을 진행했다. 하지만 정말 쉽지않았다. 몇가지 로직들은 도메인 이벤트로 처리를 했지만 그래도 정말 종속적인 의존성들을 덜어내기가 쉽지가 않았다.

도메인별로 분리를 했으니, 멀티모듈로 분리하게되었다. 이것도 삽질을 많이 했다

정말 힘들었다. 고생한 만큼 배운 것도 많았다. 이번 미션은 소스 분석과 더 좋은 방법들을 고민할 생각이다.

profile
노력하는 개발자입니다!

0개의 댓글