개발하다 생긴 일

perfect dish | 이거 만들어볼까? (7) - 테스트와 Flag 추가

로그관리자 2024. 2. 13. 01:33
728x90

🍽 Perfect dish 개발 일지

이 글은 개발 여정을 기록한 것으로 틀린 내용이 나올 수 있습니다. 점점 고쳐나가기 때문이죠 

 

 

💡 Service layer에서 domain을 직접 주입받게 생겼네요

 

요구사항 중에 
MenuBoard에서 commonMenus와 discountMenus에서 메뉴를 가져와 Order에서 주문을 생성하여야 한다. 

메뉴보드의 ㅇ메뉴가 계속해서 바뀔 수 있으므로 

그렇다면 어떤 방법으로 Order에서 MenuBoard에 접근하면 좋을까? 

 

처음에 이걸 생각했다. 

메뉴 보드의 주문 가능한 리스트를 받아와야 하는데 그걸 받아오려고 repository 계층인데 domain 계층인 menuBoard를 주입받는다? 
그리고 commonMenus와 discountMenus를 따로 가지고 와야 한다는 강박(?)이 있었다. 근데 생각해 보니 어쨌든 주문가능상태이기만 하면 되니까 모든 리스트를 가져오고 같은 계층인 OrderRepository에서 나머지 로직을 해결해도 되겠다 판단했다. 

 

+ 주문 가능한 메뉴의 변경이 잦기 때문에 실시간으로 반영하고자 필드가 아닌 메서드에서 메뉴 리스트를 새로 불러옴으로써 데이터 일관성도 고려하였다. 

 

 

 

 

💡 메뉴보드 test를 하며 생긴 일 

 

테스트가 얼마나 중요한가. 를 깨달은 몇 가지 


1.

메뉴 보드는 메뉴에서 메뉴를 가지고 와서 메뉴 리스트에 추가해야 한다. 이번에는 테스트 코드를 작성 시 사용할 더미데이터를 모아 둘fixture 클래스를 하나 새로 팠다. 이상하게 자꾸만 null이 되는 거였다. 

알고 보니 fixture 내의 request에 값 하나를 빼먹어 전체가 넘어가지 않는 거였다. 이런 빨간 줄이 뜨지 않는! 로직이 잘 짜인 거 같은! 이런 류의 드러나지 않은 오류를 발견할 수 있는 게 테스트다. 그래서 더욱 촘촘하게 테스트 코드를 작성하게 되었다. 

 

test를 하며 레이어 마다 필요한 데이터를 fixture로 아예 묶었다. 중복되는 코드를 말끔히 줄일 수 있었다. 
계층마다 중복되는 데이터가 달라서
예를 들면, 메뉴는 아예 메뉴를 만드는 데 메뉴 보드는 request까지만 만든다던가. 그런 이유로  계층별로 다른 fixture가 탄생했다.  

 

 

2.

앗 무한루프가 돌고 있따!

그니까 이게 지금 재귀호출이 된단 말인데 그러니까 아 

이거 이거 if문에서 repository의 commonMenus로 리스트를 받아와서 널체크 했어야지 

 

로직을 수정하였다. 

역시 테스트는 짱이다.. 

 

 

💡 isDiscount flag 적용기 

 

discountMenus에서 메뉴를 받아온다면 주문 시 5프로 할인하는 정책을 추가하였다.

그런데 정작 Order에서는 이 메뉴가 discountMenus에서 온 건지 commonMenus에서 온 건지 알 수가 없었다.

이 두 리스트를 합친 AllMenus에서 메뉴를 받아 오기 때문이다.

 

 

그렇다면 어느 지점에서 isDiscount 여부를 추가하는 게 좋을까?

 

우선 Menu에 isDiscount flag를 만들고 빌더 안에 false로 기본 값을 세팅하였다. 

setter를 지양하고 값이 변경될 때 이유를 명확하게 하기 위해 addDiscount메서드를 추가하였다.

 

이걸 MenuService에서 호출하도록 했다.

이는 menuService -> menuRepository(인터페이스) -> Menu 흐름으로 느슨하게 연결(독립적 로직) 되어 결합도가 깨지지 않게 되었다. 

 

 

그리고 테스트 코드 ~ 제발 

 

 

동시성 문제 ? 발생 일까? (아님)

단건으로 저장할 때는 true로 나오는데

세 개를 동시에 저장하니 맨 앞 데이터만 제대로 저장되고 두 번째부터는 isDiscount가 true로 바뀌지 않음 이슈 ^.^ 

 

discountMenus.ifPresent(가 존재하면 그냥 그 리스트에 더하고) 그다음의 (원래의 discountMenu가 존재하지 않을 경우) 처리 로직을 만들어주지 않아서 getDiscountMenu 했을 때 Optional.Empty가 반환되고 결과적으로 isDiscount도 addDiscount가 적용되지 않아 false가 유지되었던 거였다. 

 

수정하고 보니 앞의 로직은 이거 뭐 

discountMenus가 비었으면 새로운 newList 만들고 거기에 메뉴를 더하고 그걸 discountMenus에 더하고 
아니라면 discountMenus가 존재하면 ???(menus에 menu를 더한다....? )????  뭐..한 거지 ? 

 

각 레이어마다 로직이 잘 돌아가고 있는지 로그를 다 설정해 놓으니 지금으로서는  지저분하긴 하다. 

728x90