✨LEVEL UP🎇/PROJECT

[JSP + MyBatis] 3. MySQL DB 연동하기

인텔리재이 2023. 1. 25. 22:02


SqlSession Factory Bean 만들기

 

MySQL DB를 연결하기 위해, SqlSession Factory Bean을 만듭니다.

com.example.demo > JspMybatisSubApplication.java에 내용을 작성합니다.

package com.example.demo;

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
//Mapper 인터페이스를 인식할 수 있도록 설정
@MapperScan(value={"com.example.demo.mapper"})
public class JspMybatisSubApplication {

	public static void main(String[] args) {
		SpringApplication.run(JspMybatisSubApplication.class, args);
	}

	/* SqlSessionFactory 설정 */

	@Bean
	public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {

		SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();

		sessionFactory.setDataSource(dataSource);
		return sessionFactory.getObject();

	}

}

- Mapper :  화면에서 요청받은 정보를 가져오기 위해, 직접 DB에 접근하는 것이라 생각하시면 됩니다!

- @MapperScan(value={"~~~"}) : 프로젝트에서 사용할 Mapper의 위치를 지정해줍니다.                

- @Bean : 스프링에 필요한 객체를 생성해주는 어노테이션입니다.

sqlSessionFactory() : MyBatis의 SqlSessionFactory를 반환해줍니다.

메서드가 실행되면서 DataSource객체를 주입해서 결과를 만들고, 그 결과를 스프링내 빈으로 사용하게 됩니다. 

 

MySQL 테이블 및 데이터 생성

데이터를 불러오기 위해, MySQL에 테이블과 데이터를 생성합니다.

application.properties > spring.datasource.url에 작성한 이름과 동일한 스키마를 먼저 생성해줍니다.

스키마 생성 후, 테이블을 만들기 위한 쿼리문을 작성합니다.

저는 게시판을 만들기 위해 다음과 같이 작성했습니다.📝

CREATE TABLE BOARD (
bno INT NOT NULL AUTO_INCREMENT, // 게시물 번호
subject VARCHAR(100) , // 제목
content VARCHAR(100), // 내용
writer VARCHAR(100) , // 작성자명
reg_date DATE , // 작성일자
PRIMARY KEY (bno));

 쿼리문 작성 후 반드시 commit; 을 입력하여 내용을 반영시켜줍니다.

 

샘플 데이터는 다음과 같은 쿼리문으로 작성하였습니다.

insert into board (subject, content, writer, reg_date) values ('제목1','내용1','소크라테스',now());
insert into board (subject, content, writer, reg_date) values ('제목2','내용2','테스형',now());

테이블 생성 시 bno 는 자동 증가(auto increment)로 설정하였기 때문에,

이를 제외하고 제목, 내용, 작성자명, 작성일자에 데이터를 넣었습니다.

작성일자는 현재 시간과 날짜를 넣기 위해 now() 를 사용하였습니다.

 

연동된 DB 데이터 출력하기

연동된 DB 내의 데이터를 출력하기 위해, 프로젝트에 내용을 추가합니다.

프로젝트에서 마우스 우클릭으로 controller, domain, mapper, service Package를 생성해줍니다.

 

1. domain

DB테이블에서 만든 내용과 같이, BoardVO.java 클래스를 생성 후 작성해줍니다.

package com.example.demo.domain;

import java.util.Date;

public class BoardVO {
	private int bno;
	private String subject;
	private String content;
	private String writer;
	private Date reg_date;
	
}

해당 내용까지만 작성 후, 클래스에서 마우스 우클릭 > Source > Generate Getters & Setters 를 클릭합니다.

package com.example.demo.domain;

import java.util.Date;

public class BoardVO {
	private int bno;
	private String subject;
	private String content;
	private String writer;
	private Date reg_date;
	
	public int getBno() {
		return bno;
	}
	public void setBno(int bno) {
		this.bno = bno;
	}
	public String getSubject() {
		return subject;
	}
	public void setSubject(String subject) {
		this.subject = subject;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	public String getWriter() {
		return writer;
	}
	public void setWriter(String writer) {
		this.writer = writer;
	}
	public Date getReg_date() {
		return reg_date;
	}
	public void setReg_date(Date reg_date) {
		this.reg_date = reg_date;
	}
}

그러면 다음과 같이, Getter와 Setter 메소드가 자동으로 추가됩니다.

 

2. Mapper

생성한 Mapper 패키지에 BoardMapper 인터페이스를 생성 후 작성합니다.

Mapper는 DB에 직접 접근하여 데이터를 생성하거나 가져오는 역할을 담당합니다.👏

package com.example.demo.mapper;

import java.util.List;

import org.springframework.stereotype.Repository;

import com.example.demo.domain.BoardVO;

//DB에 접근하는 클래스
@Repository("com.example.demo.mapper.BoardMapper")
public interface BoardMapper {

	// 게시글 개수
	public int boardCount() throws Exception;
    
}

 - @Repository : 해당 클래스가 데이터베이스에 접근하는 클래스임을 명시하는 어노테이션

 

동일한 위치에서 마우스 우클릭 후 Other를 선택하고, BoardMapper.xml 파일을 생성 후 작성합니다.

Mapper가 xml에 작성된 쿼리문을 가지고 DB에 접근하는 것이라고 생각하시면 됩니다.

저는 게시물 갯수를 화면에 보여주기 위해, 다음과 같이 작성했습니다.

<?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="com.example.demo.mapper.BoardMapper">

	<select
		id="boardCount"
		resultType="int"
	>
		SELECT
		COUNT(*)
		FROM BOARD
	</select>
</mapper>

 

3. 테스트 페이지 출력을 위한 JspTest 클래스에 내용 추가

package com.example.demo;

import javax.annotation.Resource;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.example.demo.board.mapper.BoardMapper;

@Controller
public class JspTest {

@Resource(name="com.example.demo.board.mapper.BoardMapper")
    BoardMapper mBoardMapper;
    
	@RequestMapping("/test")
	private String jspTest() throws Exception{
        
        System.out.println(mBoardMapper.boardCount());
        
        return "test"; 
    }
}

DB의 Board 테이블의 데이터의 갯수를 콘솔창에 출력하는 내용입니다.

 

4. 저장 후 프로젝트 실행

http://localhost:8211/test를 주소창에 입력 후, 콘솔창을 확인합니다.

 

포스팅 내용 그대로 입력하셨다면, 콘솔창에는 2가 출력될 것입니다. 😏👍

 


 

🎊 드디어 MySQL, MyBatis, JSP 연동을 마쳤습니다! ✨

 

다음 포스팅부터는 게시판 CRUD 등 본격적인 기능들을 살펴보도록 하겠습니다!