dearbeany
[MyBatis] MyBatis와 Java 초기세팅 (Mapper, typeAlias, $과 #의 차이) 본문
MyBatis
개발자가 지정한 SQL, 저장프로시저 그리고 몇가지 고급 매핑을 지원하는 퍼시스턴스 프레임워크이다. JDBC로 처리하는 상당부분의 코드와 파라미터 설정 및 결과 매핑을 대신해준다. 데이터베이스 레코드에 원시타입과 Map 인터페이스 그리고 자바 POJO 를 설정해서 매핑하기 위해 XML과 애노테이션을 사용할 수 있다.
- JDBC로 처리하는 상당부분의 코드와 파라미터 설정, 결과 매핑(ResultSet)을 대신해준다.
- 결국 JDBC를 편하게 해주는 프레임워크
- 하나의 프레임워크로 꼭 스프링이랑 같이 쓰는 건 아니다! 따라서 먼저 예시에선 Java와만 사용을 해보자.
JDBC: DB와 자바프로젝트를 연결 시켜주는 인터페이스.
- JDBC를 쓰기 위해서는 MySQL이 필요했다. 즉 mysql-connector-jdbc.jar가 필요했었다.
MyBatis에 대해 더 알아보기
1. Java Project 생성 및 jar 추가
- MyBatis 사용을 위한 세팅을 해보자. lib폴더에 jar파일을 2개 추가한 후
- Build Path > Configure Build Path > Add Jars > 현재 lib에 추가된 jar 두 개 다 등록한다.
2. MyBatis 설정파일 세팅
- resources 폴더 하위에 mybatis-config.xml 파일과 db.properties 파일(추후 스프링부트 연장학습)을 추가한다.
- db.properties는 이전 JDBC의 설정을 가져와서 참고하여 작성한다.
// 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>
// (1)
<properties resource="config/db.properties"/>
// (2)
<typeAliases>
<typeAlias type="com.ssafy.board.model.dto.Board" alias="Board"/>
</typeAliases>
<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>
// (3)
<mappers>
<mapper resource="mapper/board.xml"/>
</mappers>
</configuration>
→ 위 파일이 세팅완성본. 매퍼설정에 대한 설명은 아래부터 하도록 하겠다!
<!-- db.properties -->
url=jdbc:mysql://localhost:3306/ssafy_board?serverTimezone=UTC
driver=com.mysql.cj.jdbc.Driver
username=root
password=ssafy
3. 매퍼설정
(1) properties
(2) typeAliases :
- 코드의 간편성 및 길어짐 방지를 위해 사용한다.
- 클래스 식별은 풀패키지명으로 하였다. 동일한 이름을 가진 클래스들은 같은 패키지에 있을 수 없기 때문이다.
- Board에 대해 등록한다. (추후 mapper.xml 파일에서 resultType에 풀패키지명 대신 Board라고 쓰는 것이 가능해진다.)
(3) Mapper XML 파일 생성
- board.xml 생성
- namespace : DB와 직접 관련 있는 자바코드. 즉 dao이다.
// board.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.ssafy.board.model.dao.BoardDao">
</mapper>
(4) mappers 추가
- mapper가 여러 개일 수도 있기 때문에 mappers 안에 등록한다.
resultType : 이 구문에 의해 리턴되는 기대타입의 패키지 경로를 포함한 전체 클래스명이나 별칭.
4. MyAppSqlConfig.java 파일 생성
- 커넥션을 열고 닫고 하는 설정파일을 작성한다. 미리 만들어져야 하므로 static { } 블록 안에 작성. 프로그램 실행 시작 시 static 메모리에 모두 올라간다.
- 설정파일 resource를 읽어서 reader를 만들고, sqlSessionFactoryBuilder를 이용해서 sqlSessionFactory를 만들도록 한다.
- 이제부터는 getSession을 통해 세션을 new로 매번 만들지 말고 가져다가 쓰도록 하자!
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); // true라는 옵션을 주면 자동 커밋 된다.
System.out.println("세션 빌드 성공");
} catch (IOException e) {
System.out.println("세션 빌드 실패");
}
}
public static SqlSession getSession() {
return session;
}
}
5. Mapper 작성
- namespace : dao의 인터페이스의 풀패키지명을 적어놓으면 인터페이스를 세션과 연결시켜 바로 사용할 수 있게끔 한다.
// board.xml
<mapper namespace="com.ssafy.board.model.dao.BoardDao">
<select id="selectAll" resultType="Board">
SELECT * FROM Board
</select>
</mapper>
DB는 view_cnt, reg_date로 저장되어있으나
DTO는 viewCnt, regDate로 저장되어있다.
따라서 매핑을 하는 설정을 board.xml에 작성하자.
// board.xml
<mapper namespace="com.ssafy.board.model.dao.BoardDao">
<select id="selectAll" resultType="Board">
SELECT id, content, title, view_cnt as viewCnt, date_format(reg_date, '%Y-%m-%d') as regDate
FROM Board
</select>
</mapper>
- resultType : 내가 사용할 수 있는 클래스. 풀패키지명을 적어야 하나, 앞서 Board 클래스를 <typeAlias>로 지정해놓았다.
${id} 결과값이 그냥 나온다. 보안상의 위험이 보다 있을 수도 있다.
#{id} 결과값이 ' ' 의 형태로 나온다. 따라서 이 방식을 더 사용하자!
즉, ‘$’는 파라미터로 넘긴 값을 그대로 SQL 내부에 삽입하는 반면, ‘#’은 값 앞뒤로 작은 따옴표(’’)를 붙여 가져오기 때문에 SQL Injection을 방지할 수 있다.
- resultMap: type은 typeAlias로 지정한 Board로 적고, id는 지칭할 이름으로 지정하자.
'Spring' 카테고리의 다른 글
[MyBatis] Spring 과 MyBatis 연동 및 세팅 | 게시판 CRUD 실습 (0) | 2022.10.21 |
---|---|
[Tomcat] starting tomcat v9.0 server at localhost has encountered a problem in mac (0) | 2022.10.20 |
[Spring] SpringMVC 요청처리흐름 | 파일업로드와 다운로드 실습 (0) | 2022.10.19 |
[AOP] 프록시패턴 (0) | 2022.10.13 |
[Spring] Spring DI 종합실습1~3. JDBC 를 Spring 프로젝트로 바꾸기 | AOP (0) | 2022.10.12 |