-
bank app3 - 모델링spring boot 2023. 4. 14. 13:58
bank app 모델링 - 3
TRM 기반으로 모델링을 해보자
Table Relational mapping은 데이터베이스의 테이블과 애플리케이션의 객체 간의 매핑을 의미합니다.
MyBatis에서는 데이터베이스 쿼리를 XML 파일로 작성하고, Java 코드에서 이를 호출하는 방식으로 데이터베이스와의 상호작용을 수행합니다. XML 파일에서는 SQL 쿼리를 작성하고, Java 코드에서는 이를 호출하여 결과를 반환합니다.
1. 테이블 설계
2. 비지니스 로직 기본 확인
3. 모델링 구현user.xml 파일
<select id="selectUserById" resultType="User"> SELECT id, name, email FROM user WHERE id = #{id} </select>테이블 설계 및 제약 설정
mysql에서 먼저 연습
CREATE DATABASE bank; use bank; -- 유저 테이블 설계해 보기 CREATE TABLE user_tb( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(30) NOT NULL, fullname VARCHAR(50) NOT NULL, created_at TIMESTAMP NOT NULL DEFAULT now() ); -- 사용자의 계좌 정보 테이블 CREATE TABLE account_tb( id INT AUTO_INCREMENT PRIMARY KEY, number VARCHAR(30) NOT NULL UNIQUE, password VARCHAR(20) NOT NULL, balance BIGINT NOT NULL COMMENT '계좌 잔액', user_id INT, created_at TIMESTAMP NOT NULL DEFAULT now() ); -- 입금 내역 저장 -- 출금 내역 저장 -- 사용자 간 이체 내역 저장 -- 사용자들의 history 테이블 -- BIGINT 8바이트 크기의 정수형 -- 조(10에 12승) -- 경(10에16승) -- 해(10에 20승) -- 자(10에 24승) -- 양(10에 28승) CREATE TABLE history_tb( id INT AUTO_INCREMENT PRIMARY KEY COMMENT "거래내역", amount BIGINT NOT NULL COMMENT '거래금액', w_account_id INT COMMENT '출금 계좌 id', d_account_id INT COMMENT '입금 계좌 id', w_balance BIGINT COMMENT '출금 요청된 계좌 잔액', d_balance BIGINT COMMENT '입금 요청된 계좌 잔액', created_at TIMESTAMP NOT NULL DEFAULT now() );샘플 데이터 INSERT INTO user_tb(username, password, fullname, created_at) values('길동', '1234', '고', now()); INSERT INTO user_tb(username, password, fullname, created_at) values('둘리', '1234', '애기공룡', now()); INSERT INTO user_tb(username, password, fullname, created_at) values('콜', '1234', '마이', now()); -- 계좌 테이블 샘플 데이터 INSERT INTO account_tb(number, password, balance, user_id, created_at) values('1111', '1234', 900, 1, now()); INSERT INTO account_tb(number, password, balance, user_id, created_at) values('2222', '1234', 1100, 2, now()); INSERT INTO account_tb(number, password, balance, user_id, created_at) values('333', '1234', 0, 3, now());CREATE DATABASE bank; use bank; -- 유저 테이블 설계해 보기 CREATE TABLE user_tb( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(30) NOT NULL, fullname VARCHAR(50) NOT NULL, created_at TIMESTAMP NOT NULL DEFAULT now() ); -- 사용자의 계좌 정보 테이블 CREATE TABLE account_tb( id INT AUTO_INCREMENT PRIMARY KEY, number VARCHAR(30) NOT NULL UNIQUE, password VARCHAR(20) NOT NULL, balance BIGINT NOT NULL COMMENT '계좌 잔액', user_id INT, created_at TIMESTAMP NOT NULL DEFAULT now() ); -- 입금 내역 저장 -- 출금 내역 저장 -- 사용자 간 이체 내역 저장 -- 사용자들의 history 테이블 -- BIGINT 8바이트 크기의 정수형 -- 조(10에 12승) -- 경(10에16승) -- 해(10에 20승) -- 자(10에 24승) -- 양(10에 28승) CREATE TABLE history_tb( id INT AUTO_INCREMENT PRIMARY KEY COMMENT "거래내역", amount BIGINT NOT NULL COMMENT '거래금액', w_account_id INT COMMENT '출금 계좌 id', d_account_id INT COMMENT '입금 계좌 id', w_balance BIGINT COMMENT '출금 요청된 계좌 잔액', d_balance BIGINT COMMENT '입금 요청된 계좌 잔액', created_at TIMESTAMP NOT NULL DEFAULT now() ); INSERT INTO user_tb(username, password, fullname, created_at) values('길동', '1234', '고', now()); INSERT INTO user_tb(username, password, fullname, created_at) values('둘리', '1234', '애기공룡', now()); INSERT INTO user_tb(username, password, fullname, created_at) values('콜', '1234', '마이', now()); SELECT * FROM user_tb; -- 계좌 테이블 샘플 데이터 INSERT INTO account_tb(number, password, balance, user_id, created_at) values('1111', '1234', 900, 1, now()); INSERT INTO account_tb(number, password, balance, user_id, created_at) values('2222', '1234', 1100, 2, now()); INSERT INTO account_tb(number, password, balance, user_id, created_at) values('333', '1234', 0, 3, now()); SELECT * from account_tb; CREATE TABLE history_tb( id INT AUTO_INCREMENT PRIMARY KEY COMMENT "거래내역", amount BIGINT NOT NULL COMMENT '거래금액', w_account_id INT COMMENT '출금 계좌 id', d_account_id INT COMMENT '입금 계좌 id', w_balance BIGINT COMMENT '출금 요청된 계좌 잔액', d_balance BIGINT COMMENT '입금 요청된 계좌 잔액', created_at TIMESTAMP NOT NULL DEFAULT now() ); -- 히스토리 추적 내용 (이체, 입금 , 출금) -- 히스토리 테이블에 이체 내역을 기록 ( 1번 계좌에서 2번계좌에 100원을 이체 한다) INSERT INTO history_tb(amount,w_balance,d_balance, w_account_id,d_account_id,created_at) VALUES(100, 900, 1100, 1, 2, now()); -- 출금 내역 ( 1번 계좌에서 100원을 출금하라 ) INSERT INTO history_tb(amount,w_balance,d_balance, w_account_id,d_account_id,created_at) VALUES(100,800,null,1,null,now()); -- 입금 내역 ( 1번 계좌에 500원 입금 처리 ) INSERT INTO history_tb(amount,w_balance,d_balance, w_account_id,d_account_id,created_at) VALUES(500,null,700,null,1,now()); SELECT * FROM history_tb; DELETE from history_tb; ALTER TABLE history_tb AUTO_INCREMENT = 1; -- 출금 내역 (3번이 1000원을 출금, 잔액 0원인 상태 거래 내역 기록 INSERT INTO history_tb(amount,w_balance,d_balance, w_account_id,d_account_id,created_at) VALUES(1000,1000,null,3,null,now()); -- id INT AUTO_INCREMENT PRIMARY KEY COMMENT "거래내역", -- amount BIGINT NOT NULL COMMENT '거래금액', -- w_account_id INT COMMENT '출금 계좌 id', -- d_account_id INT COMMENT '입금 계좌 id', -- w_balance BIGINT COMMENT '출금 요청된 계좌 잔액', -- d_balance BIGINT COMMENT '입금 요청된 계좌 잔액', -- 이체연습(2번에서 3번으로 1000원 이체 한다.) -- 입금연습 -- 출금연습자바 코드로 모델링 하기
User
package com.tenco.bank.repository.model; import java.sql.Timestamp; import lombok.Data; @Data public class User { private Integer id; private String username; private String password; private String fullname; private Timestamp createdAt; }Account
package com.tenco.bank.repository.model; import java.sql.Timestamp; import lombok.Data; /* * 모델 클래스 (Value Object 역할만 하는것은 아니다) * */ @Data public class Account { private Integer id; private String number; private String password; private Long balance; private Integer userId; private Timestamp createdAt; public void withdraw(Long amount) { this.balance -= amount; } public void deposit(Long amount) { this.balance += amount; } // 생각해볼수 있는 메서드들 // 패스워드 체크 // 잔액 여부 확인 (출금시) // 계좌 소유자 확인 }History
package com.tenco.bank.repository.model; import java.sql.Timestamp; import lombok.Data; @Data public class History { private Integer id; private Long amount; private Long wBalance; private Long dBalance; private Integer wAccountId; private Integer dAccountId; private Timestamp createdAt; }'spring boot' 카테고리의 다른 글
bank app5 - MyBatis 설정 (0) 2023.04.17 bank app4 - h2 db 초기 값 설정 (0) 2023.04.14 bank app2 - 네이밍 (0) 2023.04.14 bank app1 - 프로젝트 설정 (0) 2023.04.14 Validation (0) 2023.04.11