순서가 안 맞는데 공부를 먼저 해야 하니까 마이바티스 먼저..
나중에 다시 발급받아야 겠습니다.
마이바티스
마이바티스란?
마이바티스
- 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. 추가하다
<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>
값을 전달할 때 ${}와 #{}의 차이점 (참조)
– #{}: ”가 자동으로 추가되어 문자열로 전송됨 → 악성 쿼리 삽입 방지 / 보안상 유리함 / 주로 사용자 입력 전달 시 사용
– ${} : 중괄호 안에 전달하여 파라미터를 받을 수 있음 → 테이블명, 컬럼명을 전달할 때 주로 사용