혼자 하는 Spring 프로젝트 - 4 : TDD를 통한 코드 작성 (Service, Repository)

꾸준하게 달리기~·2023년 7월 17일
0

솔로 프로젝트

목록 보기
4/11
post-thumbnail

저번에는 repository 의 테스트코드를 작성했다.
https://velog.io/@dlsrjsdl6505/%ED%98%BC%EC%9E%90-%ED%95%98%EB%8A%94-Spring-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-3-Entity%EB%B3%84-%ED%95%84%EC%9A%94-%ED%81%B4%EB%9E%98%EC%8A%A4-%EC%B6%94%EA%B0%80-TDD%EB%A5%BC-%ED%86%B5%ED%95%9C-%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1
아직 서비스로직, 컨트롤러 단계의 테스트코드가 남았다.

변경점

지금까지 만든 후에, 갑자기 든 생각이
어.. 그럼 회사 전체의 잔액은 어떻게 해야하지?
어떤 Product를 사고 팔때에도,
어떤 Member가 물건을 사고 팔때에도,
Product와 Member과는 관계없이
회사의 잔고는 똑같은 곳에 +-가 되어야 한다.

그래서 처음에는,
오우 그러면 하나의 객체만 사용해서 singleton으로
만들면 되겠네!~ㅋㅋ 나 천재인가?

라고 생각하고

처음에는 위의 방식으로 싱글톤 객체를 사용해서 만들면 되겠지 라고 생각했다.

그런데 이렇게 만들고 나니까, 음.. JPA에는 어떻게 저장될것이며
내가 생각한 하나의 객체 라는게 pojo가 아닌 Spring을 사용해야하는데..?
그리고 스프링 자체가 싱글톤 컨테이너로 만들어주는거 아니었나..?
라는 생각도 들었다.

그리고 조금 더 생각해보니.
JPA를 통해 엔터티를 만들고 나서, 해당 엔터티 릴레이션의 튜플을 하나만 만들면 될것같다! 라는 생각이 들었다.
하나의 테이블에 하나의 행만 있고, 변경 로직이 있을떄
해당 행만을 가지고 실행한다면,
내가 생각한대로
회사의 잔고는 하나고, 어디서 변경로직이 생기던지간에 해당 잔고에 영향을 주면 된다.
가 될 수 있다고 생각했고, 그렇게 만들었다.
방금 말한대로 balance 클래스를 아래와 같이 고치고,

balanceService 클래스는 아래와 같이 만들었다.
(createBalance는 단 한번만 사용, 나머지 로직들은 오직 id가 1L일때 사용되도록 작성)

memberService

이외에도
productService,

balanceService(위에 존재.)를 이렇게 만들었다.

balance 클래스를 다시한번 자세히 설명하자면,
멤버 1이 2의 물건을 사는 경우,
멤버 3이 5의 물건을 파는 경우, 이러한 경우와 상관 없이
회사의 잔고는 단 하나의 데이터로 관리되어야 하므로,

회사 전체의 잔액을 balance 클래스로 만들었고, 해당 클래스의 amount 필드로 잡았다.

balance 엔티티 id를 1L로 만들고 createBalance를 단 한번만 사용하여,
모든 balance의 업데이트는 1L로 해줄 생각이다. (단 하나의 Row만 존재하면 되므로)

여기까지가 처음에 생각했던 계획과 변경된 점이다.

balance Repository 테스트코드


이렇게 초기 데이터를 집어넣는 sql문을 작성하고,
해당 sql문을 아래의 @Sql 애너테이션을 통해 경로를 작성했다.

잘 저장되는지의 테스트코드를 작성했다.

Service 테스트코드

balance

각각 데이터와 테스트코드이다. Service 클래스를 보고왔다면 어려울 내용이 없다.

member

각각 데이터와 테스트코드이다. 마찬가지로 Service 클래스를 보고왔다면 어려울 내용이 없다.

product

여기서는, productService의 sellProduct 매서드를 보면,
물건을 팔면 각각 세개 service 클래스에서 한가지씩 일이 일어난다.

  • productService에선 물건의 재고를 변경한다.
  • memberService에선 해당 물건을 판 member의 result를,
    판매량 * 판매가 만큼 더해준다
  • balanceService에선 판매량 * 판매가 만큼 회사의 총 잔액인 amount 를 갱신해준다.

이렇게 세가지 일이 일어나기 때문에,
productService 클래스에서는 memberService와 balanceService를 DI 받고, sellproduct 매서드에선 해당 DI받은 클래스를 사용하여 총 위의 세가지 로직을 같이 수행한다.

그래서 SQL문을 보면 세가지 테이블에 튜플을 각각 하나씩 다 생성해준 것이다.

그리고 테스트코드는, 아래와 같이 작성했다.

마무리

여기까지 repository와 service로직의 코드와 테스트코드를 완성했고,

해당 로직들을 테스트 성공시킬 수 있었다.
다음 단계는 controller 코드를 짜고, mock객체를 사용하여 해당 코드를 테스트 해봐야겠다.

profile
반갑습니다~! 좋은하루 보내세요 :)

2개의 댓글

comment-user-thumbnail
2023년 7월 17일

잘봤습니다. 좋은 글 감사합니다.

답글 달기
comment-user-thumbnail
2023년 7월 17일

저도 개발자인데 같이 교류 많이 해봐요 ㅎㅎ! 서로 화이팅합시다!

답글 달기

관련 채용 정보