[스프링부트] 12. bankv1 - detail : refactored

문정준's avatar
Mar 27, 2025
[스프링부트] 12. bankv1 - detail : refactored
✏️

DTO를 유저 정보 (state), 이체 내역 (List)이 한 번에 담기게 작성

  • 계좌 주인 정보 (TransferUserDTO)
  • 계좌 이체 내역 (TransferListDTO)
  • 화면에 뿌릴 실제 DTO (DetailDTO2)
 

6️⃣ 계좌 내역 (상세 보기)

화면
{{>layout/header}} <!--마진 : mt, mr, ml, mb (1~5) ex) mt-5--> <div class="container mt-2"> <div class="mt-4 p-5 bg-light text-dark rounded-4"> <p>{{models.accountOwner}}님 계좌</p> <p>계좌번호 : {{models.accountNumber}}</p> <p>계좌잔액 : {{models.accountBalance}}원</p> </div> <div class="mt-3 mb-3"> <a href="/account/{{models.accountNumber}}?type=전체" class="btn btn-outline-primary">전체</a> <a href="/account/{{models.accountNumber}}?type=입금" class="btn btn-outline-primary">입금</a> <a href="/account/{{models.accountNumber}}?type=출금" class="btn btn-outline-primary">출금</a> </div> <table class="table table-hover"> <thead> <tr> <th>날짜</th> <th>출금계좌</th> <th>입금계좌</th> <th>금액</th> <th>계좌잔액</th> <th>출금/입금</th> </tr> </thead> <tbody> {{#models.detailList}} <tr> <td>{{createdAt}}</td> <td>{{wNumber}}</td> <td>{{dNumber}}</td> <td>{{amount}}</td> <td>{{balance}}원</td> <td>{{type}}</td> </tr> {{/models.detailList}} </tbody> </table> </div> {{>layout/footer}}
Codes
AccountController
@GetMapping("/account/{number}") public String detail(@PathVariable("number") int number, @RequestParam(value = "type", required = false, defaultValue = "전체") String type, HttpServletRequest request) { User sessionUser = (User) session.getAttribute("sessionUser"); if (sessionUser == null) throw new RuntimeException("로그인 후 사용해주세요"); AccountResponse.DetailDTO2 detailList = accountService.계좌상세보기(number, type, sessionUser.getId()); request.setAttribute("models", detailList); // System.out.println("number = " + number); // System.out.println("type = " + type); return "account/detail"; }
AccountService
public AccountResponse.DetailDTO2 계좌상세보기(int number, String type, Integer sessionUserId) { // 1. 계좌 존재 확인 Account account = accountRepository.findByNumber(number); if (account == null) throw new RuntimeException("계좌가 존재하지 않습니다"); // 2. 계좌 주인 확인 account.계좌주인검사(sessionUserId); // 3. 조회해서 주면 됨 // List<AccountResponse.DetailDTO> detailList = accountRepository.findAllByNumber(number, type); AccountResponse.DetailDTO2 detailList = new AccountResponse.DetailDTO2(accountRepository.detail1(number), accountRepository.detail2(number, type)); return detailList; }
AccontRepository
public AccountResponse.TransferUserDTO detail1(int number) { String sql = """ select at.balance account_balance, at.number account_number, ut.fullname account_owner from account_tb at inner join user_tb ut on at.user_id = ut.id where at.number = ? """; Query query = em.createNativeQuery(sql); query.setParameter(1, number); Object[] result = (Object[]) query.getSingleResult(); AccountResponse.TransferUserDTO userInfo = new AccountResponse.TransferUserDTO( ((Number) result[1]).intValue(), // account_number ((Number) result[0]).intValue(), // account_balance (String) result[2] // account_owner ); return userInfo; } public List<AccountResponse.TransferListDTO> detail2(int number, String type) { String sql = """ select substr(created_at, 1, 16) created_at, withdraw_number w_number, deposit_number d_number, amount, case when withdraw_number = ? then withdraw_balance else deposit_balance end balance, case when withdraw_number = ? then '출금' else '입금' end type from history_tb """; String sql2 = "where deposit_number = ? or withdraw_number = ?;"; String sql3 = "where deposit_number = ?;"; String sql4 = "where withdraw_number = ?;"; if(type.equals("입금")) sql += sql3; else if (type.equals("출금")) sql += sql4; else sql += sql2; Query query = em.createNativeQuery(sql); query.setParameter(1, number); query.setParameter(2, number); query.setParameter(3, number); if(type.equals("전체")) query.setParameter(4, number); List<Object[]> obsList = query.getResultList(); List<AccountResponse.TransferListDTO> detailList = new ArrayList<>(); for (Object[] obs : obsList) { AccountResponse.TransferListDTO detail = new AccountResponse.TransferListDTO( (String) obs[0], (int) obs[1], (int) obs[2], (int) obs[3], (int) obs[4], (String) obs[5] ); detailList.add(detail); } return detailList; }
AccontResponse
@AllArgsConstructor @Data public static class TransferUserDTO { private int accountNumber; private int accountBalance; private String accountOwner; } @AllArgsConstructor @Data public static class TransferListDTO { private String createdAt; // substr로 잘랐으므로 String 타입 private int wNumber; private int dNumber; private int amount; private int balance; private String type; } @Data public static class DetailDTO2 { private int accountNumber; private int accountBalance; private String accountOwner; private List<TransferListDTO> detailList; public DetailDTO2(TransferUserDTO transferUserDTO, List<TransferListDTO> detailList) { this.accountNumber = transferUserDTO.getAccountNumber(); this.accountBalance = transferUserDTO.getAccountBalance(); this.accountOwner = transferUserDTO.getAccountOwner(); this.detailList = detailList; } }
결과
정상 작동
  • 입금
notion image
 
  • 출금
notion image
 
  • 전체
notion image
 
Share article

sxias