섹시꽃남민우 2023. 4. 17. 17:27
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>

테이블 설계

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 '거래 내역 ID', 
	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());

자바 코드로 모델을 하기

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;

/**
 * 모델 클래스 
 */
@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;
	}
	
	// 패스워드 체크
	// 잔액 여부 확인 (출금시) 
	// 계좌 소유자 확인 
}
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;
}