프로젝트 리팩터링 - 기능수정

꾸준하게 달리기~·2023년 10월 25일
0
post-thumbnail

들어가기 앞서

이전에 구현한 토이프로젝트를 수정하려구 한다.

토이프로젝트 링크
https://github.com/ingeon2/soloSpringProject

물건들의 재고가 update되면,
기존에 있던 balance라는 잔액이 하나의 객체로 존재하며 변동된다.

예시는 다음과 같다.

물건 a 구매가 100 판매가 200
물건 b 구매가 50 판매가 100

현재잔액 2000 (하나의 객체)

물건 a 2개구매 b 6개 판매

현재잔액 2000-200+600 -> 2400




변경 이전

기존에 잔액이 만들어지는 과정은 다음과 같다.
포스트맨에 요청하면

컨트롤러 단위에서
postBalance() 가 실행되고

@PostMapping
@ApiOperation(value = "잔액 등록", notes = "재고 등록 API, 잔액은 단 한번만 등록") // Swagger에 사용하는 API에 대한 간단 설명
public ResponseEntity postBalance() {
		Balance createBalance = balanceService.createBalance(100000000);
        URI location = UriCreator.createUri(BALANCE_DEFAULT_URL, createBalance.getAmount());
        return ResponseEntity.created(location).build();

}

service로직에서 createBalance() 가 실행되어 초기 잔액이 결정이 된다.

    public Balance createBalance(int initialAmount) {
        Balance balance = new Balance();
        balance.setBalance_id(1L);
        balance.setAmount(initialAmount);
        balanceRepository.save(balance);

        return balance;
    }




변경할 내용

내가 리팩터링할 내용은 두가지이다.

  1. 나는 회사의 잔고는 하나의 객체로 관리하려고 했다.
    지금 이 상황에서는 한번만 post요청을 보내 하나만 만들고 사용해도 되지만,
    여러번 post요청을 보내는 상황을 막아두는것이 누가봐도 훨씬 더 현명한 대처라 리팩터링을 실행했다.
    (이미 잔액이 요청하는지 판별해주는 로직을 getBalance 로 만들었고, 다음과 같다)
    //balance존재 여부 체크
    public int getBalance() {
        Balance balance = balanceRepository.findById(1L).orElse(null);
        return (balance != null) ? balance.getAmount() : 0;
    }




2. 이전엔 postBalance()를 보면, 내가 잔액을 100000000으로 정해놓았지만, 이제 post요청시 잔액을 지정하도록 수정했다.

그렇게 두가지 기능을 추가해서 바뀐 postBalance()는 다음과같다.
이미 존재하면 만들지 않도록 + 내가 액수 자체를 설정할 수 있도록 수정했다.

    @PostMapping("/{amount}")
    @ApiOperation(value = "잔액 등록", notes = "재고 등록 API, 잔액은 단 한번만 등록") // Swagger에 사용하는 API에 대한 간단 설명
    public ResponseEntity postBalance(@Positive @PathVariable("amount") int amount) {
        int existingBalance = balanceService.getBalance();
        //getBalance -> 있으면 잔액을 반환하고, 없으면 0을 반환
        if(existingBalance == 0) { //지금 잔액 객체 자체가 없다면 생성
            Balance createBalance = balanceService.createBalance(amount);
            URI location = UriCreator.createUri(BALANCE_DEFAULT_URL, createBalance.getAmount());
            return ResponseEntity.created(location).build();
        }

        //있다면 생성말고 존재한다고 return
        return ResponseEntity.badRequest().body("잔액 이미 존재합니다");

    }




결과

잔액을 5000원으로 아래와 같이 post요청을 보내고,

위와 같이 생성된 것을 볼 수 있다.


근데, 이미 존재하는 잔액 객체 자체를 하나 더 생성하면 아래와 같이 허용해주지 않는다 ㅎㅎ

(요청을 보내도 잔액이 이미 존재한다고 돌아오고, 잔액 객체는 생성되지 않는다!)




실행하며 맞닥뜨린 부분

오랜만에 토이프로젝트를 실행시켰는데,
mysql Unknown database 'DB명' 라는 에러가 나왔다.
yml에서 DB를 아래 사진과 같이
AWS 서버용에서 로컬용으로 바꿨는데도 왜그러지? 했는데,

생각해보니 이전에 서버에서 실행시키느라
로컬 임베디드 MySQL의 DB는 지워서 저런 오류가 나왔던것 같다.

그래서 DB콘솔에서
create database test; 명령어를 실행해줬고,

위의 사진과 같이 test라는 db 가 다시 생겨 확인할 수 있었다.

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

2개의 댓글

comment-user-thumbnail
2023년 10월 27일

리팩터링은 참 좋은 것 같아요 화이팅

1개의 답글