• 티스토리 홈
  • 프로필사진
    Song hyun
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
Song hyun
  • 프로필사진
    Song hyun
    • 분류 전체보기 (780)
      • 백준 (0)
      • 일본어 (0)
        • 모모타로TMC (0)
      • 영어 (2)
        • Diary (0)
        • Toast Masters (2)
      • 메모 (13)
      • 설치 메뉴얼 (30)
      • Java (178)
      • MySQL (60)
      • JSP (67)
      • Springboot (46)
      • HTML,CSS, JS (71)
        • HTML (8)
        • CSS (12)
        • JavaScript (37)
        • HTML&CSS 스터디 (13)
      • C++ (7)
      • Linux (7)
      • JPA (34)
      • Kotlin (2)
      • Flutter (42)
      • Error Note (39)
      • 디자인 패턴 (12)
      • 디지털논리회로 (4)
      • 데이터베이스 시스템 (8)
      • 알고리즘 (7)
      • 운영체제 (3)
      • 이산수학 (3)
      • 인공지능 (1)
      • 자료 구조 (14)
        • 기본 개념 (14)
        • 자료구조 스터디 (0)
      • 💡My project (76)
        • 팩맨 : Java Swing 게임 제작 프로젝트 (6)
        • 네이트톡 : Java 소켓 통신 프로젝트 (4)
        • 포켓옥션 : HikariCP&JDBC CRUD 프.. (3)
        • 이지 부산 : BDIA-Devton 2024 프로.. (20)
        • 그린 유니버시티 : JSP를 사용한 학사관리 프로.. (1)
        • 애드 포커 : 웹 소켓과 Spring을 사용한 카.. (1)
        • 셸위 : 게임 친구 매칭 사이트 (21)
        • 다모아 : 개발자 중개 플랫폼 (20)
      • 📗스터디 (13)
        • CNN : 웹개발 스터디 (10)
        • Node&React로 유튜브 사이트 만들기 (3)
      • 📙독서 및 강연 기록 (36)
        • 강연 (14)
        • 독서 (22)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      # Home
      # 공지사항
      #
      # 태그
      # 검색결과
      # 방명록
      • [Springboot] 25. 계좌 상세 보기 기능(3단계-모델, 레포지토리, 쿼리문 작성)
        2024년 08월 12일
        • Song hyun
        • 작성자
        • 2024.08.12.:25
        728x90
        반응형

        [Springboot] 25. 계좌 상세 보기 기능(3단계-모델, 레포지토리, 쿼리문 작성)

         

         

        1. historyRepository.java

        //코드 추가 예정 - 모델을 반드시  1:1 엔터티에 매핑을 시킬 필요는 없다. 
        	// 조인 쿼리, 서브쿼리, 동적 쿼리, type=all, de...,accountId...
        	public List<HistoryAccount> findByAccountIdAndTypeOfHistory(@Param("type") String type, 
        			@Param("accountId") Integer accountId);

         

         

        2. HistoryAccount.java (HistoryAccountDTO)

        package com.tenco.bank.repository.model;
        
        import java.sql.Timestamp;
        
        import lombok.AllArgsConstructor;
        import lombok.Builder;
        import lombok.Data;
        import lombok.NoArgsConstructor;
        import lombok.ToString;
        
        @Data
        @AllArgsConstructor
        @NoArgsConstructor
        @ToString
        @Builder
        public class HistoryAccount {
        	
        	private Integer id;
        	private Long amount;
        	private Long balance;
        	private String sender;
        	private String receiver;
        	private Timestamp createdAt;
        
        }

         

         

        3. xml 쿼리문 작성 (Account, History)

        (1) Account.xml

        	<select id="findByAccountId"  resultType="com.tenco.bank.repository.model.Account">
        		select * from account_tb where number = #{accountId}
        	</select>

         

        (2) History.xml

        <select id="findByAccountIdAndTypeOfHistory"
        		resultType="com.tenco.bank.repository.model.HistoryAccount">
        		<if test="type=='all'">
        			select h.id, h.amount,
        			case
        			when h.w_account_id = #{accountId} then (h.w_balance)
        			when h.d_account_id = #{accountId} then (h.d_balance)
        			end as balance,
        			coalesce(cast(wa.number as char(10)),'ATM') as sender,
        			coalesce(cast(da.number as char(10)),'ATM') as receiver,
        			h.created_at
        			from history_tb as h
        			left join account_tb as wa on
        			h.w_account_id=wa.id
        			left join account_tb as da on
        			h.d_account_id=da.id
        			where h.w_account_id= #{accountId} or
        			h.d_account_id= #{accountId}
        		</if>
        		<if test="type=='deposit'">
        			select h.id,h.amount,h.d_balance as balance, h.created_at,
        			coalesce(cast(wa.number as char(10)),'ATM') as sender,
        			da.number as receiver
        			from history_tb as h
        			left join account_tb as wa on
        			wa.id=h.w_account_id
        			left join account_tb as da on
        			da.id=h.d_account_id
        			where h.d_account_id= #{accountId}
        		</if>
        		<if test="type=='withdraw'">
        			select h.id, h.amount, h.w_balance as balance, h.created_at,
        			coalesce (cast(da.number as char(10)),'ATM') as reciever,
        			wa.number as sender
        			from history_tb as h
        			left join account_tb as wa on wa.id =
        			h.w_account_id
        			left join account_tb as da on da.id = h.d_account_id
        			where h.w_account_id= #{accountId}
        		</if>
        	</select>

         

        *SQL상에서 작성한 쿼리문

        select h.id, h.amount, h.w_balance as balance, h.created_at,
        	coalesce (cast(da.number as char(10)),'ATM') as reciever,
            wa.number as sender
        from history_tb as h
        left join account_tb as wa on wa.id = h.w_account_id
        left join account_tb as da on da.id = h.d_account_id
        where h.w_account_id=1;
        
        select h.id,h.amount,h.d_balance as balance, h.created_at,
        	coalesce(cast(wa.number as char(10)),'ATM') as sender,
            da.number as receiver
        from history_tb as h
        left join account_tb as wa on wa.id=h.w_account_id
        left join account_tb as da on da.id=h.d_account_id
        where h.d_account_id=1;
        
        select h.id, h.amount,
        	case
        		when h.w_account_id=1 then (h.w_balance)
        			when h.d_account_id=1 then (h.d_balance)
        		end as balance,
                coalesce(cast(wa.number as char(10)),'ATM') as sender,
                coalesce(cast(da.number as char(10)),'ATM') as receiver,
                h.created_at
        	from history_tb as h
            left join account_tb as wa on h.w_account_id=wa.id
            left join account_tb as da on h.d_account_id=da.id
            where h.w_account_id=1 or h.d_account_id=1;

         

         

        4. AccountService.java (작성한 레포지토리-xml을 사용해 메서드 만들기

        (1) AccountId(통장 primary key)로 계좌 찾기(Account 반환)

        	/**
        	 * 단일 계좌 조회 기능
        	 * @param account (pk)
        	 * @return 계좌 정보(Account)
        	 */
        	// 단일 계좌 조회 기능 (accountId 기준)
        	// 거래내역은 빈번하게 수정,추가,삭제될 수 있기 때문에 Transaction 처리
        	// = 팬텀리드 현상
        	@Transactional
        	public Account readAccountById(Integer account) {
        		Account accountEntity = accountRepository.findByAccountId(account);
        		if(accountEntity==null) {
        			new DataDeliveryException(Define.NOT_EXIST_ACCOUNT, HttpStatus.INTERNAL_SERVER_ERROR);
        		}
        		return accountEntity;
        	}

         

         

        (2) AccountId(통장 primary key)로 입출금/입금/출금 내역 조회하기

        	/**
        	 * 단일 계좌 거래 내역 조회
        	 * @param type = [all, deposit, withdrawal]
        	 * @param accountId (pk)
        	 * @return 전체, 입금, 출금 거래 내역(3가지 타입 반환)
        	 */
        	public List<HistoryAccount> readHistoryAccount(String type, Integer accountId){
        		List<HistoryAccount> list=new ArrayList<>();
        		list=historyRepository.findByAccountIdAndTypeOfHistory(type, accountId);
        		return list;
        	}

         

         

        5. list.jsp (계좌 상세보기 페이지-유효성, 인증 검사 추가)

        	/**
        	 * 계좌 상세 보기 페이지
        	 * 주소 설계 : http://localhost:800/account/detail/${1}?type=all, deposit, withdraw
        	 * @return
        	 */
        	@GetMapping("/detail/{accountId}")
        	public String detail(@PathVariable(name="accountId") Integer accountId, 
        			@RequestParam(required=false, name="type") String type, Model model) {
        		// 인증 검사
        		User principal=(User)session.getAttribute("principal");
        		if(principal==null) {
        			throw new UnAuthorizedException(Define.NOT_AN_AUTHENTICATED_USER, HttpStatus.UNAUTHORIZED);
        		}
        		
        		Account account = accountService.readAccountById(accountId);
        		List<HistoryAccount> historyList= accountService.readHistoryAccountId(type, accountId);
        		
        		// 유효성 검사
        		// arrays.asList() -> array 선언과 동시에 초기화해주는 메서드
        		// 사용자가 선택한 타입(입출금/입금/출금 검색)을 검사한다.
        		List<String> validTypes=Arrays.asList("all","deposit","withdrawal");
        		if(!validTypes.contains(type)) {
        			throw new DataDeliveryException("유효하지 않은 접근입니다.", HttpStatus.BAD_REQUEST);
        		}
        		
        		System.out.println("@PathVariable : "+accountId); 
        		System.out.println("@RequestParam : "+type);
        		
        		model.addAttribute("account",account);
        		model.addAttribute("historyList", historyList);
        		return "account/detail";
        	}

         

         

        6. detail.jsp (controller/service의 메서드를 사용해 데이터 받아오기)

        <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
        
        <!-- header.jsp  -->
        <%@ include file="/WEB-INF/view/layout/header.jsp"%>
        
        <!-- start of content.jsp(xxx.jsp)   -->
        <div class="col-sm-8">
        	<h2>계좌 상세 보기(인증)</h2>
        	<h5>Bank App에 오신걸 환영합니다</h5>
        	
        	<div class="bg-light p-md-5">
        		<div class="user--box">
        			${principal.username}님 계좌 <br> 계좌 번호 : ${account.number} <br> 잔액 : ${account.balance} 원
        		</div>
        		<br>
        		
        		<div>
        			<a href="/account/detail/${account.id}?type=all" class="btn btn-outline-primary">전체</a>&nbsp;
        			<a href="/account/detail/${account.id}?type=deposit" class="btn btn-outline-primary">입금</a>&nbsp;
        			<a href="/account/detail/${account.id}?type=withdrawal" class="btn btn-outline-primary">출금</a>&nbsp;
        		</div>
        		
        		<table class="table table-striped">
        			<thead>
        				<tr>
        					<th>날짜</th>
        					<th>보낸 이</th> <%--sender --%>
        					<th>받은 이</th> <%--receiver --%>
        					<th>입출금 금액</th> <%--amount --%>
        					<th>계좌 잔액</th> <%--balance --%>
        				</tr>
        			</thead>
        			<tbody>
        			<c:forEach items="${historyList}" var="history">
        				<tr>
        					<th>${history.createdAt}</th> <%--연-월-일 시:분:초 --%>
        					<th>${history.sender}</th> <%--보낸 이 --%>
        					<th>${history.receiver}</th> <%--받은 이 --%>
        					<th>${history.amount}</th> <%--입출금 금액 --%>
        					<th>${history.balance}</th> <%--현재 계좌 잔액 --%>
        				</tr>
        			</c:forEach>
        			</tbody>
        		</table>
        		
        	</div>
        	
        </div>
        <!-- end of col-sm-8  -->
        </div>
        </div>
        
        <!-- footer.jsp  -->
        <%@ include file="/WEB-INF/view/layout/footer.jsp"%>

         

         

        728x90
        반응형

        'Springboot' 카테고리의 다른 글

        [Springboot] 27. 계좌 상세 보기 기능(5단계-JSTL 사용 및 페이징 기능)  (0) 2024.08.12
        [Springboot] 26. 계좌 상세 보기 기능(4단계-단위별 포맷)  (1) 2024.08.12
        [Spring] **24. 개념 보충 공부(3)  (0) 2024.08.12
        [Spring] **23. 개념 보충 공부(2)  (0) 2024.08.12
        [Springboot] 22. 계좌 상세 보기 기능(2단계-화면 생성)  (0) 2024.08.12
        다음글
        다음 글이 없습니다.
        이전글
        이전 글이 없습니다.
        댓글
      조회된 결과가 없습니다.
      스킨 업데이트 안내
      현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
      ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바