5. 게시글 작성 기능 테스트(with.JUnit) - 스프링부트(SpringBoot)

Haeun Shin·2021년 1월 27일
2

스프링 부트

목록 보기
5/10
post-thumbnail

테이블 생성 (Oracle 12c)

-----------------------------
-- 테이블: 게시판
-- 테이블ID: TB_BOARD
-----------------------------
CREATE TABLE TB_BOARD (
    idx       INT NOT NULL,
    title     VARCHAR2(100)  NOT NULL,
    content   VARCHAR2(3000) NOT NULL,
    writer    VARCHAR2(20)   NOT NULL,
    view_cnt  INT            DEFAULT 0,
    notice_yn char(1) CHECK(notice_yn IN ('N','Y')),
    secret_yn char(1) CHECK(secret_yn IN ('N','Y')),
    delete_yn char(1) CHECK(delete_yn IN ('N','Y')),
    insert_time DATE         DEFAULT sysdate,
    update_time DATE         NULL,
    delete_time DATE         NULL,
    PRIMARY KEY (idx)
);

COMMENT ON TABLE TB_BOARD IS '게시판';
COMMENT ON COLUMN TB_BOARD.idx IS '번호(PK)';
COMMENT ON COLUMN TB_BOARD.title IS '제목';
COMMENT ON COLUMN TB_BOARD.content IS '내용';
COMMENT ON COLUMN TB_BOARD.writer IS '작성자';
COMMENT ON COLUMN TB_BOARD.view_cnt IS '조회수';
COMMENT ON COLUMN TB_BOARD.notice_yn IS '공지글 여부';
COMMENT ON COLUMN TB_BOARD.secret_yn IS '비밀글 여부';
COMMENT ON COLUMN TB_BOARD.delete_yn IS '삭제 여부';
COMMENT ON COLUMN TB_BOARD.insert_time IS '등록일';
COMMENT ON COLUMN TB_BOARD.update_time IS '수정일';
COMMENT ON COLUMN TB_BOARD.delete_time IS '삭제일';

CREATE SEQUENCE TB_BOARD_SEQ
START WITH 1
INCREMENT BY 1;

notice_yn char(4) CHECK(notice_yn IN ('N','Y'))
notice_ny에는 'N' 또는 'Y' 밖에 들어갈 수 없다.

XXX_yn char(4) -> char(1) 변경
삭제처리할 때, "N".equals(board.getXxxYn) = false가 뜨는 현상이 일어나서 봤더니,
'N '으로 데이터가 삽입되어 있었다. char()는 크기가 고정적인 데이터타입이기 때문에 4Byte가 꽉 채워져서 들어간 것. 조심하자..!






STS

  1. src/main/resources/application.properties

  1. DB 정보 입력

    HikariCP: DB와의 커넥션풀 관리를 해준다.

# HikariCP Datasource (Oracle)
spring.datasource.hikari.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource.hikari.jdbc-url=jdbc:oracle:thin:@localhost:1521/orcl
spring.datasource.hikari.username=c##username
spring.datasource.hikari.password=password
spring.datasource.hikari.connection-test-query=SELECT SYSDATE FROM dual

# MyBatis
# 자바 변수는 noticeYn, 컬럼은 notice_yn이다.
# 구분되는 단어의 앞 글자만 대문자로 처리하는 카멜케이스 설정을 해서, 자동 매핑되도록 함.
mybatis.configuration.map-underscore-to-camel-case=true

  1. src/main/resource/BoardMapper.xml
    게시물을 INSERT하는 쿼리 작성
<?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.board.mapper.BoardMapper">

<sql id="boardColumns">
	  idx
	, title
	, content
	, writer
	, view_cnt
	, notice_yn
	, secret_yn
	, delete_yn
	, insert_time
	, update_time
	, delete_time
</sql>

<insert id="insertBoard" parameterType="BoardDTO">
	insert into TB_BOARD (
		<include refid="boardColumns" />
	) values (
		  TB_BOARD_SEQ.NEXTVAL
		, #{title}
		, #{content}
		, #{writer}
		, 0
		, NVL(#{noticeYn, jdbcType=VARCHAR}, 'N')
		, NVL(#{secretYn, jdbcType=VARCHAR}, 'N')
		, 'N'
		, sysdate
		, null
		, null
	)
</insert>

</mapper>

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found) 에러가 일어날 경우
<mapper namespace="com.board.mapper.BoardMapper"> 이 부분 제대로 됐는지 확인. 마이바티스로 바로 xml 생성하고 쿼리 작성했더니, 저부분이 수정 안돼서 오류가 났었음.


  1. src/main/java/com/board/mapper/BoardMapper.java
    게시글 생성 mapper 입력
import org.apache.ibatis.annotations.Mapper;

import com.board.domain.BoardDTO;

@Mapper
public interface BoardMapper {
	// 게시글 생성
	public int insertBoard(BoardDTO params);	
}

5.src/main/java/com/board/configuration/DBConfiguration.java

@Configuration
@PropertySource("classpath:/application.properties")
public class DBConfiguration {

	@Autowired
	private ApplicationContext applicationContext;

	@Bean
	@ConfigurationProperties(prefix = "spring.datasource.hikari")
	public HikariConfig hikariConfig() {
		return new HikariConfig();
	}

	@Bean
	public DataSource dataSource() {
		return new HikariDataSource(hikariConfig());
	}

	@Bean
	public SqlSessionFactory sqlSessionFactory() throws Exception {
		SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
		factoryBean.setDataSource(dataSource());
		factoryBean.setMapperLocations(applicationContext.getResources("classpath:/mappers/**/*Mapper.xml"));
		factoryBean.setTypeAliasesPackage("com.board.domain");
		factoryBean.setConfiguration(mybatisConfg());
		return factoryBean.getObject();
	}

	@Bean
	public SqlSessionTemplate sqlSession() throws Exception {
		return new SqlSessionTemplate(sqlSessionFactory());
	}

	@Bean
	@ConfigurationProperties(prefix = "mybatis.configuration")
	public org.apache.ibatis.session.Configuration mybatisConfg() {
		return new org.apache.ibatis.session.Configuration();
	}

}
애너테이션설명
@Configuration자바 기반 설정파일로 인식
@PropertySource해당 클래스에서 참조할 properties 파일의 위치를 지정
@Autowired객체 주입
@BeanConfiguration 클래스의 메서드 레벨에만 지정이 가능하며, 오브젝트를 만들어주는 메소드
@ConfigurationProperties설정을 외부화할 때 사용.
prefix 값으로 프로퍼티를 구분하여 클래스를 만들어 @ConfigurationProperties 어노테이션을 사용하여 프로퍼티 값을 사용하는 것이 매핑도 유연하게 할 수 있다는 장점이 있다.

메서드설명
ApplicationContext스프링에서는 스프링이 제어권을 가지고 직접 만들고 관계를 부여하는 오브젝트를 빈(bean) 이라고 부른다.
자바 빈 또는 엔터프라이즈 자바빈에서 말하는 빈과 비슷한 오브젝트 단위의 애플리케이션 컴포넌트를 말한다. 동시에 스프링 빈은 스프링 컨테이너가 생성과 관계 설정, 사용 등을 제어해주는 제어의 역전이 적용된 오브젝트를 가리키는 말이다.
hikariConfighikariCP 객체 생성
dataSource데이터 소스 객체 생성.
데이터 소스는 커넥션 풀을 지원하기 위한 인터페이스.(커넥션 풀은 커넥션 객체를 생성해두고, 데이터베이스에 접근하는 사용자에게 미리 생성해둔 커넥션을 제공했다가 다시 돌려받는 방법)
sqlSessionFactorySqlSessionFactory 객체 생성.
SqlSessionFactoryBean은 마이바티스와 스프링의 연동 모듈로 사용. 마이바티스 XML Mapper, 설정 파일 위치 등을 지정하고,SqlSessionFactoryBean 자체가 아닌, getObject 메서드가 리턴하는 SqlSessionFactory를 생성.
sqlSessionsqlSession 객체 생성.
setMapperLocationsgetResources 메서드의 인자로 지정된 패턴에 포함되는 XML Mapper를 인식하도록 하는 역할.
setTypeAliasesPackageBoardMapper XML에서 parameterType과 resultType은 클래스의 풀 패키지 경로가 포함되어야 합니다. BoardDTO와 같이 클래스의 이름만 지정하였는데요, 해당 메서드를 사용해서 풀 패키지 경로를 생략할 수 있습니다. 패키지의 패턴이 복잡하다면, com.board..domain과 같이 전체를 의미하는 애스터리스크("")를 지정할 수 있습니다.
mybatisConfigapplication.properties에서 mybatis.configuration으로 시작하는 모든 설정을 읽어 들여 빈(Bean)으로 등록
setConfiguration마이바티스 설정과 관련된 빈(Bean)을 설정 파일로 지정

  1. src/text/java/com/board/MapperTests.java에 테스트코드 작성
package com.board;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import com.board.domain.BoardDTO;
import com.board.mapper.BoardMapper;

@SpringBootTest
class MapperTests {

	@Autowired
	private BoardMapper boardMapper;

	@Test
	public void testOfInsert() {
		BoardDTO params = new BoardDTO();
		params.setTitle("게시글 제목 테스트1");
		params.setContent("게시글 내용 테스트2");
		params.setWriter("테스트계정1");

		int result = boardMapper.insertBoard(params);
		System.out.println("결과는 " + result + "입니다.");
	}

}

  1. testOfInsert() 메소드 더블클릭 후 Run As - JUnit Test

  1. Junit, DB 확인






orai18n관련 오류가 날 경우

  1. https://www.oracle.com/database/technologies/appdev/jdbc-ucp-19-7-c-downloads.html 에서 orai18n.jar 저장

  1. Build Path - Configure Build Path...

  1. Add External JARs...

  1. 아까 저장한 orai18n.jar 선택

  1. Apply and Close

  1. 추가 확인 후 테스트 다시 실행

0개의 댓글