📗 self-study/📗 KH정보교육원 당산지원

[Spring] Spring 웹 사이트 만들기 2 - 구조 구체화 및 MyBatis, DB 연결

천재강쥐 2022. 11. 16. 15:54

 

더보기

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 : 생성자 주입
     -->