Spring-Mybatis 프로젝트 세팅하기

oasis·2023년 7월 18일

Restful하게 방명록 만들기 실습 중, 스프링과 마이바티스 프로젝트를 구성할때 해야할 환경설정들을 정리해 보았다. 꽤 복잡하고 빠뜨리기 쉬운 내용들이 있어 각각의 의미를 짚어가며 숙지해두면 좋을 것 같다!

1. 환경설정


  1. DB 생성

  2. 프로젝트 생성, 패키지와 클래스 파일 만들기

  3. 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>
  4. src/main/webapp/WEB-INF/spring/root-context.xml

    • 스프링 애플리케이션의 전반적인 구성을 정의
    • ORM(Object-Relational Mappin) 작업 하는데 필요한 설정 구성
      • ORM은 객체와 관계형 데이터베이스 간의 매핑을 자동으로 처리해주는 기술 또는 프레임워크를 의미
    • dataSource 빈 : 스프링에서 DB 연결을 관리하기 위해 사용되는 객체
      • JDBC 연결 제공
    <?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>
  5. db.properties

    driverClassName=com.mysql.cj.jdbc.Driver
    url=jdbc:mysql://localhost:3306/bitedu
    username=root
    password=1234
  6. 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>
    • typeAlias: 자바 클래스에 대한 별칭을 정의
      • 매핑 구성 파일에서 해당 클래스를 사용할 때 별칭으로 참조할 수 있다.
  7. 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>



2. DB연결


  1. 마이바티스 매핑 파일 작성
    • DB와 상호작용 정의
    • <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>
  1. DAO 작성
    • @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;
	}
}

2개의 댓글

comment-user-thumbnail
2023년 7월 18일

훌륭한 글이네요. 감사합니다.

답글 달기
comment-user-thumbnail
2023년 7월 18일

아주 유익한 내용이네요!

답글 달기