javaboiii의 Spring

Spring - 성능 개선(MyBatis맛)

javaboiii 2024. 11. 4. 17:20

Spring

마이바티스(MyBatis)는 XML이나 Annotation을 통해 SQL문을 작성하고

객체들을 연결시키는 프레임워크임

 

XML 방식은 SQL매퍼를 XML파일에 작성하며 <select>,<resultMap> 등의 요소로 작성함

어노테이션 방식은 @Select와 같은 자바 어노테이션을 활용해 SQL 매퍼를 작성함

 

MyBatis의 장점

자바 코드가 짧아짐 >> 가독성이 좋음

SQL 구문을 전부 .xml로 분리해서 관리

    >> 결합도가 낮아짐

    >> 응집도 높아짐

    >> 유지보수 용이

SQL 구문에 변경사항이 발생했을 때 과거에는 .java가 변경 -> 재컴파일

지금은 xml이 변경됨 -> 컴파일 xxx

 

MyBatis의 단점

복잡한 매핑

    개발자가 직접 객체와 관계 매핑을 처리해야됨

반복적인 코드

    CRUD 작업을 자주 수행 시, 비슷하거나 같은 코드를 반복적으로 작성 시
    번거롭고 양이 많아 짐

 

 

MyBatis 사용방법

MyBatis 설치

이클립스 marketPlace에서 mybatis 검색

 

(mybatis 파일을 쉽게 생성하고 관리할 수 있는 도구)

두 개 설치

 

pom.xml 설정

<!-- MyBatis -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.6</version>
</dependency>
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>2.1.0</version>
</dependency>

 

sql-map-config.xml 설정

MyBatis는 ORM(Object Relational Mapping: 관계형 데이터베이스 관리 시스템)이 아니기 때문에

별도로 설정 파일을 만들어 SQL 쿼리와 Java 객체 간의 매핑을 정의해야 함

 

객체지향프로그래밍 <-> 관계형 데이터베이스 관리 시스템(RDBMS) 
                                 매핑
                                 데이터가 다름
                                 변환
→객체(DTO, VO)                → 테이블, SQL 구문 및 그 결과

<?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.koreait.app.biz.board.BoardDTO" alias="board" />
	</typeAliases>
   
	<!-- SQL 구문 설정파일 알려주기 -->
	<mappers>
		<mapper resource="mappings/board-mapping.xml" />
		<!-- <mapper resource="mappings/member-mapping.xml" /> -->
	</mappers>
</configuration>

< typeAlias type="cohttp://m.koreait.app.biz.board.BoardDTO" alias="board" />
== BoardDTO를 ORM 에서는 board 라고 부를거야

 

< mapper resource="mappings/board-mapping.xml" />
== JAVA 코드에서 제거한 SQL 구문들이 xxx.xml 파일에 있다 라는 설정

 

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">	<!-- namespace는 메모리칸에 이름을 지어주는 것 없으면 다른 xml과 구분할 수가 없음 테이블 이름으로 쓰기도함(아예 관계없는 이름을 쓸 수도 있음) -->
   <insert id="insert">
      INSERT INTO BOARD (BOARD_CONTENT, BOARD_WRITER_ID) 
      VALUES(#{board_content},#{board_writer_id})
   </insert>
   <select id="selectOne" resultType="board">
      SELECT BOARD_NUM,BOARD_CONTENT,BOARD_WRITER_ID FROM BOARD 
      WHERE BOARD_NUM=#{board_num}
   </select>
   <select id="selectAll" resultType="board">
      SELECT BOARD_NUM, BOARD_CONTENT, BOARD_WRITER_ID FROM BOARD
   </select>
   <select id="selectAll_CONTENT" resultType="board"> <!-- <select id="selectAll_CONTENT" resultType="com.korea.app.biz.board"> config파일에 alias를 설정하는 이유 -->
      SELECT BOARD_NUM, BOARD_CONTENT, BOARD_WRITER_ID FROM BOARD 
      WHERE BOARD_CONTENT LIKE CONCAT('%', #{search_content}, '%')
      <!-- ORM MyBatis 파라미터를 받는 방법 객체이름(keyword) -->
   </select>
   <select id="selectAll_WRITER" resultType="board">
      SELECT BOARD_NUM, BOARD_CONTENT, BOARD_WRITER_ID FROM BOARD 
      WHERE BOARD_WRITER_ID LIKE CONCAT('%', #{search_content}, '%')
   </select>
</mapper>

DAO 작성

@Repository
public class BoardDAO3 {
	@Autowired
	private SqlSessionTemplate mybatis;
	
	public List<BoardDTO> selectAll(BoardDTO boardDTO) {
		//뎁스 줄이기를 할땐 null 체크 필수
		if(boardDTO.getBoard_condition() != null && boardDTO.getBoard_condition().equals("SELECT_BY_CONTENT")) {
			//return mybatis.selestList("어떤 SQL을 부를지", 필요한 파라미터가 누군지);
			return mybatis.selectList("BoardDAO.selectAll_CONTENT",boardDTO); // 매퍼에 있는 네임스페이스 점 아이디 이름
		}
		else if(boardDTO.getBoard_condition()  != null && boardDTO.getBoard_condition().equals("SELECT_BY_WRITER")) {
			return mybatis.selectList("BoardDAO.selectAll_WRITER",boardDTO); // 매퍼에 있는 네임스페이스 점 아이디 이름
		}
		return mybatis.selectList("BoardDAO.selectAll",boardDTO); // 매퍼에 있는 네임스페이스 점 아이디 이름
	}
	public BoardDTO selectOne(BoardDTO boardDTO) {
		return mybatis.selectOne("BoardDAO.selectOne",boardDTO);
	}
	public boolean insert(BoardDTO boardDTO) {
		int result =  mybatis.insert("BoardDAO.insert", boardDTO);
		if(result <= 0) {
			return false;
		}
		return true;
	}
	public boolean update(BoardDTO boardDTO) {
		return false;
	}
	public boolean delete(BoardDTO boardDTO) {
		return false;
	}
}