Restful하게 방명록 만들기 실습 중, 스프링과 마이바티스 프로젝트를 구성할때 해야할 환경설정들을 정리해 보았다. 꽤 복잡하고 빠뜨리기 쉬운 내용들이 있어 각각의 의미를 짚어가며 숙지해두면 좋을 것 같다!
DB 생성
프로젝트 생성, 패키지와 클래스 파일 만들기
pom.xml 설정 추가
<!-- DB연결 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- 마이바티스-스프링 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
<!-- 마이바티스 자체서비스 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
src/main/webapp/WEB-INF/spring/root-context.xml
dataSource 빈 : 스프링에서 DB 연결을 관리하기 위해 사용되는 객체<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>
/WEB-INF/spring/appServlet/db.properties
</value>
</list>
</property>
</bean>
<!-- 내부적으로 사용할 클래스 지정 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${driverClassName}"></property>
<property name="url" value="${url}"></property>
<property name="username" value="${username}"></property>
<property name="password" value="${password}"></property>
</bean>
<!-- 마이바티스가 dataSource 사용할 수 있도록 지정 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/> <!-- 커넥션 풀링 하도록 지정 -->
<property name="configLocation" value="classpath:mybatis/model/modelConfig.xml"/> <!-- classpath: src/java -->
<property name="mapperLocations" value="classpath:mybatis/mappers/*.xml"/>
</bean>
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory"></constructor-arg>
</bean>
</beans>
db.properties
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/bitedu
username=root
password=1234
src/main/resources/mybatis 폴더 생성
model 폴더에 modelConfig.xml - 마이바티스 환경 설정mappers 폴더에 board.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="bitedu.bipa.book.vo.BookCopy" alias="bookCopyVO"></typeAlias>
</typeAliases>
</configuration>
web.xml - 인코딩 필터 추가
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<resultMap> : 쿼리 결과의 컬럼과 자바 객체의 매핑을 정의<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mapper.book">
<resultMap id="bookMap" type="bookCopyVO">
<id property="bookSeq" column="book_seq"></id>
<result property="isbn" column="book_isbn" /> <!-- 컨텐츠 끝날때 표시 -->
<result property="title" column="book_title" />
<result property="author" column="book_author" />
<result property="publishDate" column="book_published_date" />
<result property="bookPosition" column="book_position" />
<result property="bookStaus" column="book_status" />
</resultMap>
<!-- <select>: 쿼리를 날리겠다는 의미 - 메소드처럼 실제 동작도 함(파라미터, 리턴 가짐) -->
<select id="selectAllBook" resultMap="bookMap"
resultType="bookCopyVO">
<![CDATA[
select a.*, b.* from book_info a inner join book_copy b on a.book_isbn=b.book_isbn
]]> <!-- xml에서 금지된 문자가 들어가더라도 에러 처리 하지 않겠다는 의미 -->
</select>
<select id="selectBookBySeq" resultMap="bookMap"
resultType="bookCopyVO" parameterType="java.lang.Integer">
<![CDATA[
select a.*, b.* from book_info a inner join book_copy b on a.book_isbn=b.book_isbn
where b.book_seq = #{bookSeq}
]]>
</select>
<select id="updateBook" parameterType="bookCopyVO">
<![CDATA[
update book_info set book_title = #{title}, book_author=#{author}, book_published_date = #{publishDate} where book_isbn = #{isbn}
]]>
</select>
<select id="deleteBook" parameterType="java.lang.Integer">
<![CDATA[
delete from book_copy where book_seq = #{bookSeq}
]]>
</select>
<select id="insertBook" parameterType="bookCopyVO">
<![CDATA[
insert into book_info values (#{isbn},#{title},#{author},#{publishDate})
]]>
</select>
<select id="insertCopy" parameterType="java.lang.String">
<![CDATA[
insert into book_copy(book_isbn) values (#{isbn})
]]>
</select>
</mapper>
@Repository : 스프링에서 데이터 액세스 계층의 구성 요소인 리포지토리(repository) 클래스를 나타내는 데 사용되는 어노테이션@Transactional 어노테이션 적용@Autowired : 해당 필드, 생성자, 메서드 파라미터 등에 알맞은 종속 객체를 자동으로 주입SqlSession : 마이바티스(MyBatis)의 SqlSession 인터페이스를 구현한 객체로, 데이터베이스와의 상호 작용을 담당selectOne: 단일 결과를 반환하는 SQL 쿼리를 실행selectList: 다중 결과를 반환하는 SQL 쿼리를 실행insert: 데이터를 삽입하는 SQL 쿼리를 실행update: 데이터를 갱신하는 SQL 쿼리를 실행delete: 데이터를 삭제하는 SQL 쿼리를 실행@Repository("boardDAO")
public class BoardDAO implements IBoardDAO {
@Autowired
private SqlSession sqlSession;
@Override
public ArrayList<BoardVO> selectBoardAll(){
ArrayList<BoardVO> list = null;
list = (ArrayList) sqlSession.selectList("mapper.board.viewAll");
System.out.println(list);
return list;
}
}
훌륭한 글이네요. 감사합니다.