Mybatis 란
MyBatis는 자바 개발자들이 데이터베이스를 쉽게 다룰 수 있도록 도와주는
오픈 소스 ORM(Object Relational Mapping) 프레임워크이다.
Mybatis의 사용 목적
객체지향 프로그래밍 언어 <-> RDBMS (관계형 데이터베이스 관리 시스템)
프로그래밍 언어와 쿼리를 분리하여 유지보수성을 높이고 응집도를 높이고 결합도를 낮춘다.
Mybatis의 장점
코드 가독성 ↑
JDBCTemplate을 사용할 때처럼 반복되는 코드를 줄여 간결해지고
쿼리문에 명시적으로 입력할 수 있어 가독성이 증가한다.(기존 ? -> #{member_id} 직관적으로 확인 가능)
간결성, 유연성
SQL문과 프로그래밍 언어 코드가 분리되어 있어 응집도 ↑ 결합도 ↓ 유지보수에 용이하다.
개발 비용 절약
기존 SQL문은 java 파일 안에 있어 쿼리문 변경 시에도 재 컴파일로 인한 컴파일 비용이 발생한다.
하지만 Mybatis는 xml 에 쿼리문을 정의하기 때문에 쿼리문을 수정해도 컴파일을 다시 할 필요가 없어
개발 비용이 절약된다.
동적 쿼리 용이
Mybatis를 사용하면 동적쿼리를 구성하는 것이 더욱 용이해지고 쉬워진다.
Mybatis에서는 동적 쿼리를 작성하기 위해 if, choose, when, otherwise, foreach 등의 태그 사용이 가능하다.
동적 쿼리란
실행 시점(runtime)에 쿼리의 구조를 동적으로 변경할 수 있는 기능을 말한다.
Mybatis 의존 설정 (pom.xml)
<!-- Mybatis 설정 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>
<!-- Mybatis Spring 연동 설정 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>3.0.3</version>
</dependency>
Mybatis 객체 생성 (applicationContext.xml)
<bean class="org.apache.commons.dbcp.BasicDataSource" id="ds" destroy-method="close">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://root@localhost:3306/COMA"/>
<property name="username" value="root"/>
<property name="password" value="1234"/>
</bean>
<bean class="org.springframework.jdbc.core.JdbcTemplate" id="jdbcTemplate">
<property name="dataSource" ref="ds"/>
</bean>
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="ds" />
<property name="configLocation" value="classpath:sql-map-config.xml" />
</bean>
<bean id="mybatis" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="sqlSession" />
</bean>
Mybatis 설정 (sql-map-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>
<!--자료형에 별칭 붙여주기-->
<typeAliases>
<typeAlias type="com.nsd.app.biz.board.BoardDTO" alias="board" />
</typeAliases>
<!--SQL 구문 설정파일 알려주기-->
<mappers>
<mapper resource="mappings/board-mapping.xml" />
</mappers>
</configuration>
Mybatis SQL 설정 (board-mapping.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="BoardDAO">
<insert id="insert">
INSERT INTO BOARD (BOARD_CONTENT,BOARD_WRITER_ID)
VALUES(#{board_content},#{board_writer})
</insert>
<select id="selectOne" resultType="board">
SELECT BOARD_NUM,BOARD_TITLE,BOARD_CONTENT,BOARD_WRITER_ID FROM BOARD
WHERE BOARD_NUM=#{board_num}
</select>
<select id="selectAll" resultType="board">
SELECT BOARD_NUM, BOARD_TITLE, BOARD_CONTENT, BOARD_WRITER_ID, MEMBER_NAME AS BOARD_NAME FROM BOARD B JOIN MEMBER M ON B.BOARD_WRITER_ID = M.MEMBER_ID ORDER BY BOARD_NUM DESC
</select>
<select id="selectAll_CONTENT" resultType="board">
SELECT BOARD_NUM, BOARD_TITLE, BOARD_CONTENT, BOARD_WRITER_ID, MEMBER_NAME FROM BOARD B JOIN MEMBER M ON B.BOARD_WRITER_ID = M.MEMBER_ID
WHERE BOARD_CONTENT LIKE CONCAT('%',#{board_search_value},'%')
</select>
<select id="selectAll_TITLE" resultType="board">
SELECT BOARD_NUM, BOARD_TITLE, BOARD_CONTENT, BOARD_WRITER_ID, MEMBER_NAME FROM BOARD B JOIN MEMBER M ON B.BOARD_WRITER_ID = M.MEMBER_ID
WHERE BOARD_TITLE LIKE CONCAT('%',#{board_search_value},'%')
</select>
</mapper>
Mybatis 사용하기 (BoardDAO3.java)
@Repository
public class BoardDAO3{
@Autowired
private SqlSessionTemplate mybatis;
public List<BoardDTO> selectAll(BoardDTO boardDTO) {
if(boardDTO.getBoard_search_value()!=null && "CONTENT".equals(boardDTO.getBoard_search_key())){
System.out.println("BoardDAO.java log if (boardDTO.getBoard_search_value()!=null && boardDTO.getBoard_search_value().equals(\"CONTENT\"))");
return mybatis.selectList("selectAll_CONTENT", boardDTO);
}
else if (boardDTO.getBoard_search_value()!=null && "TITLE".equals(boardDTO.getBoard_search_key())) {
System.out.println("BoardDAO.java log else if boardDTO.getBoard_search_value()!=null && boardDTO.getBoard_search_value().equals(\"TITLE\")");
return mybatis.selectList("selectAll_TITLE", boardDTO);
}
System.out.println("BoardDAO.java log else");
return mybatis.selectList("selectAll", boardDTO);
}
public BoardDTO selectOne(BoardDTO boardDTO) {
return mybatis.selectOne("selectOne", boardDTO);
}
public boolean insert(BoardDTO boardDTO) {
return mybatis.insert("insert", boardDTO)>=0;
}
public boolean update(BoardDTO boardDTO) {
return false;
}
public boolean delete(BoardDTO boardDTO) {
return false;
}
}
Mybatis 발생가능한 주요 예외
예외 | 설명 | 원인 및 해결 방법 |
java.lang.NullPointerException | 널 포인터 예외 | 객체가 null 인데 이를 참조하려고 할 때 발생. 객체가 null인지 미리 확인하거나 초기화 필요. |
org.apache.ibatis.exceptions.PersistenceException | MyBatis 퍼시스턴스 계층의 일반적인 예외 | 다양한 원인으로 발생하며, 하위 예외를 확인하여 구체적인 문제 파악 필요. |
java.sql.SQLException | SQL 예외 | 쿼리 실행 중 SQL 오류 발생. SQL 문법 오류, 데이터베이스 연결 문제 등으로 발생. SQL 구문 확인 및 데이터베이스 설정 점검 필요. |
org.apache.ibatis.binding.BindingException | 매퍼 인터페이스 바인딩 예외 | 매퍼 인터페이스가 MyBatis 설정에 제대로 바인딩되지 않았을 때 발생. 매퍼 xml과 인터페이스가 제대로 연결되었는지 확인 필요. |
org.apache.ibatis.reflection.ReflectionException | 리플렉션 예외 | 리플렉션을 사용하는 과정에서 발생. 필드나 메서드 접근 실패 등으로 인해 발생. 필드나 메서드 이름이 올바른지 확인 필요. |
org.apache.ibatis.executor.ExecutorException | 쿼리 실행 중 예외 | 쿼리 실행 중에 발생하는 예외. 매핑 설정의 문제, 잘못된 SQL 등으로 발생. 매핑 설정과 SQL 쿼리 점검 필요. |
org.apache.ibatis.session.SqlSessionException | SQL 세션 처리 중 예외 | SqlSession 처리 중에 발생하는 예외. SqlSession의 잘못된 사용이나 리소스를 닫지 않았을 때 발생. SqlSession 사용 방법 점검 필요. |
org.apache.ibatis.builder.BuilderException | MyBatis 빌더 예외 | MyBatis 설정 파일이나 매퍼 XML의 구문 오류 등으로 발생. 설정 파일 및 XML 문법 확인 필요. |
org.apache.ibatis.exceptions.IbatisException | MyBatis의 일반적인 상위 예외 | MyBatis에서 발생하는 다양한 예외의 상위 클래스. 구체적인 하위 예외를 통해 문제를 파악 필요. |
728x90
'국비 내용 정리 > Spring' 카테고리의 다른 글
국비 69일 내용 정리 (MultipartFile) (0) | 2024.10.22 |
---|---|
국비 68일 내용정리 (템플릿 패턴) (0) | 2024.10.19 |
국비 67일 내용정리 (AOP @어노테이션) (0) | 2024.10.16 |
국비 66일 내용정리 (AOP) (1) | 2024.10.15 |
국비 65일 내용정리 (Spring 비동기) (0) | 2024.10.14 |