mybatis는 sql 명령어를 관리해주는 편리한 라이브러리이다.
sql 명령어를 매번 우리는 문자열로 지정해서 하나하나 적어주는 방식을 취했을 것이다.
이러한 명령어는 유지보수에서도 많은 노력이 필요할 가능성이 높고, 효율성이 떨어진다.
때문에 mybatis를 통해 관리해 주는 것이 좋다.
메이븐 스프링 개발환경에서는 설정도 간단하다.
먼저 pom.xml에 라이브러리를 추가하도록 하자
<!-- MyBatis, MyBatis-Spring, Spring-JDBC -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
</dependencies>
mybatis와 mybatis를 연동하는 스프링 그리고 스프링과 jdbc를 연결하는 라이브러리이다.
mybatis는 필연적으로 데이터베이스를 이용하는 sql문을 설정하는 라이브러리기에 데이터베이스 개발환경이 꼭 필요하고
스프링 jdbc와 그를 연결하는 mybatis-spring 라이브러리가 필요하다.
이를 그림으로 표현한다면 아래와 같다.
이와 같이 설정해주고 라이브러리를 추가한 다음
Context.xml에서 설정을 하도록 하자 (intellij의 경우 aplicationContext, 이클립스의 경우 root-context 파일이다)
<bean id="dataSource"
name="dataSource"
class="oracle.jdbc.pool.OracleDataSource">
<property name="URL"
value="jdbc:oracle:thin:@localhost:1521:orcl" />
<property name="user" value="" />
<property name="password" value="" />
</bean>
<bean id="sqlSessionFactory"
name="sqlSessionFactory"
class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation"
value="classpath:/mybatis-config.xml" />
<property name="mapperLocations"
value="classpath:/mappers/*.xml" />
</bean>
<bean id="sqlSession" name="sqlSession"
class="org.mybatis.spring.SqlSessionTemplate"
destroy-method="clearCache">
<constructor-arg name="sqlSessionFactory"
ref="sqlSessionFactory" />
</bean>
스프링에서 관리하는 빈(스프링 프레임워크에서 관리하는 일종의 설정 규칙..?)을 만드는 것이다.
이클립스의 경우 콘솔창위에 bean graph라는 탭이 있어서 빈의 구조를 확인할 수 있고
인텔리제이의 경우 shift + ctrl + alt + u 를 누르면 보여준다.
코드를 위에서 부터 설명하자면
먼저 데이터소스는 오라클데이터베이스에서 데이터풀을 가져오는 설정이다.
데이터풀이 무엇인지 모른다면 이전 글을 참조하도록 하자.
user는 오라클데이터베이스의 id와 password는 비밀번호를 말한다.
각자 개발환경에 맞춰 채워주도록 하자
2번째는 만들어진 데이터풀을 통해 sql문을 관리하는 공장을 하나 만드는 것이다.
마지막 빈은 그러한 공장에서 관리하는 하나하나의 생성자를 정의하는 코드이다.
프로퍼티가 아닌 컨스트럭터가 쓰였는데 이 의미는 공장에서 생성자를 한들어 사용하겠다는 의미이다.
하지만 이렇게만 만들어주면
<property name="configLocation"
value="classpath:/mybatis-config.xml" />
<property name="mapperLocations"
value="classpath:/mappers/*.xml" />
이 부분이 에러가 날 것이다.
mybatis는 sql을 관리하는 만큼 sql의 관리 설정이나, sql문을 정의한 문서가 필요한데
그 문서( xml)파일이 클래스패스에 없기 때문에 나는 에러이다.
리소스 밑에 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>
<properties>
<property name="tblBoard" value="test_board" />
<property name="colBno" value="bno" />
<property name="colTitle" value="title" />
<property name="colContent" value="content" />
<property name="colUserid" value="userid" />
<property name="colRegdate" value="regdate" />
<property name="tblMember" value="tbl_member"/>
<property name="colUserid" value="userid"/>
<property name="colPassword" value="password"/>
<property name="colEmail" value="email"/>
</properties>
<typeAliases>
<package name="edu.spring.ex02.domain" />
</typeAliases>
</configuration>
위의 첫 4줄은 mybatis-config.xml이라면 빼놓아서는 안되는 코드이다.
이 부분은 mybatis 홈페이지에서 확인이 가능하다.
(http://www.mybatis.org/mybatis-3/configuration.html#settings)
이부분을 제외하면 본인이 설정할 수 있는데
나같은 경우에는 게시판을 만들고 싶기에 게시판에 필요한 테이블, 회원관리에 필요한 테이블을 설정에 집어넣었다.
이해를 돕기위해 내 오라클 데이터베이스의 게시판 테이블을 보도록 하자.
테이블 구조를 보면서 위의 코드를 다시 보면
value 부분은 테이블 구조의 실제 column 이름이고, name은 이제부터 mybatis 안에서 사용될 column의 이름이다
즉 test_board라는 테이블은 이제부터 mybatis 설정 내에서는 tolBoard로 쓰이게 될것이다.
밑의 typeAliases는 이러한 모델 객체를 어디서 가져올 것이나의 경로를 의미한다.
즉 모델 클래스(내 경우에는 게시판, 회원 클래스) 경로를 지정해주면 된다.
여기서 또하나 중요한 점은
private int bno;
private String title;
private String content;
private String userid;
private Date regdate;
모델객체도 이런식으로 오라클데이터베이스의 컬럼이름과 맞쳐주도록 하자.
이와같이 mybatis-config.xml은 모든 테이블, 컬럼들을 정의해주는 곳이 이곳이다.
이렇게 설정이 끝났으면 우린 본격적으로 sql문을 작성해야한다.
게시판의 경우 게시판의 sql문이 담긴 xml, 멤버의 경우 멤버의 sql문이 담긴 xml을 작성할 것이다.
때문에 이런식으로 mappers라는 카테고리를 하나 만들어 보관하자.
이 mapper.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="edu.spring.ex02.mappers.MemberMapper">
<select id="selectAll" resultType="Member">
SELECT * FROM ${tblMember}
</select>
</mapper>
이 파일도 마찬가지로 config.xml 파일처럼 첫4줄은 mybatis 페이지에서 가져온 4줄로 채워야 한다
다음의 namespace 는 sql문을 직접 사용할 때 사용될 문자열이다. 우리는 나중에
session.selectList(NAMESPACE + ".selectAll");
이런 식으로 문자열을 지정해서 sql문을 사용할 것이다.
여기서 namespace는 위의 설정과 같다.
즉 sql문 실행문은
edu.spring.ex02.mappers.MemberMapper.selectAll
과 동일한 것이다.
이 문자열은 프로그래머에 따라 임의로 수정이 가능하나.
되도록 저런 식으로 경로를 넣어주는 편이 좋다.
그 이유는 인터페이스를 이용하여
다른방법으로 sql문을 구축할 수 있기 때문이다..
그 밑은 sql문을 작성한 것이다
아까 설정한 테이블이나 컬럼이름대로 사용하기 위해선
${tblMember} 와 같이 사용하면 되고, java 코드의 preparedStatement 처럼
프로그래머가 코드로 직접 채워넣어야 하는 경우 #{name} 식으로 작성해주면 된다.
설정 과정이 전부 끝났다면
private static final String NAMESPACE =
"edu.spring.ex02.BoardMapper";
@Autowired private ReplyMapper mapper;
@Override
public List<Board> read() {
return session.selectList(NAMESPACE + ".selectAll");
}
이런 식으로 코드를 작성해서 sql문 접속을 해보도록 하자
xml 설정이 틀리지 않았다면 잘 구동되는 모습을 확인할 수 있을 것이다.
(sqlsession의 메소드를 잘 선택해서 사용하도록 하자. selectList면 list, insert면 insert 식으로 하자)
여기까지가 첫번째 방법이다 두번째 방법으로는
인터페이스를 이용한 방법이 있다.
이 또한 예문으로 살펴보자
나는 댓글 sql을 관리하는 맵퍼의 하나로 reply-mapper.xml 를 가지고 있다.
여기서의 namespace는 edu.spring.ex03.mappers.ReplyMapper 이다.
이 경로대로
패키지와 인터페이스를 하나 만들어주자
package edu.spring.ex03.mappers;
import java.util.List;
import org.apache.ibatis.annotations.Insert;
import edu.spring.ex03.domain.Reply;
public interface ReplyMapper {
String SQL_INSERT =
"INSERT INTO test_reply (bno, rtext, replier, regdate)"
+ " VALUES (#{bno}, #{rtext}, #{replier}, sysdate)";
@Insert(SQL_INSERT)
int insert(Reply r);
// Mapper 인터페이스 메소드의 이름을
// Mapper xml 파일의 SQL 문의 id와 동일하게만 만들어 주면
// xml 파일에 정의된 SQL문을 사용하는 메소드가 됨
} // end interface ReplyMapper
이 인터페이스의 내용은 이러하다.
이런 식으로도 사용이 가능하다.
문자열로 sql문을 정의한 후 메소드를 하나 만들고 어노테이션으로 sql문을 넣어준다.
주석에 달린 것처럼 xml의 설정과 인터페이스가 중복되서 코드를 만들어준다면
xml 설정을 따르게 되니 조심하자.
이와 같은 방식으로 설정하였을 경우에는
사용하는 방법도 xml 설정방법과 살짝 다르다.
먼저 이 인터페이스를 우리가 사용할 수 있게끔
스프링 프레임워크가 관리하게끔 설정을 해줘야 한다.
컨텍스트xml 파일에 들어가
<!-- MyBatis가 사용하는 Mapper 객체를 자바 빈으로 설정 -->
<mybatis-spring:scan base-package="edu.spring.ex03.mappers"/>
이런식으로 설정을 해주도록 하자.
이러면 빈이 형성되고 스프링프레임워크가 인터페이스를 참조할 수 있게될 것이다.
@Autowired private ReplyMapper mapper;
@Override
public List<Reply> read(int bno) {
return mapper.read(bno);
}
그후
이런 방식으로 ReplyMapper 형식으로 변수를 선언한 후 그 메소드를 부르면 된다.
나는 두번째 방법이 더 깔끔하다고 느껴진다.
본인이 좋은 방법을 선택하도록 하자.
'프로그래밍 > Web-Spring' 카테고리의 다른 글
Spring - 파일 업로드 하기 (1) | 2017.11.27 |
---|---|
Spring 프레임워크에서 Oracle을 사용하기 (1) | 2017.11.15 |
junit을 통한 테스트 클래스 만들기 (0) | 2017.11.15 |