이전에 구현한 토이프로젝트를 수정하려구 한다.
토이프로젝트 링크
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;
}
내가 리팩터링할 내용은 두가지이다.
//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 가 다시 생겨 확인할 수 있었다.
리팩터링은 참 좋은 것 같아요 화이팅