1. MyBatis란?
- DB 연동을 대신해주는 프레임워크이며, XML과 애노테이션을 사용하는 2가지 방법이 있다.(즉, DAO의 역할을 대신해줌)
MyBatis의 공식 페이지에서는 아래와 같이 설명
(https://mybatis.org/mybatis-3/ko/index.html)
ㄱ. 마이바티스는 개발자가 지정한 SQL, 저장프로시저 그리고 몇가지 고급 매핑을 지원하는 퍼시스턴스 프레임워크이다.
ㄴ. 마이바티스는 JDBC로 처리하는 상당부분의 코드와 파라미터 설정및 결과 매핑을 대신해준다.
ㄷ. 마이바티스는 데이터베이스 레코드에 원시타입과 Map 인터페이스 그리고 자바 POJO 를 설정해서 매핑하기 위해 XML과 애노테이션을 사용할 수 있다.
2. Mapper XML 파일
1) 마이바티스의 가장 큰 장점은 매핑구문이다.
2) SQL Map XML 파일은 상대적으로 간단하다. 동일한 기능의 JDBC 코드(DAO)와 비교하면 아마도 95% 이상 코드수가 감소하기도 한다.
3) 마이바티스는 SQL을 작성하는데 집중하도록 만들어졌다.
4) SQL Map XML파일은 첫번째(first class)엘리먼트만을 가진다.
cache - 해당 네임스페이스을 위한 캐시 설정
cache-ref - 다른 네임스페이스의 캐시 설정에 대한 참조
resultMap - 데이터베이스 결과데이터를 객체에 로드하는 방법을 정의하는 엘리먼트
parameterMap - 비권장됨! 예전에 파라미터를 매핑하기 위해 사용되었으나 현재는 사용하지 않음
sql - 다른 구문에서 재사용하기 위한 SQL 조각
insert - 매핑된 INSERT 구문.
update - 매핑된 UPDATE 구문.
delete - 매핑된 DELEETE 구문.
select - 매핑된 SELECT 구문.
참고 : https://mybatis.org/mybatis-3/ko/sqlmap-xml.html
교재 p563~p576
3. 스프링에서 MyBatis 사용하기 위해서는?
스프링에서는 MyBatis/iBATIS와의 연동 기능이 포함되어 있지 않다.
(iBATIS는 2.0 버전으로 과거에 부르던 명칭)
대신 MyBatis가 직접 스프링과 MyBatis를 연동하기 위한 모듈을 제공하고 있으므로 모듈을 사용하면 스프리잉 제공하는 DataSource 및 트랜잭션 관리 기능을 MaBatis에 적용할 수 있다.
스프링 -> 모듈 설치 -> MyBatis -> DB연동
4. MyBatis를 스프링과 연동하기
1) pom.xml에 mybatis와 mybatis-spring 모듈 추가
2) SqlSessionFactoryBean을 이용해서 SqlSessionFactory 설정
SqlSession을 생성하는 공장을 빈 객체로 만들고 SqlSessionFactory(공장)로 SqlSession 생성하는 것
root-context.xml에 SqlSessionFactory 빈 객체 생성 후 프로퍼티로 dataSource와 mapperLocations 추가
( 트랜잭션도 필요하다면 트랜잭션 설정도 해야하는데 오늘 수업에서는 설정하지 않았다. )
이제 root-context.xml에서 설정한 mapperLocations의 Mapper XML 파일의 경로에 해당하는 패키지와 Mapper.xml 파일을 생성해야한다.
org.doit.web.newlecture.dao.mapper 패키지 생성 후 NLNoticeDao.xml 파일과 NLMemberDao.xml 생성
MyBatis 공식 페이지 -> 시작하기 -> 매핑된 SQL 구문 살펴보기에 있는 코드 복사하여 NLNoticeDao.xml 파일에 붙여넣기
그 안에 있는 Sample 코드인 <select> 태그 구문은 주석처리하자
4) MyBatis를 이용한 DAO 구현하기
mapper에는 DAO를 구현한 인터페이스의 풀네임을 설정해주어야한다.즉, DAO를 구현할 인터페이스는 필수로 필요하다는 의미!
기존에 NLNoticeDao.java 파일에 있는 메서드를 Mapper.xml 파일인 NLNoticeDao.xml 파일에 쿼리만 구현하면 DAO와 동일한 역할을 하게된다.
메서드를 호출할 때 파라미터로 넘어오는 값은 ${param1} ${param2}처럼 $를 사용할 수도 있고 #{param1} {#param2}로 사용할 수 있다. 차이점은 #은 전달된 값을 자료형에 맞게 변환을 시켜주는 것이다.
이제 NLNoticeDao.java에 있는 메서드를 Mapper.xml 파일에 구현해보자
id 값에는 DAO 인터페이스의 메서드 이름과 동일하게준다.
select 태그는 반드시 리턴 타입을 설정해 주어야 하는데 resultType 속성을 사용하여 설정하면된다.
페이징 처리 + 공지사항 목록을 가져오는 메서드는리턴 값이 List<Notice>이기 때문에 resultType 속성으로 Notice 객체를 주어야 하는데 패키지명까지 주는 풀네임으로 주어야 한다.페이징 처리를 위해 연산을 하기 때문에 #{param1}로 자료형을 알맞게 바꾸어서 쿼리 문에서 연산을 할 수 있도록 해준다.
공지사항을 수정하는 update 쿼리는 파라미터가 Notice 객체이기 때문에 parameterType 속성에 패키지명.클래스명인 풀임으로 Notice 객체를 설정해주어야한다.
설정 후 getter 메서드를 사용하여 값을 전달해 주는데 필드명으로 바로 사용할 수 있다.
여기서 MyBatis의 동적SQL을 사용하는데 if 태그를 이용하여 filesrc(파일경로) 값이 넘어오지 않을 때와 넘어올 때 쿼리를 동적으로 생성할 수 있다.
여기서는 filesrc가 null이 아니라면 filesrc도 update 해주도록 사용하였다.
공지사항 상세보기를 하는 getNotice의 리턴 값은 Notice 객체이므로 resultType 설정
Tip! XML에서 <를 사용하면 태그의 <로 인식할 수 있기 때문에 <![CDTA[ ]]>를 사용하여 그 안에 있는 문자열들은 쿼리 자체로 인식할 수 있도록 할 수 있다.
공지사항을 새로 쓰는 insert 메서드는 글번호를 연산 후 지정하기 때문에
<selectKey> 태그를 사용하여 order 속성에 BEFORE(기본값)을 설정하여 해당 쿼리를 먼저 실행한 후 결과 값을 keyPropertry 속성으로 seq에 받아서 INSERT 쿼리에 #{seq}로 값을 전달해주고 있다.
공지사항 상세보기시 조회수 증가하는 메서드와 조회수를 가져오는 메서드는 아래와 같다.
5) CustomerController 수정(컨트롤러 수정하기)
이제 컨트롤러를 수정해주어야한다.
NLNoticeDao 클래스를 사용하지 않고 DAO를 구현하는 빈객체인 SqlSession을 사용할 것이므로 컨트롤러에 @Autowired 애노테이션을 사용하여 의존 주입하도록 하자기존에 있던 NoticeDao 의존 주입과 생성자, getter, setter도 필요없으니 주석처리!
sqlSession으로 getMapper를 사용하여 NoticeDao 인터페이스를 가져와 NoticeDao 객체에 받은 후 인터페이스에 있는 메서드를 사용한다.
root-context에 설정한 여러 개의 Mapper 중 내가 원하는 것만 가져오도록 해당 인터페이스를 매개변수로 넣어주는 것
이 기세에 이어 NLMemberDao도 MyBatis로 구현해보았다!
[NLMemberDao.xml]
[JoinContoroller.java]
'TIL > Spring' 카테고리의 다른 글
[TIL] Spring MVC(Spring 5.0.7 버전) (0) | 2022.07.25 |
---|---|
[TIL] Spring 5.0.7 버전 다루기(5.x 버전) (0) | 2022.07.25 |
[SIST] Spring_days09_Spring Security(스프링 시큐리티) (0) | 2022.07.21 |
[SIST] Spring_days09_SpringTiles 프로젝트를 옮겨서 STS툴로 STSMVC03 만들기 + root-context와 servlet-context로 사용 (0) | 2022.07.21 |
[TIL] Maven(메이븐)과 Spring Tool Suite(STS) (0) | 2022.07.20 |