(스프링) 마이바티스와 스프링 통합

순서가 안 맞는데 공부를 먼저 해야 하니까 마이바티스 먼저..

나중에 다시 발급받아야 겠습니다.

마이바티스

마이바티스란?

마이바티스

  • SQL 매핑 프레임워크
  • 마이바티스로 DAO를 구현하기 위해서는 SqlSession이 필요하며 SqlSession은 SqlSessionFactory로 생성된다.
  • 마이바티스 공식 문서

마이바티스 실습

1. 프로젝트에 MyBatis 추가

1-1. 필수 라이브러리 추가: mysql 커넥터, mybatis

  • MVN 저장소에서 jar 파일을 다운로드합니다.
  • 프로젝트에 lib 폴더를 만들고 mysql 커넥터와 mybatis를 추가합니다.
  • 빌드 경로에서 jar로 가져오기 > 프로젝트에 라이브러리 추가

2. 리소스 내 환경 설정(mybatis-config.xml, db.properties, sqlConfig.java)

2-1. MyBatis를 구성하는 mybatis-config.xml 생성

  • 리소스 폴더를 만들고 그 안에 xml 파일을 만듭니다.

2-2. 이 파일이 MyBatis 구성 파일임을 나타내는 Doctype 코드 추가

<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-config.dtd">

2-3. 추가하다 XML로

<configuration>
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="${driver}" />
				<property name="url" value="${url}" />
				<property name="username" value="${username}" />
				<property name="password" value="${password}" />
			</dataSource>
		</environment>
	</environments>
	<mappers>
		<mapper resource="mapper/boardMapper.xml" />
	</mappers>
</configuration>
  • 구성을 생성할 때 다음 순서를 준수해야 합니다.

– 속성
– 설정
– typeAliases
– typeHandlers
– objectFactory
– 플러그인
– 환경
– 환경
– transactionManager
– 데이터 소스
– 데이터베이스 ID 제공자
– 매퍼

  • 환경과 매퍼는 필수적이며 속성과 typeAliases는 자주 사용됩니다.
속성 db 설정을 가져올 경로
typeAliases mapper.xml에 반복적으로 기록되는 경로/전체 패키지 이름의 별칭을 지정합니다.
환경 환경 태그를 사용하여 여러 환경을 설정할 수 있습니다.
매퍼 mapper.xml의 경로

2-4. db 설정을 위한 db.properties 파일 생성

  • 일반 텍스트 파일
  • xml 파일의 속성에 해당
url=jdbc:mysql://localhost:3306/<db 이름>?serverTimezone=UTC
driver=com.mysql.cj.jdbc.Driver
username=<username 작성>
password=<password 작성>

2-5. db.properties에서 db 설정을 가져오도록 xml에 코드 추가

<properties resource="config/db.properties"/>

3. src 아래에 파일 생성

3-1. 필요한 DTO, DAO 작성

3-2. sqlConfig.java 작성

import java.io.IOException;
import java.io.Reader;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class MyAppSqlConfig {
	private static SqlSession session;
	
	static {
		try {
			String resource = "config/mybatis-config.xml";
			Reader reader = Resources.getResourceAsReader(resource);
			SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);

			session = sqlSessionFactory.openSession(true);
			// System.out.println("세션 생성 성공");
		} catch (IOException e) {
			// System.out.println("세션 생성 실패");
		}
	}
	
	public static SqlSession getSession() {
		return session;
	}
	
}
  • try ~ catch 문으로 MyBatis 구성 파일 가져오기
  • 문자열 리소스 = “config/mybatis-config.xml”; : 리소스에 MyBatis 설정 경로 넣기
  • SqlSessionFactory는 인터페이스 → SqlSessionFactoryBuilder를 사용하여 sqlSessionFactory를 생성합니다.
  • 세션 팩토리를 사용하여 세션 가져오기: sqlSessionFactory에서 openSession
    • openSession에서 true 옵션: autocommit
  • public static SqlSession getSession() : 비공개 세션을 외부에서 사용할 수 있도록 하는 getter

3-3. 테스트 파일 생성

public class Test {
	public static void main(String() args) {
		BoardDao dao = MyAppSqlConfig.getSession().getMapper(<DAO파일>.class); 
		
        // 테스트 코드 작성
		
	}
}

4. Mapper.xml을 생성하여 DAO와 DB를 매핑합니다.

4-1. 추가하다

<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="<DAO의 풀패키지명>">
</mapper>
  • namespace : 매핑할 DAO

4-2. 아래에서 DAO의 각 방법을 구현하십시오.

전.

<select id="selectOne" parameterType="int"  resultType="boardMap">
	SELECT id, content, writer, title, view_cnt as viewCnt
	FROM board
	WHERE id = #{id};
</select>
  • id : DAO의 메소드 이름
  • 매개변수 유형
  • resultType : 반환된 DTO
    • 전체 패키지 이름을 만들어야 하지만 mybatis-config.xml에 지정된 typeAlias로 별칭을 지정하면 간단하게 만들 수 있습니다.
    • 리스트가 반환되더라도 리스트가 입력되지 않아도 리스트로 반환된다.

참조 resultMap

  • 위의 예에서 view_cnt(db 컬럼명)는 viewCnt(DTO의 필드명)로 수신됩니다.
  • 별칭을 매번 지정하는 것이 번거롭기 때문에 속성을 다음과 같이 지정하면 아래에 db 컬럼명에 별칭을 지정하지 않아도 DTO 필드명으로 인식된다.

전.

<mapper namespace="<풀패키지명>">
	<resultMap type="<반환되는 DTO>" id="<resultMap의 id>">
		<result column="<db 컬럼명>" property="<DTO 필드명>"/>
		// ...
	</resultMap>
</mapper>

값을 전달할 때 ${}와 #{}의 차이점 (참조)

– #{}: ”가 자동으로 추가되어 문자열로 전송됨 → 악성 쿼리 삽입 방지 / 보안상 유리함 / 주로 사용자 입력 전달 시 사용
– ${} : 중괄호 안에 전달하여 파라미터를 받을 수 있음 → 테이블명, 컬럼명을 전달할 때 주로 사용