본문으로 바로가기

7주 차 미션 : 레거시 코드 리팩터링

 

저장소 : https://github.com/next-step/jwp-refactoring/tree/prodo-developer

 

참조 사이트: 

조영호 님의 우아한 객체지향

킹뽀대 님의 Gradle 멀티 프로젝트 관리

Gradle Multi Project

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#reference

느낀점

  • 레거시 프로젝트를 분석하고 요구 사항을 작성할 수 있다.
  • 기존 요구 사항을 만족하는 테스트 코드를 먼저 작성하여 안정적인 리팩터링을 할 수 있다.
  • @SpringBootTest 통합 테스트를 통해 전체적인 Flow를 쉽게 테스트 가능하다.
  • Gradle의 멀티 모듈 개념을 적용해 자유롭게 서로 다른 프로젝트로 분리하여, MSA 구조를 잠시 경험하게 됨.

이번 과정의 목표 경험

  • 기존 레거시코드에서 JPA로 전환
  • 인수 테스트 기반의 TDD 경험
  • 도메인별 단위 테스트
  • 비지니스별 @SpringBootTest 통합 테스트
  • Gradle 멀티 프로젝트 관리

내 코드 피드백

getMenu가 OrderLineItem.java에서 Menu 엔티티를 제거하고 menuId로 전환하면서 getMenuId로해오는 방식으로 전환했다. 따라서 isRegisteredMenuNotMore 관련 메서드를 삭제하였다.

 

리팩토링하는 과정에서 COMPLETE 상태 확인하는 검증이 있었는데 리팩토링하는 과정에서 검사 하는 로직이 누락이 됐었다.

첫번째로는 기존의 네이티브 쿼리를 다시 살렸다.

하지만 이번 네이티브쿼리는 기존 레거시 코드이기 때문에 리팩토링과 거리가 멀어, 최대한 JPA를 활용하고 싶어

SPRING DATA JPA를 활용하였다.

 

변경된 부분은 아래와 같다.

처음에는 OrderTableRepository에서만 수정을 하려고하니 메인을 바라보는 엔티티가 Order이기 때문에 Order로 변경하였다.

 

package kitchenpos.order.domain;

import kitchenpos.ordertable.domain.OrderTable;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface OrderRepository extends JpaRepository<Order, Long> {
    boolean existsByOrderTableIdAndOrderStatusIn(Long orderTableId, List<OrderStatus> orderStatuses);

    boolean existsByOrderTableInAndOrderStatusIn(List<OrderTable> orderTableIds, List<OrderStatus> orderStatuses);
}
    select
        order0_.id as col_0_0_ 
    from
        orders order0_ 
    left outer join
        order_table ordertable1_ 
            on order0_.order_table_id=ordertable1_.id 
    where
        (
            ordertable1_.id in (
                ? , ? , ?
            )
        ) 
        and (
            order0_.order_status in (
                ? , ?
            )
        )
 select
        order0_.id as col_0_0_ 
    from
        orders order0_ 
    left outer join
        order_table ordertable1_ 
            on order0_.order_table_id=ordertable1_.id 
    where
        (
            ordertable1_.id in (
                ? , ? , ?
            )
        ) 
        and (
            order0_.order_status in (
                ? , ?
            )
        ) limit ?

테스트 성공한 검증

 

 

후기

마지막 미션인 만큼 리팩토링할 양이 상당히 많았었고, 그 만큼 난이도와 부담감이 컸었다.

미션 마감일도 다가오고, 회사를 병행하면서 진행 하다 보니 압박감도 무시할 수 없었다.

 

2달동안 모각코를 하루 빠짐없이 참여한 결과 그 결실을 맺을 수 있었다고 생각하고,

 

마지막 미션이 Merge가 되는 순간 시원섭섭한 부분도 있었다.

 

이번 미션은 양이 많다보니 피드백이 늦어지면 시간이 굉장히 오래걸릴 수 있었는데

 

빠른 피드백과 도움을 주셨던 ssosso리뷰어 님께 진심으로 감사드리며,

 

네이티브쿼리에서 Spring Data Jpa 전환 작업에 큰 도움을 주신 오길환님께 큰 감사드립니다.