Spring을 이용하여 목적인 없는 기본 웹 사이트를 만들어 보자
클래스와 인터페이스 생성
💻 BoardDao 클래스, BoardService 인터페이스, BoardServiceImpl 클래스, Board 클래스, Reply 클래스 생성
✔️ BoardServiceImpl 생성 후 BoardService에 대한 클래스임을 명시해 주기
package com.kh.spring.board.model.service;
public class BoardServiceImpl implements BoardService {
}
💻 MemberDao 클래스, MemberService 인터페이스, MemberServiceImpl 클래스, Member 클래스 생성
✔️ MemberServiceImpl 생성 후 MemberService에 대한 클래스임을 명시해 주기
package com.kh.spring.member.model.service;
public class MemberServiceImpl implements MemberService {
}
💻 PageInfo 클래스 생성
경로: com.kh.spring.common.model.vo
package com.kh.spring.common.model.vo;
public class PageInfo {
private int listCount;
private int currentPage;
private int pageLimit;
private int boardLimit;
private int maxPage;
private int startPage;
private int endPage;
public PageInfo() { }
public PageInfo(int listCount, int currentPage, int pageLimit, int boardLimit, int maxPage, int startPage,
int endPage) {
super();
this.listCount = listCount;
this.currentPage = currentPage;
this.pageLimit = pageLimit;
this.boardLimit = boardLimit;
this.maxPage = maxPage;
this.startPage = startPage;
this.endPage = endPage;
}
public int getListCount() {
return listCount;
}
public void setListCount(int listCount) {
this.listCount = listCount;
}
public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public int getPageLimit() {
return pageLimit;
}
public void setPageLimit(int pageLimit) {
this.pageLimit = pageLimit;
}
public int getBoardLimit() {
return boardLimit;
}
public void setBoardLimit(int boardLimit) {
this.boardLimit = boardLimit;
}
public int getMaxPage() {
return maxPage;
}
public void setMaxPage(int maxPage) {
this.maxPage = maxPage;
}
public int getStartPage() {
return startPage;
}
public void setStartPage(int startPage) {
this.startPage = startPage;
}
public int getEndPage() {
return endPage;
}
public void setEndPage(int endPage) {
this.endPage = endPage;
}
@Override
public String toString() {
return "PageInfo [listCount=" + listCount + ", currentPage=" + currentPage + ", pageLimit=" + pageLimit
+ ", boardLimit=" + boardLimit + ", maxPage=" + maxPage + ", startPage=" + startPage + ", endPage="
+ endPage + "]";
}
}
💻 Pagination클래스 생성
package com.kh.spring.common.template;
import com.kh.spring.common.model.vo.PageInfo;
public class Pagination {
public static PageInfo getPageInfo(int listCount, int currentPage, int pageLimit, int boardLimit) {
int maxPage = (int)Math.ceil((double)listCount / boardLimit);
int startPage = (currentPage - 1) / pageLimit * pageLimit + 1;
int endPage = startPage + pageLimit - 1;
if(endPage > maxPage) {
endPage = maxPage;
}
return new PageInfo(listCount, currentPage, pageLimit, boardLimit, maxPage, startPage, endPage);
}
}
❌ Template 클래스 생성하지 않음 ❌
👉🏻 스프링에서 자동으로 SqlSession을 던져 주기 때문에 해당 객체를 만들어 주는 Template 클래스 생성하지 않아도 됨!
MyBatis 연동 세팅
1) mappers 폴더 만들기
2) DTD 코드로 자동 완성 설정하기
👉🏻 Preference - XML - XML Catalog - User Specified Entries 선택 후 Add
👉🏻 개발자 문서 확인
👉🏻 SqlSessionFactory 빌드
<location>
https://mybatis.org/dtd/mybatis-3-config.dtd
<key>
-//mybatis.org//DTD Config 3.0//EN
👉🏻 개발자 문서 확인
👉🏻 mapper 빌드
<location>
https://mybatis.org/dtd/mybatis-3-mapper.dtd
<key>
-//mybatis.org//DTD Mapper 3.0//EN
👉🏻 추가된 것 확인 후 Apply and Close
3) xml 파일 생성
💻 member-mapper.xml, board-mapper.xml 생성
👉🏻 위와 같이 설정하면 기본으로 뜨는 태그 내용
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis-3-mapper.dtd" >
<mapper>
<cache-ref namespace=""/>
</mapper>
👉🏻 자동 완성 코드인 cache-ref namespace는 지우고 namespace 지정
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis-3-mapper.dtd" >
<mapper namespace="memberMapper">
</mapper>
👉🏻 board-mapper.xml도 똑같은 방법으로 생성
👉🏻 자동 완성 코드인 cache-ref namespace는 지우고 namespace 지정
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis-3-mapper.dtd" >
<mapper namespace="boardMapper">
</mapper>
💻 mybatis-config.xml 생성
✔️ 기존 순수 MyBatis에서는 environments 영역 또한 이 파일에 기술했음
👉🏻 이 영역에는 내가 접속하고자 하는 DB 연결 정보를 담아놓았음!
✔️ Spring에서 MyBatis를 연동하기 위해서는 DB 연결 정보를 root-context.xml 파일에 작성해야 함
👉🏻 DB 등록은 서버 구동과 동시에 이루어져야 하기 때문에 서버 스타트와 동시에 곧바로 읽혀지는 파일인 root-context.xml 에서 설정해야 하기 때문
👉🏻 Mapper가 아닌 Config로 생성!
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "mybatis-3-config.dtd" >
<configuration>
<!-- MyBatis가 구동될 때 알아야 하는 설정 -->
<settings>
<setting name="jdbcTypeForNull" value="NULL" />
</settings>
<!-- 미리 등록해 두려면 해당 클래스가 실제로 존재하는 상태여야 함! 없다면 ClassNotFoundException 뜸 -->
<typeAliases>
<typeAlias type="com.kh.spring.member.model.vo.Member" alias="member" />
<typeAlias type="com.kh.spring.board.model.vo.Board" alias="board" />
<typeAlias type="com.kh.spring.board.model.vo.Reply" alias="reply" />
</typeAliases>
<!--
미리 등록해 두려면 해당 mapper 파일이 실재로 존재하는 상태여야 함! 없다면 FileNotFoundException 뜸
또한, 해당 mapper 파일의 namespace 속성도 반드시 있어야 함!
-->
<mappers>
<mapper resource="/mappers/member-mapper.xml" />
<mapper resource="/mappers/board-mapper.xml" />
</mappers>
</configuration>
💻 root-context.xml
👉🏻 mybatis-config.xml에서 하지 못했던 DB 연결 설정
1단계: DB 연결을 위한 도구(bean)를 설정
👉🏻 destroy-method: 객체가 쓰이지 않는다면 알아서 소멸시키겠음
<bean class="org.apache.commons.dbcp.BasicDataSource" id="dataSource" destroy-method="close">
<!-- 어느 DB에 접속할 건지를 설정 -->
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe" />
<property name="username" value="SPRING" />
<property name="password" value="SPRING" />
</bean>
<!--
해당 이 객체가 앞으로 필요할 때마다 내부적으로 Spring에 의해 이 코드가 실행됨
BasicDataSource dataSource = new BasicDataSource(); // 내가 생성하는 것이 아니라 스프링이 기본 생성자로 자동 생성!
dataSource.setDriverClassName("oracle.jdbc.driver.OracleDriver");
dataSource.setUrl("jdbc:oracle:thin:@localhost:1521:xe");
dataSource.setUserName("SPRING");
dataSource.setPassword("SPRING");
-->
👉🏻 기본적인 연결을 담당하는 BasicDataSource.class 위치 (bean class에 들어갈 경로)
2단계: MyBatis Spring에서 제공하는 SQL 명령어 실행을 위한 도구 (SqlSessionTemplate) 설정
✔️ 순수 MyBatis에서는 SqlSession 객체를 썼지만 Spring에서 MyBatis 연동 시에는 명령을 실행하기 위해 SqlSessionTemplate 객체를 씀!
👉🏻 SqlSessionFactoryBean 객체를 통해 생성해야 함
<bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactory">
<!-- MyBatis 설정 파일의 위치를 지정하여 설정값들을 가지고 오겠음 -->
<property name="configLocation" value="classpath:mybatis-config.xml" />
<!-- DB 연결을 위한 도구를 참조하겠음 -->
<property name="dataSource" ref="dataSource" />
</bean>
<!--
해당 이 객체가 필요할 때마다 내부적으로 이 코드가 실행됨
SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
sqlSeesionFactory.setConfigLocation("classpath:mybatis-config.xml");
sqlSessionFactory.setDataSource();
-->
👉🏻 SqlSessionFactoryBean.class 위치 (bean class에 들어갈 경로)
3단계: MyBatis Spring에서 제공하는 SQL 명령어 실행을 위한 도구 (SqlSessionTemplate) 설정 2
👉🏻 2단계에서 SqlSessionTemplate을 만들기 위한 과정인 SqlSessionFactoryBean 객체를 생성했으니 이제 진짜 SqlSessionTemplate을 만들 차례!
<bean class="org.mybatis.spring.SqlSessionTemplate" id="sqlSession">
<!-- 2단계에서 만들었던 SqlSessionFactoryBean 객체를 넘기면서 SqlSessionTemplate 객체를 생성 -->
<constructor-arg ref="sqlSessionFactory" />
</bean>
<!--
해당 이 객체가 필요할 때마다 내부적으로 이 코드가 실행됨
SqlSessionTemplate sqlSession = new SqlSessionTemplate(sqlSessionFactory);
-->
<!--
property : setter 주입
constructor-arg : 생성자 주입
-->