Spring MVC basic_4 Spring CRUD와 테스트

dwanGim·2022년 6월 2일
0

spring_basic

목록 보기
3/41

먼저 프로젝트 세팅

먼저

root-context.xml 파일 하단의 Namespaces에서 mybatis-spring을 체크합니다.

그 다음 resouce 창에서 sqlSessionFactory 객체를 생성한 다음

밑에 Mybatis 스캔을 하고

root-context.xml 하단의 Beans Graph 탭을 클릭해서

제대로 객체들이 들어왔나 체크합니다.

한글 인코딩 세팅

JSP 프로젝트에서는 한글 인코딩을 위해서

Post방식으로 매핑을 할 때마다 request.setCharacterEncoding("UTF-8");을

작성했습니다.

그러나 이제는 그럴 필요가 없습니다.

Web.xml파일의 web-app 태그 사이에 아래와 같은 filter처리를 해줍니다.

	<filter>
		<filter-name>encoding</filter-name>
		<filter-class>
			org.springframework.web.filter.CharacterEncodingFilter
		</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
	</filter>
	
	<filter-mapping>
		<filter-name>encoding</filter-name>
		<servlet-name>appServlet</servlet-name>
	</filter-mapping>

</web-app>

이제 한글 인코딩은 자동입니다.

편합니다 정말 좋습니다.

Oracle SQL Developer

oracle sql developer가 설치되어있고 계정도 미리 등록해둔 관계로

얼른 켜서 아래의 구문을 이용해 게시판 테이블을 만들어줍니다.

SEQUENCE는 일종의 oracle 변수로 MySQL에는 있었던 auto_increment가 없기 때문에

선언해줍니다.

CREATE SEQUENCE board_num;

CREATE TABLE board_tbl (
    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 board_tbl add constraint pk_board primary key(bno);

그리고 INSERT 문으로 board_tbl에 row를 생성해줍니다.

INSERT INTO board_tbl (bno, title, content, writer) values (
board_num.nextval, 'first test title', 'first content', 'fisrt writer');

SEQUENCE 는 auto_increment를 대신해서 계속 생성해주어야 합니다.

오토 인크리먼트처럼 null을 지정하는 대신 sequence명.nextvar 을 선언해주어야

번호가 1씩 증가하며 배정됩니다.

Mybartis의 인터페이스-xml 연결

이제 드디어 기본 설정이 끝났습니다.

CRUD 로직을 생성해보겠습니다.

Mybartis는 자바 코드와 쿼리문을 분리하기 위한 툴이라고 미리 말씀드렸습니다.

아래와 같이 인터페이스와 xml파일 두 개의 나눠진 파일을 하나처럼 사용하게

설정해주셔야 합니다.

그리고 BoardMapper.xml의 mapper 태그 내에 어떤 주소와 결합할 지

선언해주셔야 합니다.

이제 VO 데이터를 전달해볼 준비를 합니다.

롬복의 @Data 어노테이션을 활용한 너무나 쉬운 VO 클래스 생성입니다.

VO가 생겼으니 인터페이스입니다.

인터페이스에 메서드의 이름과 용도에 따른 리턴자료형을 적어줍니다.

<?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.ict.mapper.BoardMapper">

	<select id="getList" resultType="com.ict.persistence.BoardVO">

		 <![CDATA[
		 	SELECT * FROM board_tbl WHERE bno < 4
		 ]]>
		 
	</select>

</mapper>

xml 파일에서는 쿼리문의 종류에 따라 태그를 사용하며

id 태그에 연결 메서드의 이름을 쓰고

resultType에는 리턴 자료형을 적습니다.

리스트인지 아닌지 여부가 전혀 중요하지 않습니다. Mybartis의 resultType이 알아서

자료형을 찾아주기 때문에 단일 자료형 resultType만 쓰면 됩니다.

Test를 해보자

다음과 같은 테스트 테이블에 test코드를 작성해줍니다.

package com.ict.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.extern.log4j.Log4j;

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

	// 이 테스트 코드 내에서는 BoardMapper의 테스트를 담당합니다.
	// 그래서 먼저 선언하고 의존성 주입까지 마쳐야 해당 기능을 이 클래스 내에서 쓸 수 있습니다.
	@Autowired
	private BoardMapper mapper;
	
	@Test
	public void testGetList() {
		log.info("getList 실행");
		log.info(mapper.getList());
	}
}

@RunWith
@ContextConfiguration
@Log4j

먼저 클래스에 위의 세가지 어노테이션을 선언해줍니다.

그리고 BoardMapper를 선언한 후 의존성을 주입해줍니다.

그러면 @Test어노테이션 밑에 원하는 메서드를 선언할 수 있습니다.

완벽합니다. 테스트 해봅시다.

콘솔 로그를 보면 Mybartis와 스프링 Junit이 알아서

preparedStatement를 선언하고 SQL 쿼리를 준비하는 걸 볼 수 있습니다.

oracle과의 커넥션도 알아서 연결해줍니다.

자동커밋이 시작됨과 동시에 ResultSet이 시작되었습니다.

1번 row의 결과가 나온 뒤 ResultSet.isClosed() 가 returned false가 되자

JSP에서 ResultSet.next()로 실행하던 로직이 그대로 실행되었습니다.

같은 방식으로 3개의 row를 처리한 뒤

이렇게 콘솔에 VO 테이블이 표시되었습니다.

ResultSet을 .close한 뒤에는

pstmt나

connection도 알아서 닫아줍니다.

여태껏 try catch문 내부에 finally 달아서 Exception e쓰고 .close를

매번 메서드 만들 때마다 했었는데

이제는 그럴 필요가 없습니다.

Spring이 좋아지고 있습니다.

Test가 성공적입니다. 일단은 여기까지 입니다.

profile
배울 게 참 많네요.

0개의 댓글