Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

dearbeany

[MyBatis] MyBatis와 Java 초기세팅 (Mapper, typeAlias, $과 #의 차이) 본문

Spring

[MyBatis] MyBatis와 Java 초기세팅 (Mapper, typeAlias, $과 #의 차이)

dearbeany 2022. 10. 20. 07:46

MyBatis

개발자가 지정한 SQL, 저장프로시저 그리고 몇가지 고급 매핑을 지원하는 퍼시스턴스 프레임워크이다. JDBC로 처리하는 상당부분의 코드와 파라미터 설정 및 결과 매핑을 대신해준다. 데이터베이스 레코드에 원시타입과 Map 인터페이스 그리고 자바 POJO 를 설정해서 매핑하기 위해 XML과 애노테이션을 사용할 수 있다.

- JDBC로 처리하는 상당부분의 코드와 파라미터 설정, 결과 매핑(ResultSet)을 대신해준다.

- 결국 JDBC를 편하게 해주는 프레임워크

- 하나의 프레임워크로 꼭 스프링이랑 같이 쓰는 건 아니다! 따라서 먼저 예시에선 Java와만 사용을 해보자.

 

더보기

JDBC: DB와 자바프로젝트를 연결 시켜주는 인터페이스.

- JDBC를 쓰기 위해서는 MySQL이 필요했다. 즉 mysql-connector-jdbc.jar가 필요했었다.

 

MyBatis에 대해 더 알아보기

https://mybatis.org/mybatis-3/ko/getting-started.html

 

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>로 지정해놓았다.

Test 파일을 실행할 경우

 

 

 

${id} 결과값이 그냥 나온다. 보안상의 위험이 보다 있을 수도 있다.

#{id} 결과값이 ' ' 의 형태로 나온다. 따라서 이 방식을 더 사용하자!

 

즉, ‘$’는 파라미터로 넘긴 값을 그대로 SQL 내부에 삽입하는 반면, ‘#’은 값 앞뒤로 작은 따옴표(’’)를 붙여 가져오기 때문에 SQL Injection을 방지할 수 있다.

 

- resultMap: type은 typeAlias로 지정한 Board로 적고, id는 지칭할 이름으로 지정하자.