BankApp - DB 접근 기술

Gun·2023년 9월 13일

Spring Boot - BankApp

목록 보기
6/25
💡 학습목표
   1. MyBatis에 대한 개념
   2. yml파일에 MyBatis 설정하는 방법 알아보기
   3. MyBatis 사용 방법 
    3-1 : UserRepository 인터페이스 선언 하기 
    3-2 : user.xml 파일을 정의 하기 
    3-3 : AccountRepository 인터페이스 선언 하기 
    3-4 : account.xml 파일 정의 하기 
    3-5 : HistoryRepository 인터페이스 선언 하기 
    3-6 : history.xml 파일 정의 하기

1. MyBatis에 대한 개념

MyBatis는 자바 언어를 위한 데이터베이스 연동 프레임워크 중 하나로, SQL 쿼리와 자바 코드를 매핑하고 관리하기 위한 도구를 제공하는 프레임워크입니다. MyBatis는 SQL을 직접 작성하고 실행하는 대신 SQL 쿼리를 XML 파일이나 어노테이션을 사용하여 정의하고, 데이터베이스와 자바 객체 간의 매핑을 설정할 수 있도록 도와줍니다.

MyBatis의 핵심 개념

  1. 매퍼(Mapper): 매퍼는 SQL 쿼리와 자바 메서드를 연결하는 인터페이스 또는 XML 파일입니다. MyBatis에서 매퍼는 데이터베이스와 상호 작용하기 위한 모든 SQL 작업을 정의합니다.

  2. SQL 쿼리 매핑: MyBatis는 SQL 쿼리를 자바 코드에서 분리하여 XML 파일이나 어노테이션을
    사용하여 정의합니다. 이렇게 정의된 SQL 쿼리는 매퍼에서 호출되며, MyBatis가 데이터베이스에 전달하여 실행합니다.

  3. 파라미터 매핑: MyBatis는 SQL 쿼리의 파라미터를 자바 객체와 매핑합니다.
    이를 통해 SQL 쿼리 내에서 자바 객체의 속성을 사용할 수 있습니다.

  4. 결과 매핑: MyBatis는 SQL 쿼리의 결과를 자바 객체로 변환하여 반환합니다.
    이를 통해 데이터베이스 결과를 자바 객체로 쉽게 사용할 수 있습니다.

  5. 세션(Session): MyBatis에서는 세션을 사용하여 데이터베이스와의 연결을 관리합니다.
    세션은 데이터베이스 연결을 열고 닫는 데 사용되며, SQL 쿼리를 실행할 때마다 세션을 생성하고 사용합니다.


// UserMapper.java (매퍼 인터페이스)
public interface UserMapper {
    User getUserById(int userId);
}

<!-- UserMapper.xml (SQL 쿼리 매핑 파일) -->
<mapper namespace="UserMapper">
    <select id="getUserById" resultType="User">
        SELECT * FROM users WHERE id = #{userId}
    </select>
</mapper>

2. yml파일에 MyBatis 설정하는 방법 알아보기

의존성 설정 확인


implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.3.0'
server: 
  port: 80
  servlet:
    encoding:
      charset: utf-8
      force: true
      
spring:
  mvc:
    view:
      prefix: /WEB-INF/view/
      suffix: .jsp
  datasource:
    driver-class-name: org.h2.Driver
    url: jdbc:h2:mem:testdb;MODE=MySQL
    username: sa
    password:
  sql:
    init:
      schema-locations:
      - classpath:db/table.sql
      data-locations:
      - classpath:db/data.sql

  h2:
    console:
      enabled: true
  output:
    ansi:
      enabled: always
      
mybatis:
  mapper-locations:
  - classpath:mapper/**.xml
  configuration:
    map-underscore-to-camel-case: true
  • mybatis: MyBatis 설정을 시작하는 루트 노드입니다.
    • mapper-locations: MyBatis 매퍼 XML 파일의 위치를 나타냅니다.
      • `classpath:mapper/.xml**: 클래스패스(classpath) 상의 **mapper`** 디렉터리 안에 있는 모든 XML 파일을 매퍼로 사용하겠다는 설정입니다. 이 디렉터리에는 SQL 쿼리와 자바 객체 간의 매핑 정보가 포함된 MyBatis 매퍼 파일입니다. MyBatis는 이러한 매퍼 파일을 로드하여 SQL 쿼리를 실행할 때 사용합니다.
    • configuration: MyBatis의 추가적인 구성 옵션을 정의합니다.
      • map-underscore-to-camel-case: true: 이 옵션은 데이터베이스의 컬럼 이름이 스네이크 케이스(my_column_name)로 되어 있을 때, 자바 객체의 프로퍼티 이름을 카멜 케이스(myColumnName)로 자동으로 변환하는 기능을 활성화합니다. 예를 들어, 데이터베이스 컬럼 first_name*은 자바 객체의 프로퍼티 firstName*에 자동으로 매핑됩니다. 이 옵션을 사용하면 자동 매핑의 편의성을 높일 수 있습니다.

이 설정은 MyBatis의 매퍼 파일을 클래스패스 상의 특정 디렉터리에서 로드하고, 데이터베이스 컬럼 이름과 자바 객체의 프로퍼티 이름 간의 자동 매핑을 활성화하는 데 사용됩니다. 이를 통해 MyBatis가 데이터베이스와 자바 객체 간의 데이터 전송을 더 쉽게 처리할 수 있게 됩니다.

3. MyBatis 사용 방법

3.1 UserRepository 인터페이스 선언 하기


package com.tencoding.bank.repository.interfaces;

import java.util.List;

import org.apache.ibatis.annotations.Mapper;

import com.tencoding.bank.repository.model.User;


// ibatis -> 2.4 버전 이후로 MyBatis로 이름 변경 됨
@Mapper // Mapper 반드시 기술을 해주어야 동작한다.
public interface UserRepository {
	// 뱅크 앱
	public int insert(User user);
	public int updateById(User user);
	public int deleteById(Integer id);
	public User findById(Integer id);
	// 관리자 - 회원정보 리스트를 보고 싶다면?
	public List<User> findAll();
	
}

3.2 user.xml 파일을 정의 하기

1단계

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.tencoding.bank.repository.UserRepository"> 
	

	
	
</mapper>

2단계

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.tencoding.bank.repository.interfaces.UserRepository">
 
	<insert id="insert">
		insert into user_tb(username, password, fullname, created_at)
		values(#{username}, #{password}, #{fullname}, now())
	</insert>
	
	<update id="updateById">
		update user_tb set username = #{username},
		password = ${password},
		fullname = ${fullname}
		where id = ${id}
	</update>

	<delete id="deleteById">
		delete from user_tb where id = #{id} 
	</delete>
	
	<select id="findById" resultType="com.tencoding.bank.repository.model.User">
		select * from user_tb where id = ${id}
	</select>
	
	<select id="findAll" resultType="com.tencoding.bank.repository.model.User">
		select * from user_tb
	</select>
</mapper>

3.3 AccountRepository 인터페이스 선언 하기


package com.tencoding.bank.repository.interfaces;

import java.util.List;

import org.apache.ibatis.annotations.Mapper;

import com.tencoding.bank.repository.model.Account;

@Mapper
public interface AccountRepository {
	public int insert(Account acount);
	public int updateById(Account acount);
	public int deleteById(Account acount);
	
	public List<Account> findAll();
	public Account findById(Integer id);
	
	public List<Account> findByUserId(Integer principalId);
	public Account findByNumber(String number); // 계좌번호로 계좌 존재 여부 확인
}

3.4 account.xml 파일 정의 하기


<<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.tencoding.bank.repository.interfaces.AccountRepository"> 
	<insert id="insert">
		insert into account_tb (number, password, balance, user_id, created_at) 
		values(#{number}, #{password}, #{balance}, #{userㅑd}, now())
	</insert>
	
	<update id="updateById">
		update account_tb set number = #{number}, password = #{password},
		balance = #{balance}, user_id = #{userId} where id = #{id}
	</update>

	<delete id="deleteById">
		 delete from account_tb where id = #{id}
	</delete>
	
	<select id="findById" resultType="com.tencoding.bank.repository.model.Account">
		select * from account_tb where id = #{id}
	</select>
	
	<select id="findAll" resultType="hashmap">
		select * from account_tb
	</select>
	
	<select id="findByUserId">
		 select * from account_tb where user_id = #{userid}
	</select>
	
	<select id="findByNumber">
		select * from account_tb where number = #{number}
	</select>
	
</mapper>

3.5 HistoryRepository 인터페이스 선언 하기


package com.tencoding.bank.repository.interfaces;


import java.util.List;

import org.apache.ibatis.annotations.Mapper;

import com.tencoding.bank.repository.model.History;

@Mapper
public interface HistoryRepository {
	
	// 기능 직접 설계
	public int insert(History history);
	public int updateById(History history);
	public int deleteById(Integer id);
	
	public List<History> findAll();
	public History findById(Integer id);
	
}

3.6 history.xml 파일 정의 하기


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.tencoding.bank.repository.interfaces.HistoryRepository"> 
	<insert id="insert">
		insert into history_tb (amount, w_account_id, d_account_id, w_balance,
        d_balance, created_at) 
		values(#{amount}, #{wAccountId}, #{dAccountId}, #{wBalance}, #{dBalance}, now())
	</insert>
	
	<update id="updateById">
		update history_tb set amount = #{amount} , w_balance = #{wBalance},
        d_balance = #{dBalance},w_account_id = #{wAccountId}, 
        d_account_id = #{dAccountId} where id = #{id} 
	</update>
	
	<delete id="deleteById">
		delete from history_tb where id = #{id}
	</delete>
	 
	 <select id="findAll">
	 	select * from history_tb
	 </select>
	 
	 <select id="findById">
	 	select * from history_tb where id = #{id}
	 </select>
	
</mapper>

0개의 댓글