3. Back-end/3-2. Spring MVC - 남궁성

SpringMVC - [ MyBatis ]

yunyj99 2023. 3. 26. 02:39

1. MyBatis란?

MyBatisSQL Mapping Framework로, 자바 코드로부터 SQL문을 분리해서 관리할 수 있다. 매개변수 설정과 쿼리 결과를 읽어오는 코드를 제거해줘서 생산성 향상 & 유지 보수 편리의 장점이 있다. 

 

원래 왼쪽과 같이 작성했던 코드를 오른쪽과 같이 분리해서 쓸 수 있다.

 

 

 

 

 


2. SqlSession

1) SqlSessionFactoryBean, SqlSessionTemplate

SqlSessionFactory가 SqlSession을 생성해서 제공하고, SqlSession이 SQL명령을 수행하는 데 필요한 메서드를 제공한다.

앞 선 두 개는 인터페이스이고, 이를 각각 구현한 게 SqlSessionFactoryBean, SqlSessionTemplate이다.

SqlSessionTemplate은 thread-safe로, 멀티쓰레드에서 안전하다. 즉 여러 DAO에서 동시에 접근해서 공유할 수 있다.

 

이를 사용하기 위해서는 root-context.xml 파일에 아래처럼 빈으로 등록 해줘야 한다.

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="configLocation"  value="classpath:mybatis-config.xml"/>
    <!-- SqlSessionFactoryBean 등록할 때 Mapper XML 위치도 지정해 줘야함 -->
    <property name="mapperLocations" value="classpath:mapper/*Mapper.xml"/>
</bean>

<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
    <constructor-arg ref="sqlSessionFactory"/>
</bean>

 

 


2) 주요 메서드

메서드 설명
int insert(String statement)
int insert(String statement, Object Parameter)
insert문을 실행하고, insert된 행의 개수를 반환
int delete(String statement)
int delete(String statement, Object Parameter)
delete문을 실행하고, delete된 행의 개수를 반환
int update(String statement)
int update(String statement, Object Parameter)
update문을 실행하고, update된 행의 개수를 반환
T selectOne(String statement)
T selectOne(String statement, Object Parameter)
하나의 행을 반환하는 select에 사용
parater로 SQL에 binding될 값 제공
List<E> selectList(String statement)
List<E> selectList(String statement, Object Parameter)
여러 행을 반환하는 select에 사용
parater로 SQL에 binding될 값 제공
Map<K,V> selectMap(String statement, String keyCol)
Map<K,V> selectMap(String statement, String keyCol, Object parameter)
여러 행을 반환하는 select에 사용
keyCol에 Map의 Key로 사용할 컬럼 지정

 

 

 


3) <typeAliases>로 이름 짧게 하기

Mapper XML에서 parameterType에 보면 DTO파일의 경로를 다 적어줘야 해서 너무 길다. 

이는 mybatis-config.xml파일에 <typeAliases>를 이용해 별명을 지정해 줄 수 있다.

 

 

 

 


3. MyBatis로 DAO 작성

1) DB에 테이블 생성

2) Mapper XML & DTO 작성

Mapper XML

3) DAO 인터페이스 구현한 후 -> Extract Interface 해서 인터페이스 생성

인터페이스 구현
인터페이스 추출

 

 

 


4. DTO란?

DTO(Data Transfer Object)계층간의 데이터를 주고 받기 위해 사용되는 객체이다. DB 테이블에 맞게 정의해주면 된다.

 

아래와 같은 테이블이 있다면 

create table board (
    bno	int	auto_increment		primary key,
    title	varchar(45)		not null,
    content	text			not null,
    writer	varchar(30)		not null,
    view_cnt	int 	default 0	null,
    comment_cnt	int	default 0	null,
    reg_date	datetime		null
);

DTO는 이런 식으로 테이블에 맞춰서 생성해주면 된다.

int 타입은 Integer로 작성해주는 게 좋다. 받아오는 값이 null일 경우 int 타입은 에러가 뜨지만 Integer로는 받아올 수 있다.

public class BoardDto {
    private Integer bno;
    private String title;
    private String content;
    private String writer;
    private int view_cnt;
    private int comment_cnt;
    private Date reg_date;
    
    // 생성자, getter & setter, toString()
    // ...
}

 

 

 

 


부가 설명

1) #{} 와 ${} 차이

Mapper XML 에 썼던 코드들은 오른쪽과 같이 바뀐다.

 

#{ }를 사용하면 PreparedStatement로 바뀌고, 값에만 사용할 수 있다. 따옴표를 붙여주지 않아도 타입에 따라 알아서 붙여준다. pstmt를 사용하므로 SQL Injection을 방지할 수 있다.

 

${ }를 사용하면 Statement로 바뀌고, 따옴표를 직접 붙여주야 하는 번거로움이 있지만 조금 더 유연하게 쓸 수 있다. #{ }와 다르게 테이블 이름, 컬럼명 등에도 ${ }를 사용할 수 있다..

 

 


2) XML의 특수 문자 처리

XML내의 특수 문자( <, >, &, ...) 등 은 &lt;  &gt;   로 변환이 필요하다.

또는 특수문자가 포함된 쿼리를 <![CDATA[   ]]>  로 감싸줘야 한다.  (전부 character data로 인식)

 

 

 


참조

https://fastcampus.co.kr/dev_academy_nks

 

스프링의 정석 : 남궁성과 끝까지 간다 | 패스트캠퍼스

국비지원 조기 마감 신화, 베스트셀러 'JAVA의 정석'의 저자 남궁성의 Spring 강의입니다! 오픈톡방과 카페에서 평생 AS를 제공하며 완강과 취업까지 도와드립니다. 지금 할인가로 확인하세요!

fastcampus.co.kr