새소식

반응형
250x250
My Study/Java

신입 개발자의 기록 [11/24 ~ 11/28]

  • -
728x90
반응형

ERD 설계는 어려운 것 같다.

 

이번엔 ERD 설계에 대해 알아보고 이커머스 or 금융상품에 대해 적어도 3개 이상 선택 후 테이블 작성

및 REST API 만드는 것이었다. 

무작정 설계하는 것보다 먼저 알아보고 설계를 하는 것이 나아보여 조사를 먼저 해봤다.

 

ERD?

 

Entity Relationship Diagram으로 개체 속성과 개체 간의 관계를 그림 또는 도표로 표현한 것이다.

데이터의 흐름과 연관성을 이해하는데 매우 중요한 역할을 한다.

 

작성하는 이유로는 쉽게 두 가지가 있다

1. 테이블의 구조를 시각적으로 한눈에 볼 수 있게 해 이해하기가 쉽다.

2. 관계와 관계간의 정보를 나타냄으로 어떤 테이블의 구조로 만들어졌는지 파악할 수 있다.

 

 

나는 학원에 있을 때 펀딩사이트 만드는 프로젝트를 한 경험이 있어 이번엔 금융상품 쪽을 골라봤다.

내가 선택한 세 가지의 금융 상품은 예금, 적금, 카드였다.

 

 

내가 설계한 ERD인데 먼저 회원과 계좌 테이블이 있어야할 것 같았다. 또한 예금, 적금, 카드 테이블이 필요하다고 생각해 각각 만들어줬다.

 

그 다음 거래 식별자 테이블인데 우리가 카드를 쓰거나 이체를 하면 기록이 남듯이 그 기록을 보관할 테이블이 필요하다고 생각했고 그 테이블이 거래 식별자 테이블이다.

 

예금, 적금, 카드는 각각 하나의 예금, 적금, 카드가 여러 명의 회원을 가질 수 있기에 중간에 해소 테이블도 만들어줬다.

 

지금 올린 ERD는 완벽하게 만들지는 않아서 API를 만들며 더 수정을 해야할 것 같다.

 

만든 코드들 중 몇 개를 보면

@Override
    @Transactional
    public ResponseDTO createDeposit(DepositDetailDTO depositDetail) {

        AccountDTO account = new AccountDTO();
        account.setBalance(depositDetail.getBalance());
        account.setCustomerCode(depositDetail.getCustomerCode());
        account.setAccountType(depositDetail.getAccountType());

        accountService.insertAccount(account);
        int sequence = accountMapper.getSequence();
        String accountCode = "ACC" + sequence;
        depositDetail.setAccountCode(accountCode);
        depositMapper.createDeposit(depositDetail);

        return new ResponseDTO(HttpStatus.CREATED, "예금 생성", null);
    }

 

예금을 생성할 때 계좌를 같이 생성해주는 로직이다.

 

@Override
    @Transactional
    public ResponseDTO insertAccount(AccountDTO account) {

        ResponseDTO responseDTO = new ResponseDTO(HttpStatus.BAD_REQUEST, "insert 실패", null);

        // 계좌번호 생성
        StringBuilder sb = new StringBuilder();

        sb.append(((int) (Math.random() * 999999)));
        sb.append("-");
        sb.append(((int) (Math.random() * 99)));
        sb.append("-");
        sb.append(((int) (Math.random() * 999999)));
        String accNum = sb.toString();
        int count = accountMapper.countAccountNum(accNum);

        // 계좌번호가 중복되지 않았을 때
        if(count == 0) {
            account.setAccountNumber(String.valueOf(sb));
            accountMapper.insertAccount(account);
            responseDTO.setStatus(HttpStatus.CREATED.value());
            responseDTO.setMessage("insert 성공");
        }

        return responseDTO;
    }

 

계좌를 생성하는 로직이다. 계좌번호를 생성하는 것은 조금 더 좋은 방법을 찾아봐야 할 것 같다.

 

@Override
    @Transactional
    public ResponseDTO payment(TransactionDTO transaction) {

        int amount = transaction.getTransactionAmount();
        String accountCode = transaction.getAccountCode();

        int balance = accountMapper.getBalance(accountCode);
        if(balance >= amount) {
            Map<String, Object> map = new HashMap<>();
            map.put("amount", amount);
            map.put("accountCode", accountCode);
            transactionMapper.payment(transaction);
            accountMapper.payment(map);
            return new ResponseDTO(HttpStatus.CREATED, "결제 성공", null);
        } else {
            return new ResponseDTO(HttpStatus.INTERNAL_SERVER_ERROR, "잔액 부족", null);
        }

 

마지막으로 결제를 하는 로직이다. 현재 가지고 있는 잔액보다 결제금액이 크면 500 에러를 반환하고

결제 금액이 잔액보다 작으면 결제를 하고 계좌 잔액을 줄이는 로직이다.

 

 

 

이렇게 ERD 설계 및 API 생성도 무사히 마칠 수 있었다.

 

728x90
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.