본문 바로가기
Spring/게시판프로젝트

[Spring] 게시판 프로젝트3 - Persistence 계층 구현 (select)

by 태옹 2021. 7. 2.

1. boardpro 유저에 접속하여 tbl_board 테이블 생성 작업을 진행

create sequence seq_board;

create table tbl_board(
    bno number(10,0),
    title varchar2(200) not null,
    content varchar2(2000) not null,
    writer varchar2(50) not null,
    regdate date default sysdate,
    updatedate date default sysdate
);

alter table tbl_board add constraint pk_board
primary key(bno);
  • seq_board : 일련번호를 위한 sequence
  • tbl_board : 게시물 저장을 위한 테이블
  • pk : bno

테이블이 정상적으로 만들어졌다면 위의 이미지처럼 구조가 나와야 함

 

반드시 커밋을 해줘야 작업이 반영됨

 

2. Dummy데이터 추가

다음스크립트를 반복적으로 실행해서 여러 개의 데이터 생성 및 확인

insert into tbl_board(bno,title,content,writer)
values (seq_board.nextval,'테스트제목','테스트내용','user00');

select * from tbl_board; 로 데이터 확인 가능

 

3. 데이터베이스 관련 root-context.xml 설정

  • DataSource 설정
  • SqlSessionFactory 설정
  • mybatis 설정

`

root-context.xml에 아래의 내용을 추가함

<beans>태그 내부에 넣어야 함

	<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
		<property name="driverClassName"
			value="oracle.jdbc.OracleDriver"></property>
		<property name="jdbcUrl"
			value="jdbc:oracle:thin:@localhost:1521:XE"></property>
		<property name="username" value="유저명"></property>
		<property name="password" value="유저패스워드"></property>
	</bean>
	<!-- HikariCP configuration -->
	<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource"
		destroy-method="close">
		<constructor-arg ref="hikariConfig"></constructor-arg>
	</bean>
	<bean id="sqlSessionFactory"
		class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource"></property>
	</bean>

 


 

영속 계층의 작업은 항상 다음과 같은 순서로 진행함

 

1. 테이블을 반영하는 VO클래스 생성

2. MyBatis의 Mapper 인터페이스의 작성 / xml처리

3. 작성한 Mapper 인터페이스의 테스트

 

다음과 같은 절차대로 데이터베이스에서 정보를 불러와 리스트로 출력하는 코드를 작성해본다.

 

1. 테이블을 반영하는 VO클래스 생성

(1) 영속계층을 처리할 패키지를 따로 만들어주고 그 안에 VO클래스를 작성할 파일 생성

tbl_board의 구성을 참고해서 만든 클래스는 아래와 같음

package com.taeong.domain;

import java.util.Date;

import lombok.Data;

@Data
public class BoardVO {
	private Long bno;
	private String title;
	private String content;
	private String writer;
	private Date regdate;
	private Date updateDate;
}

@Data : Lombok을 이용해서 생성자와 getter/setter, toString() 등을 만들어내는 어노테이션

 

2. MyBatis의 Mapper 인터페이스의 작성 / xml처리

(MyBatis에서 SQL을 처리하는 방법에는 어노테이션으로 처리하는 방법도 있음.

그러나 코드를 수정하고 다시 빌드해야하는 작업 등을 해야하기 때문에 유지보수성이 XML보다 떨어짐)

 

(1) root-context.xml에 아래 코드 추가

<mybatis-spring:scan base-package="com.taeong.mapper" />

root-context.xml에 mappper의 위치를 알려주는 것!

 

 

(2) src/main/java에 mapper 패키지를 생성한 후 BoardMapper인터페이스를 추가

package com.taeong.mapper;

import java.util.List;

import com.taeong.domain.BoardVO;

public interface BoardMapper {
	public List<BoardVO> getList();
}

 

 

(3) src/main/resources에 mapper패키지와 동일한 폴더를 생성 com/taeong/mapper 후 BoardMapper.xml을 생성

BoardMapper.xml을 생성할 때 알아둘 점

  • select 태그의 id 속성 값은 BoardMapper 인터페이스의 메소드 이름과 일치해야 함
  • resultType 속성의 값은 select 쿼리의 결과를 BoardVO클래스의 객체로 만들기 위해 설정
  • CDATA부분은 XML에서 부등호를 사용하기 위해 사용함
<?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.taeong.mapper.BoardMapper">
<select id="getList" resultType="com.taeong.domain.BoardVO">
<![CDATA[
select * from tbl_board where bno > 0
]]>
</select>
</mapper>

 

3. 작성한 Mapper 인터페이스의 테스트

BoardMapperTests.java를 작성하여 DB와 잘 연동되는지 test를 진행 (JUnit Test)

package com.taeong.mapper;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import lombok.Setter;
import lombok.extern.log4j.Log4j;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class BoardMapperTests {

	@Setter(onMethod_ = @Autowired)
	private BoardMapper mapper;

	@Test
	public void testGetList() {
		mapper.getList().forEach(board -> log.info(board));
	}
}

@Test가 붙은 메소드에 마우스 우클릭 > Run As > JUnit Test를 누르면 콘솔창에서 확인할 수 있다.

 

 

 


같은 방법으로 하나의 데이터만 불러오는 코드를 작성한다.

 

1. 테이블을 반영하는 VO클래스 생성

vo클래스는 위에서 작성한 내용과 같기 때문에 BoardVO클래스를 그대로 사용한다.

 

2. MyBatis의 Mapper 인터페이스의 작성 / xml처리

(1) BoardMapper.java에 read메소드 추가

public BoardVO read(Long bno);

 

(2) BoardMapper.xml에 SQL문 작성

<select id="read" resultType="com.taeong.domain.BoardVO">
	select * from tbl_board where bno = #{bno}
</select>

 

3. 작성한 Mapper 인터페이스의 테스트

@Test
public void testRead() {
    BoardVO board = mapper.read(5L);	// 원하는 bno값을 입력함, 임의로 bno = 5라고 가정
    log.info(board);
}

 

 

댓글