7월 3일
MVC모델2 로 플젝 만들기 by 스프링





위와 같은 방식으로 플젝 진행 예정
1.초기설정 하기
(1)플젝을 생성 하도 poom.xml을 설정한다.
(2)자바버젼
<java-version>11</java-version>
(3)스프링프레임워크버젼
<org.springframework-version>5.2.7.RELEASE</org.springframework-version>
(4)스프링프레임워크 추가 라이브러리 설정
spring-webmvc 복사해서 아래와 같이 설정
DB연결 관련된 설정으로 DB연결이 잘되었는지 테스트 하기위함
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
(5)hikariCP 설정
<!-- https://mvnrepository.com/artifact/com.zaxxer/HikariCP -->
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>4.0.3</version>
</dependency>
(6)mybatis 와 mybatisSpring 설정
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
(7)log4j 버젼 설정
버젼올리고 exclusions 하단 다 자르고 scope까지 삭제
<version>1.2.17</version>
(8)메이븐에서 javax.servlet-api 가져와서 붙여넣기
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
(9)junit 버젼 설정하기
<version>4.12</version>
(10)lombok 설정
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>provided</scope>
</dependency>
(11)log4jdbc 설정
<!-- https://mvnrepository.com/artifact/org.bgee.log4jdbc-log4j2/log4jdbc-log4j2-jdbc4 -->
<dependency>
<groupId>org.bgee.log4jdbc-log4j2</groupId>
<artifactId>log4jdbc-log4j2-jdbc4</artifactId>
<version>1.16</version>
</dependency>
(12)maven버젼 설정
<source>11</source>
<target>11</target>
(13)jdbc추가
자바빌드페스->라이브러리탭->클래스패스->add External..->ojdbc8.jar가 있는 곳까지 찾아서 추가해줌
(14)Deployment Assembly 설정
Deployment Assembly->add->ojdbc8.jar추가
2.테이블 만들기
sql Developer로 테이블 작성하기

3.jdbc root-context 설정
(1)root-context 설정
jdbc 를 쓸때 스프링에게 나 jdbc 아래 설정처럼 쓸거라고 알려줘야함
<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
<!-- log4jdbc 를 사용하기 위해 이부분 주석 처리 아래와 같이 수정해줌
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"></property>
<property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:xe"></property>
-->
<property name="driverClassName" value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"></property>
<property name="jdbcUrl" value="jdbc:log4jdbc:oracle:thin:@localhost:1521:xe"></property>
<property name="username" value="scott" ></property>
<property name="password" value="tiger"></property>
</bean>
<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>
<mybatis-spring:scan base-package="com.keduit.mapper"/>
(2)Namespaces
beans,context,mybatis 설정하기
(3)log4jdbc 사용하기 위한 property설정
src>main>resources 에 fail만들어서 아래와 같이 property 설정하기
기존에 있던 파일 복붙해도됨
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
(4)jdbc connection이 잘되었는지 확인 테스트해보기
src>test>java 에서 JDBCTest class 작성
package com.keduit.persistence;
import static org.junit.Assert.fail;
import java.sql.Connection;
import java.sql.DriverManager;
import org.junit.Test;
import com.keduit.persistence.JDBCTest;
import lombok.extern.log4j.Log4j;
@Log4j
public class JDBCTest {
static {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
}catch(Exception e) {
e.printStackTrace();
}
}
@Test
public void testConnection() {
try (Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","scott","tiger"))
//try에 괄호안에 소스를 넣어주면 close를 안해줘도 됨
{
log.info(conn);
}catch (Exception e) {
fail(e.getMessage());
}
}
}
4.log4j.xml 설정
불필요한 정보가 콘솔에 나오는걸 방지하기위한 설정
src>test>resources 에서
log4j.xml 설정
<logger name="jdbc.audit">
<level value="warn"/>
</logger>
<logger name="jdbc.resultset">
<level value="warn"/>
</logger>
<logger name="jdbc.connection">
<level value="warn"/>
</logger>
5.DataSourcePool이 잘 작성이 되었는지 확인
src>test>java 에서 DataSourceTest class 작성
package com.keduit.persistence;
import static org.junit.Assert.fail;
import java.sql.Connection;
import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
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 com.keduit.persistence.DataSourceTest;
import lombok.Setter;
import lombok.extern.log4j.Log4j;
@RunWith(SpringJUnit4ClassRunner.class) //SpringJUnit4ClassRunner.class 이클래스로 테스트 할때 쓸거야
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")//테스트 할때 참조를 하는 경로를 적어줌
@Log4j //뷰단에서 화면을 뿌려줄때 log관리는 Log4j로 할꺼야
public class DataSourceTest {
@Setter(onMethod_=@Autowired)//스프링아 아래멤버 주입해죠
private DataSource dataSource;
@Setter(onMethod_=@Autowired)//스프링아 아래멤버 주입해죠
private SqlSessionFactory sqlSessionFactory;
@Test
public void testConnection() {
try(Connection conn=dataSource.getConnection()){
log.info(conn);
}catch (Exception e) {
fail(e.getMessage());
}
}
@Test
public void testMyBatis() {
//여기서의 Session 은 MyBatis의 Session으로 connection 연결을 담당하고 있다.
try(SqlSession session = sqlSessionFactory.openSession();
Connection conn =session.getConnection()){
log.info(session);
log.info(conn);
}catch (Exception e) {
fail(e.getMessage());
}
}
}
6.persistence(영속계층)의 처리방법
(1)테이블을 반영하는 VO(Value Object)클래스의 생성,멤버변수만 작성하믄됨 왜??getter,setter는 Mapper에서 지원해줌
(2)MyBatis의 Mapper인터페이스의 작성/xml 처리
->MyBatis야~나 테이블에 있는 데이터를 읽어와애데, 수정할꺼야 등등 이런 명령을 적어줌
(3)작성한 Mapper 인터페이스의 테스트
7.persistence(영속계층) 만들기
(1)VO만들기
src>main>java 에 클래스 만들기
package com.keduit.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;
}
(2)Mapper 작성
root-context에 아래 작성 되었는지 확인
<mybatis-spring:scan base-package="com.keduit.mapper"/>
(3)src>main>java 에 인터페이스 만들기
package com.keduit.Mapper;
import java.util.List;
import org.apache.ibatis.annotations.Select;
import com.keduit.domain.BoardVO;
public interface BoardMapper {
@Select("Select*from t_board where bno>0")
public List<BoardVO> getList(); //추상 메서드 만들기
}
(4)잘 작성이 되었는지 테스트
src>test>java
package com.keduit.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 com.keduit.Mapper.BoardMapper;
import com.keduit.persistence.DataSourceTest;
import lombok.Setter;
import lombok.extern.log4j.Log4j;
@RunWith(SpringJUnit4ClassRunner.class) //SpringJUnit4ClassRunner.class 이클래스로 테스트 할때 쓸거야
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")//테스트 할때 참조를 하는 경로를 적어줌
@Log4j //뷰단에서 화면을 뿌려줄때 log관리는 Log4j로 할꺼야
public class BoardMapperTest {
@Setter(onMethod_=@Autowired)//스프링아 주입해죠
private BoardMapper mapper;//테스트할 부분을 선언,선언하면 스프링에서 bean으로 등록해줌
@Test
public void testGetList() {
//mapper의 getList메서드를 호출하여 forEach통해 변수 board에 담고 log.info로 board를 출력한다.
mapper.getList().forEach(board->log.info(board));
}
}
8.persistence(영속계층) 만들기_xml방식으로
(1)src>test>resouse에 폴더 만들기->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.keduit.mapper.BoardMapper">
<select id="getList" resultType="com.keduit.domain.BoardVO">
<![CDATA[ //xml이 알아먹기 위하여 포장해줌
Select*from t_board where bno>0
]]>
</select>
</mapper>
BoardMapper 에 있는 @Select 내용을 xml이 대신 가지고 있다가 필요할때마다 꺼내서줌
(2)src>test>java에 있는 BoardMapperTest로 잘 작성이 되었는지 확인
9.insert 설정해보기_xml방식으로
(1)src>test>resouse에 폴더 만들기->xml파일 만들어서 설정
중요!!! insert 할때 prestatement 형식으로 (?,?,?) 넣어주는 부분을 설정할때
아래와같이 ? 대신하여 #{title},#{content},#{writer} 를 설정한다.
<?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.keduit.Mapper.BoardMapper">
<select id="getList" resultType="com.keduit.domain.BoardVO">
<![CDATA[
Select*from t_board where bno>0
]]>
</select>
<insert id="insert">
insert into t_board(bno,title,content,writer)
values(seq_board.nextval,#{title},#{content},#{writer})
</insert>
</mapper>
(2)src>main>resouse
BoardMapper 인터페이스에 insert 넣어서 설정하기
package com.keduit.Mapper;
import java.util.List;
import org.apache.ibatis.annotations.Select;
import com.keduit.domain.BoardVO;
public interface BoardMapper {
// @Select("Select*from t_board where bno>0") xml설정 사용 안할시 사용벙법
public List<BoardVO> getList(); //BoardMapper.xml 사용시 내용을 받아 처리하는 메서드
public void insert(BoardVO board);//BoardMapper.xml 사용시 내용을 받아 처리하는 메서드
}
(3)src>test>java에 있는 BoardMapperTest로 잘 작성이 되었는지 확인
package com.keduit.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 com.keduit.Mapper.BoardMapper;
import com.keduit.domain.BoardVO;
import com.keduit.persistence.DataSourceTest;
import lombok.Setter;
import lombok.extern.log4j.Log4j;
@RunWith(SpringJUnit4ClassRunner.class) //SpringJUnit4ClassRunner.class 이클래스로 테스트 할때 쓸거야
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")//테스트 할때 참조를 하는 경로를 적어줌
@Log4j //뷰단에서 화면을 뿌려줄때 log관리는 Log4j로 할꺼야
public class BoardMapperTest {
@Setter(onMethod_=@Autowired)//스프링아 주입해죠
private BoardMapper mapper;//테스트할 부분을 선언,선언하면 스프링에서 bean으로 등록해줌
@Test
public void testInsert() {
BoardVO board =new BoardVO();
board.setTitle("안녕하세요");
board.setContent("내용내용 입니다.");
board.setWriter("김자바");
mapper.insert(board);
log.info(board);
}
}
10.insert(primery key 알아내기)_xml방식으로

(1)src>test>resouse에 폴더 만들기->xml파일 만들어서 설정
insertSelectKey 설정을 보면 selectKey 를 order="BEFORE" 로 설정해 놓았기 때문에 먼저 실행이 되고, 그 다음에 바깥에 insert 문이 실행이 됨
selectKey 가 먼저 실행 되면서 bno에 값을 넣어주고, 바깥에 insert 문이 bno의 값을 받아 처리함
일반 insert문은 bno가 아니라 seq_board.nextval 로 표시함
<?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.keduit.Mapper.BoardMapper">
<select id="getList" resultType="com.keduit.domain.BoardVO">
<![CDATA[
Select*from t_board where bno>0
]]>
</select>
<insert id="insert">
insert into t_board(bno,title,content,writer)
values(seq_board.nextval,#{title},#{content},#{writer})
</insert>
<insert id="insertSelectKey">
<selectKey keyProperty="bno" order="BEFORE" resultType="long">
select seq_board.nextval from dual
</selectKey>
insert into t_board(bno,title,content,writer)
values(#{bno},#{title},#{content},#{writer})
</insert>
</mapper>
(2)src>main>resouse
BoardMapper 인터페이스에 insertSelectKey 넣어서 설정하기
package com.keduit.Mapper;
import java.util.List;
import org.apache.ibatis.annotations.Select;
import com.keduit.domain.BoardVO;
public interface BoardMapper {
// @Select("Select*from t_board where bno>0") xml설정 사용 안할시 사용벙법
public List<BoardVO> getList(); //BoardMapper.xml 사용시 내용을 받아 처리하는 메서드
public void insert(BoardVO board);//BoardMapper.xml 사용시 내용을 받아 처리하는 메서드
public void insertSelectKey(BoardVO board);//BoardMapper.xml 사용시 내용을 받아 처리하는 메서드
}
(3)src>test>java에 있는 BoardMapperTest로 잘 작성이 되었는지 확인
package com.keduit.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 com.keduit.Mapper.BoardMapper;
import com.keduit.domain.BoardVO;
import com.keduit.persistence.DataSourceTest;
import lombok.Setter;
import lombok.extern.log4j.Log4j;
@RunWith(SpringJUnit4ClassRunner.class) //SpringJUnit4ClassRunner.class 이클래스로 테스트 할때 쓸거야
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")//테스트 할때 참조를 하는 경로를 적어줌
@Log4j //뷰단에서 화면을 뿌려줄때 log관리는 Log4j로 할꺼야
public class BoardMapperTest {
@Setter(onMethod_=@Autowired)//스프링아 주입해죠
private BoardMapper mapper;//테스트할 부분을 선언,선언하면 스프링에서 bean으로 등록해줌
@Test
public void testInsertSelectKey() {
BoardVO board =new BoardVO();
board.setTitle("안뇽");
board.setContent("나는 또다른 내용이야.");
board.setWriter("박자바");
mapper.insertSelectKey(board);
log.info(board);
}
}

11.한건씩 읽어오기_xml방식으로
(1)src>test>resouse에 폴더 만들기->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.keduit.Mapper.BoardMapper">
<select id="read" resultType="com.keduit.domain.BoardVO">
select*from t_board where bno=#{bno}
</select>
</mapper>
(2)src>main>resouse
BoardMapper 인터페이스에 read 넣어서 설정하기
package com.keduit.Mapper;
import java.util.List;
import org.apache.ibatis.annotations.Select;
import com.keduit.domain.BoardVO;
public interface BoardMapper {
public BoardVO read(long bno);//BoardMapper.xml 사용시 내용을 받아 처리하는 메서드
}
(3)src>test>java에 있는 BoardMapperTest로 잘 작성이 되었는지 확인
package com.keduit.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 com.keduit.Mapper.BoardMapper;
import com.keduit.domain.BoardVO;
import com.keduit.persistence.DataSourceTest;
import lombok.Setter;
import lombok.extern.log4j.Log4j;
@RunWith(SpringJUnit4ClassRunner.class) //SpringJUnit4ClassRunner.class 이클래스로 테스트 할때 쓸거야
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")//테스트 할때 참조를 하는 경로를 적어줌
@Log4j //뷰단에서 화면을 뿌려줄때 log관리는 Log4j로 할꺼야
public class BoardMapperTest {
@Setter(onMethod_=@Autowired)//스프링아 주입해죠
private BoardMapper mapper;//테스트할 부분을 선언,선언하면 스프링에서 bean으로 등록해줌
@Test
public void testRead() {
BoardVO board =new BoardVO();
board=mapper.read(7L);
log.info(board);
}
}

12.게시물 삭제
(1)src>test>resouse에 폴더 만들기->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.keduit.Mapper.BoardMapper">
<delete id="delete">
delete from t_board where bno=#{bno}
</delete>
</mapper>
(2)src>main>resouse
BoardMapper 인터페이스에 delete 넣어서 설정하기
package com.keduit.Mapper;
import java.util.List;
import org.apache.ibatis.annotations.Select;
import com.keduit.domain.BoardVO;
public interface BoardMapper {
public int delete(long bno);//BoardMapper.xml 사용시 내용을 받아 처리하는 메서드
}
(3)src>test>java에 있는 BoardMapperTest로 잘 작성이 되었는지 확인
package com.keduit.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 com.keduit.Mapper.BoardMapper;
import com.keduit.domain.BoardVO;
import com.keduit.persistence.DataSourceTest;
import lombok.Setter;
import lombok.extern.log4j.Log4j;
@RunWith(SpringJUnit4ClassRunner.class) //SpringJUnit4ClassRunner.class 이클래스로 테스트 할때 쓸거야
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")//테스트 할때 참조를 하는 경로를 적어줌
@Log4j //뷰단에서 화면을 뿌려줄때 log관리는 Log4j로 할꺼야
public class BoardMapperTest {
@Setter(onMethod_=@Autowired)//스프링아 주입해죠
private BoardMapper mapper;//테스트할 부분을 선언,선언하면 스프링에서 bean으로 등록해줌
@Test
public void testdelete() {
int result=mapper.delete(11L);
log.info(result);
}
}
13.게시물 update 하기
(1)src>test>resouse에 폴더 만들기->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.keduit.Mapper.BoardMapper">
<update id="update">
update t_board set title=#{title}, content=#{content}, writer=#{writer},
updatedate=sysdate where bno=#{bno}
</update>
</mapper>
(2)src>main>resouse
BoardMapper 인터페이스에 update넣어서 설정하기
package com.keduit.Mapper;
import java.util.List;
import org.apache.ibatis.annotations.Select;
import com.keduit.domain.BoardVO;
public interface BoardMapper {
public int update(BoardVO board);
}
(3)src>test>java에 있는 BoardMapperTest로 잘 작성이 되었는지 확인
package com.keduit.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 com.keduit.Mapper.BoardMapper;
import com.keduit.domain.BoardVO;
import com.keduit.persistence.DataSourceTest;
import lombok.Setter;
import lombok.extern.log4j.Log4j;
@RunWith(SpringJUnit4ClassRunner.class) //SpringJUnit4ClassRunner.class 이클래스로 테스트 할때 쓸거야
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")//테스트 할때 참조를 하는 경로를 적어줌
@Log4j //뷰단에서 화면을 뿌려줄때 log관리는 Log4j로 할꺼야
public class BoardMapperTest {
@Setter(onMethod_=@Autowired)//스프링아 주입해죠
private BoardMapper mapper;//테스트할 부분을 선언,선언하면 스프링에서 bean으로 등록해줌
@Test
public void testupdate() {
BoardVO board =new BoardVO();
board.setTitle("수정");
board.setContent("내용수정");
board.setWriter("글쓴이");
board.setBno(12);
int result=mapper.update(board);
log.info("결과=>"+result);
}
}