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;
}
}
결과
정상 작동
- 입금

- 출금

- 전체

Share article