[Spring] Mybatis 개념/설정

맑은 눈의 코드 👀·2023년 8월 13일
0

06_framework

목록 보기
1/2
post-thumbnail

🤖Mybatis

🦾Mybatis란?(개념/흐름)

데이터 입력, 조회, 수정, 삭제를 보다 편하게 하기 위해 xml로 구조화 한 Mapper설정 파일을 통하서 JDBC를 구현한 영속성 프레임워크

기존의 JDBC를 통해 구현했던 상당 부분의 코드와 파라미터 설정 및 결과 매핑을 xml설정을 통해 쉽게 구현하 수 있게 해준다.

📍Mybatis API 사이트 http://www.mybatis.org/mybatis-3/ko

🦾Mybatis의 흐름

이전에 JDBC Template를 통해 SQL을 실행하였다면 Mybatis는 해당 흐름을 전용 라이브러리를 통해 대체하여 동작한다고 생각하면 된다.

🦾JDBC, Spring, Mybatis 관련 모듈,라이브러리 추가

JDBC 드라이버 (ojdbc11)
https://mvnrepository.com/artifact/com.oracle.database.jdbc/ojdbc11
Spring에서 JDBC지원하는 모듈 (spring-jdbc)
https://mvnrepository.com/artifact/org.springframework/spring-jdbc
Mybatis 라이브러리 (mybatis)
https://mvnrepository.com/artifact/org.mybatis/mybatis
Spring에서 쉽게 Mybatis를 사용 가능하게 만드는 모듈(spring-mybatis)
https://mvnrepository.com/artifact/org.mybatis/mybatis-spring
DataBase Connection Pool 사용을 위한 라이브러리(commons-dbcp2)
https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2



🤖mybatis-config 설정하기

🦾Mybatis의 동작 구조

🦾mybatis-config 설정하기

1) mybatis 설정용 xml 파일 DTD추가

Window - Preferences - XML - XML Catalog - User Specified Entries클릭 – Add… 클릭

- Config
Location : http://mybatis.org/dtd/mybatis-3-config.dtd
Key type : Public ID
Key : -//mybatis.org//DTD Config 3.0//EN
- Mapper
Location : http://mybatis.org/dtd/mybatis-3-mapper.dtd
Key type : Public ID
Key : -//mybatis.org//DTD Mapper 3.0//EN


2) mybatis-config.xml 생성

‘src/main/resources’폴더에 mybatis-config.xml 파일 생성

‘src/main/resources’폴더에 mybatis-config.xml 파일 생성

3) mybatis-config.xml 작성

‘src/main/resources’폴더에 mybatis-config.xml 파일 생성

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd" >
<configuration>
<!-- SqlSessionTemplate 생성 시 적용될 설정 작성 부분 -->
<settings>
<!-- insert 또는 update에 사용되는 값 중 null이 있을 경우에 대한 설정
해당 설정이 없을 경우 -> SQL 구문에 null 포함되어 있다는 오류 발생.
해상 설정이 있을 경우 -> 오류를 발생 시키지 않고 NULL 값을 컬럼에 대입
단, NOT NULL 제약조건이 없는 컬럼에만 가능함.
** value 설정 시 NULL 은 반드시 대문자로 작성 (소문자 null은 오류가 발생함) -->
<setting name="jdbcTypeForNull" value="NULL"/>
</settings>
<!-- 별칭 작성 부분 -->
<!-- VO클래스의 패키지명 + 클래스명 작성하는 것이 불편하기 때문에 짧은 별칭 부여 -->
<typeAliases>
<typeAlias type="edu.kh.fin.member.model.vo.Member" alias="Member"/>
</typeAliases>
<!-- mapper 파일(SQL 작성되는파일) 위치 등록 부분 -->
<mappers>
<mapper resource="/mappers/member-mapper.xml"/>
</mappers>
</configuration>

🤖Spring, JDBC, Mybatis 관련 설정하기(root-ccontext.xml)

🦾root-context.xml 설정 추가

DBCP(커넥션풀)설정

!-- DBCP 사용을 위한 DataSource를 Bean으로 등록 -->
<!-- DataSource란? : java에서 Connection Pool을 지원하기 위한 인터페이스 -->
<!-- BasicDataSource : DataSource인터페이스를 구현한 클래스, 아파치 commons.dbcp에서 제공 -->
<!-- destroy-method="close" : 주어진 세션을 자동으로 반환(close)하라는 설정 -->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe" />
<property name="username" value=“kh_final" />
<property name="password" value=“kh_final1234" />
<!-- defaultAutoCommit: SQL 수행 후 자동 COMMIT 설정. (기본값 : true) -->
<property name="defaultAutoCommit" value="false" />
<!-- 커넥션 풀 설정 -->
<property name="initialSize" value="10" /> <!-- 초기 커넥션 수, 기본 0 -->
<property name="maxTotal" value="500" /> <!-- 최대 커넥션 수, 기본 8 -->
<property name="maxIdle" value="100" /> <!-- 유휴 상태로 존재할 수 있는 커넥션 최대 수, 기본 8 -->
<property name="minIdle" value="10" /> <!-- 유휴 상태로 존재할 수 있는 커넥션 최소 수, 기본 0 -->
<property name="maxWaitMillis" value="-1" /> <!-- 예외 발생 전 커넥션이 반환 될 떄 까지 대기하는 최대 시간(ms), 기본 -1(무기한) -->
</bean>

🦾SqlSession관련 설정 및 트렌젝션 제어 설정 추가

<!-- SqlSession : sql구문을 DB에 전달, 실행하는 객체
SqlSessionFactory : SqlSession을 만드는 객체
sqlSessionFactoryBean : mybatis 설정 파일(mybatis-config.xml)과 Connection Pool 정보를 이용하여 SqlSessionFactory를 만드는 객체
sqlSessionTemplate : SqlSession 객체에 트랜잭션 처리 역할이 가능하도록 하는 객체 -->
<!-- 마이바티스 SqlSession 등록하기 (xml 방식으로 bean 등록) -->
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- mybatis-config.xml 설정 불러오기 -->
<property name="configLocation" value="classpath:mybatis-config.xml" />
<property name="dataSource" ref="dataSource" />
</bean>
<!-- SqlSessionTemplate : 기본 SQL 실행 + 트랜잭션 관리 역할을 하는 SqlSession을 생성할 수 있게 하는 객체(Spring bean으로 등록해야함.) -->
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="sqlSessionFactoryBean" />
</bean>
<!-- 스프링에서 사용하는 proxy를 이용한 트랜잭션 제어가 안될 경우 추가적인 트랜잭션 매니저를 추가해서 문제 해결 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>

🦾mybatis-config 설정하기 - 참고

📍Mybatis 내장 별칭



🤖mapper 설정하기

📍*-mapper.xml 생성 위치

‘src/main/resources’폴더에 ‘mappers’ 폴더 생성 후 mapper.xml 파일 생성

src/main/resources’폴더에 ‘mappers’ 폴더 생성 후 mapper.xml 파일 생성

📍*-mapper.xml작성 ⭐⭐⭐⭐⭐⭐⭐⭐

  • <resultMap태그> : select조회 결과(ResultSet)컬럼명과
    컬럼 값을 옮겨 담을 DTO의 필드명이 같지 않을 때
    이를 매핑 시켜 SELECT 시 자동으로 담기게 하는 역할
  • 태그 예시
    <resultMap type="Member" id="member_rm">
    		<!-- DB의 기본키 (복합키면 여러개 작성)-->
    		<id property="memberNo" column="MEMBER_NO"/>
    		<!-- DB의 일반 컬럼들 -->
    		<result property="memberEmail" column="MEMBER_EMAIL"/>
    		<result property="memberPw" column="MEMBER_PW"></result>
    		<result property="memberNickname" column="MEMBER_NICKNAME"/>
    		<result property="memberTel" column="MEMBER_TEL"/>
    		<result property="memberAddress" column="MEMBER_ADDR"/>
    		<result property="profileImage" column="PROFILE_IMG"/>
    		<result property="enrollDate" column="ENROLL_DATE"/>
    		<result property="memberDeleteFlag" column="MEMBER_DEL_FL"/>
    		<result property="authority" column="AUTHORITY"/>
    	</resultMap>
<resultMap>의 type속성은
  실제로 구현해 놓은 자바 POJO 객체를 사용해야 하며,
  mybatis-cconfig.xml에서 typeAlias를 지정하지 않은 경우,
  패키지 명부터 클래스까지 모두 기술해야 됨
  • xml 최상단에 다음과 같이 xml 형식을 지정하여 이하의 설정 내용이 mybatis mapper 설정임을 선언
    <? 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="memberMapper">
  • 이어서 태그를 작성하고, 외부에서 접근할 수 있는 이름인 namespace 속성을 기입, 이 후 작성된 태그들을 태그 안에 기록하면 됨
  • <select> 태그 : SQL의 조회구문을 작성할 때 사용되는 태그로, 해당 쿼리를 외부에서 접근하고자 할 때 namespace.id명을 적어 접근 가능

⭐MyBatis에 작성되는 SQl에서 #{}/ ${}의 의미⭐

  • #{}: prepareStatement 의 위치홀더(?)의 역할로 전달된 값을 의미함
  • ${}: Statement의 역할로 SQL 구문 자체를 의미함
<mapper namespace="memberMapper">
	<!-- namespace : 공간(영역, 지역, 태그)의 이름 -->

	<!-- mapper 파일 생성시 아래 태그는 반드시 삭제 !!!! -->
	<!-- <cache-ref namespace=""/> -->

	<!-- 
		resultMap
		- select조회 결과(ResultSet)컬럼명과
		컬럼 값을 옮겨 담을 DTO의 필드명이 같지 않을 때
		이를 매핑 시켜 SELECT 시 자동으로 담기게 하는 역할
		
		-속성 
		 Type : 연결할 DTO (패키지명 + 클래스 또는 별칭)
		 id : 만들어진 resultMap을 지칭할 식별면(이름)
		 
		 <id> 태그 : PK 역할 컬럼 - 필드 매핑
		 <result>태그 <id> 제외 나머지
	 -->
	<resultMap type="Member" id="member_rm">
		
		<!-- DB의 기본키 (복합키면 여러개 작성)-->
		<id property="memberNo" column="MEMBER_NO"/>
		
		<!-- DB의 일반 컬럼들 -->
		<result property="memberEmail" column="MEMBER_EMAIL"/>
		<result property="memberPw" column="MEMBER_PW"></result>
		<result property="memberNickname" column="MEMBER_NICKNAME"/>
		<result property="memberTel" column="MEMBER_TEL"/>
		<result property="memberAddress" column="MEMBER_ADDR"/>
		<result property="profileImage" column="PROFILE_IMG"/>
		<result property="enrollDate" column="ENROLL_DATE"/>
		<result property="memberDeleteFlag" column="MEMBER_DEL_FL"/>
		<result property="authority" column="AUTHORITY"/>
	</resultMap>



	<!-- 
		SQL관련 태그 속성
		
		- parameterType : 전달 받은 값의 자료형
						기본 : 패키지명 + 클래스 명
						별칭 : Mybatis 별칭  또는 사용자 지정 별칭
						
		- parameterMap : (사용 안함) 
		
		- resultType : select 결과을 담아서 반환할 자료형
						단, DTO을 작성할 경우 필드명= 컬럼명 경우만 가능
										memberNo   MEMBER_NO
		
		- resultMap : select결과의 컬럼명과 
					결과를 저장할 DTO 필드명이 다른 경우
					이를 알맞게 매핑(연결)시켜주는 <resultMap> id작성
	 -->
	 
	 <!-- 
	 	** 마이바티스에서 전달 받은 값을 SQL에 작성하는 방법**
	 	
	 	#{변수명|필드명} : preparedStatement
	 				  : SQL에 값 대입시 양쪽에 '' 붙여서 대입
	 	
	 	${변수명|필드명} : Statment
	 				  : SQL값 대입시 양쪽에 아무것도 붙이지 않은
	 	
	 	
	 	(사용예시) 
	 		test1= "user01"
	 		test2=MEMBER_EMAIL
	 		
	 		- MEMBER_EMAIL이 'user01'인 회원 조회
	 			SELECT * FROM MEMBER WHERE 	  ${test2}   = #{test1}
	 									 	MEMBER_EMAIL = 'user01'
	  -->
	<select id="login" parameterType="Member" resultMap="member_rm">
		SELECT MEMBER_NO, MEMBER_EMAIL, MEMBER_NICKNAME, MEMBER_PW,
		MEMBER_TEL, MEMBER_ADDR, PROFILE_IMG, AUTHORITY,
		TO_CHAR(ENROLL_DATE, 'YYYY"년" MM"월" DD"일" HH24"시" MI"분" SS"초"') AS ENROLL_DATE
		FROM "MEMBER"
		WHERE MEMBER_DEL_FL = 'N'
		AND MEMBER_EMAIL = #{memberEmail}
		<!--
			AND MEMBER_EMAIL = ?
			AND MEMBER_PW = ?
		 -->
	</select>
	
</mapper>
profile
나를 죽이지 못하는 오류는 내 코드를 더 강하게 만들지ㅋ

0개의 댓글