관리 메뉴

DeseoDeSeo

[Spring] mvc07_환경설정, 3 tier구조 본문

spring

[Spring] mvc07_환경설정, 3 tier구조

deseodeseo 2023. 10. 21. 14:38
환경설정
pom.xml
<packaging>war</packaging>
	<version>1.0.0-BUILD-SNAPSHOT</version>
	<properties>
		<java-version>1.6</java-version>
		<!-- 10/04(1) -->
		<org.springframework-version>5.0.7.RELEASE</org.springframework-version>
		<org.aspectj-version>1.6.10</org.aspectj-version>
		<org.slf4j-version>1.6.6</org.slf4j-version>
	</properties>

자바 버전도 1.8버전으로 업데이트

<plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>2.5.1</version>
      <configuration>
        <source>1.8</source>
        <target>1.8</target>
        <compilerArgument>-Xlint:all</compilerArgument>
        <showWarnings>true</showWarnings>
        <showDeprecation>true</showDeprecation>
      </configuration>
</plugin>
web.xml
: 대문자 J로 바꾸고 alt + f5
<web-app version="2.5" xmlns="http://Java.sun.com/xml/ns/javaee"

패키지 생성
src/main/java > kr.board.controller
src/main/java > kr.board.entity
src/main/java > kr.board.mapper
src/main/java > kr.board.service
xml 파일 분리 위해서
src/main/resources > kr> board > mapper 폴더 생성
> mapper.xml
servlet-context.xml
: service패키지도 읽을 수 있게 스캔 추가( controller, service 찾을 수 있도록 )
	<context:component-scan base-package="kr.spring.controller" />
	<context:component-scan base-package="kr.spring.service" />

 

views > board폴더 생성 > template.jsp 생성
 필요한 태그 라이브러리와 contextPath값 설정
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
	<%@ taglib prefix ="c" uri="http://java.sun.com/jsp/jstl/core" %>
	<%@ taglib prefix ="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<c:set var="cpath" value="${pageContext.request.contextPath}" />	
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet"
	href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<script
	src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
<script
	src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
	<div class="container">
		<h2>Spring MVC07</h2>
		<div class="panel panel-default">
			<div class="panel-heading">Board</div>
			<div class="panel-body">

			</div>
			<div class="panel-footer">스프링게시판-뇽뇽이</div>
		</div>
	</div>

	<script type="text/javascript">
		
	
	</script>


</body>
</html>
pom.xml
서블릿 버전 업데이트

 

<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>3.1.0</version>
			<scope>provided</scope>
</dependency>

롬복 추가

<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
	    <groupId>org.projectlombok</groupId>
	    <artifactId>lombok</artifactId>
		 <version>1.18.24</version>
	    <scope>provided</scope>
</dependency>
DB관련 api추가
mysql, spring-jdbc 버전 업데이트 
<!-- MyBatis를 사용하기 위한 api추가  -->
			<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
			<dependency>
			    <groupId>org.mybatis</groupId>
			    <artifactId>mybatis</artifactId>
			    <version>3.4.6</version>
			</dependency>
			
	<!-- conncection Pool을 사용하기 위한 hikari cp추가.  -->
			<!-- https://mvnrepository.com/artifact/com.zaxxer/HikariCP -->
			<dependency>
			    <groupId>com.zaxxer</groupId>
			    <artifactId>HikariCP</artifactId>
			    <version>3.4.1</version>
			</dependency>
			
	<!-- MYBATIS 에서 connection을 하기 위한 mySQL Driver API 추가 -->
	
			<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
			<dependency>
			    <groupId>mysql</groupId>
			    <artifactId>mysql-connector-java</artifactId>
			    <version>5.1.42</version>
			</dependency>
			
	<!-- Spring에서 Mybatis 를 통해 JDBC를 사용하기 위한 aPI 추가 -->
	
	<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
			<dependency>
			    <groupId>org.springframework</groupId>
			    <artifactId>spring-jdbc</artifactId>
			    <version>5.0.20.RELEASE</version>
			</dependency>
			
	<!-- mybatis와 Spring을 연결해주는 API -->
	<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
			<dependency>
				    <groupId>org.mybatis</groupId>
				    <artifactId>mybatis-spring</artifactId>
				    <version>1.3.2</version>
			</dependency>
SpringMVC01에 있는 rootContext.xml전부 복사 붙여넣기
kr.board.controller > BoardController 생성
kr.board.entity > Board.java , Member.java생성
kr.board.mapper > BoardMapper Interface 생성
src/main/resources > kr > board > mapper > MyBatis.xml 생성 
kr.board.service > BoardService.java 생성
kr.board.service > BoardServiceImpl.java 생성
//여기가 실질적으로 일하는 service임. 
- servlet-context.xml에서 스캔하기 위해서 Service어노테이션 명시 필수
@Service  
public class BoardServiceImpl implements BoardService {
kr.board.entity > MySQL.sql 생성
kr.board.controller > LoginController.java 생성
views > board > boardList.jsp 생성
SQL 테이블 생성
CREATE TABLE TBLBOARD(
   IDX INT NOT NULL,
   MEMID VARCHAR(20) NOT NULL,
   TITLE VARCHAR(100) NOT NULL,
   CONTENT VARCHAR(2000) NOT NULL,
   WRITER VARCHAR(30) NOT NULL,
   INDATE DATETIME DEFAULT NOW(),
   COUNT INT DEFAULT 0,
   -- 댓글기능 추가 --
   BOARDGROUP INT, -- 부모 댓글 하나의 그룹 --
   BOARDSEQUENCE INT, -- 같은 그룹게시글안안에서 댓글의 순서 --
    BOARDLEVEL INT, -- 1단계 댓글인지 2단계 댓글인지에 대한 정보  원 댓글에 달린 대댓글인지, 다른 댓글에 달린건지 --   
   BOARDAVAILABLE INT, -- 삭제된 글인지 여부 --
   PRIMARY KEY(IDX)
);
CREATE TABLE TBLMEMBER(
   MEMID VARCHAR(50) NOT NULL,
   MEMPWD VARCHAR(50) NOT NULL,
   MEMNAME VARCHAR(50) NOT NULL,
   MEMPHONE VARCHAR(50) NOT NULL,
   MEMADDR VARCHAR(100),
   LATITUDE DECIMAL(13, 10), -- 현재위치위도 --
   LONGITUDE DECIMAL(13, 10), -- 현재위치경도 --
   PRIMARY KEY(MEMID)
);
board.java
package kr.spring.entity;

import java.util.Date;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

@ToString
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Board {
	private int idx;
	private String memID;
	private String title;
	private String content;
	private String writer;
	private Date indate;
	private int count;
	private int boardGroup;
	private int boardSequence;
	private int boardLevel;
	private int boardAvailable;
	
}
Member.java
package kr.spring.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

@NoArgsConstructor
@AllArgsConstructor
@ToString
@Data
public class Member {
	private String memID;
	private String memPwd;
	private String memName;
	private String memPhone;
	private String memAddr;
	private String latitude;
	private String longitude;
}
pom.xml
버전 업데이트
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<scope>test</scope>
		</dependency>
<groupId>log4j</groupId>
		<artifactId>log4j</artifactId>
		<version>1.2.15</version>

 

<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-test</artifactId>
		<version>${org.springframework-version}</version>
</dependency>
src/test/java > kr.spring.mapper 패키지 생성
DataSourceTest.java 클래스 생성
package kr.spring.mapper;

import java.sql.Connection;
import java.util.List;

import javax.sql.DataSource;


import org.junit.Before;
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 org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;

import kr.spring.entity.Board;
import kr.spring.service.BoardServiceImpl;
import lombok.extern.log4j.Log4j;

@Log4j // 테스트 실행결과를 콘솔창에 나오게 하기위함
@RunWith(SpringJUnit4ClassRunner.class) // 실행하기위해 스프링컨테이너에 올리는 코드
@ContextConfiguration({"file:src/main/webapp/WEB-INF/spring/root-context.xml",
	"file:src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml"}) 
// root-context.xml 경로를 잡아주는과정
@WebAppConfiguration // 10/05 servlet 컨테이너를 사용하기 위한 어노테이션
public class DataSourceTest {
   // root-context.xml이 이상없는지 
   // test하는 클래스
   
   // Connection이 잘되는지 테스트
   @Autowired // root-context.xml에 있는 id가 dataSource인 녀석을 사용하겠다
   private DataSource dataSource;
   
   @Autowired
   private BoardMapper mapper;
   
   @Autowired
   private BoardServiceImpl service;
   
   @Autowired
   private WebApplicationContext ctx; // 10/05 Spring Container라는 메모리 공간 객체임. 
   
   private MockMvc mockMvc; // 10/05 가상의 mvc환경을 만들어주는 객체, 뷰, 핸들러, 맵빙 등등을 실행해줌.
   
   @Before  //10/05 test실행하기 전에 먼저 실행하는 부분
   public void setup() {
	   this.mockMvc = MockMvcBuilders.webAppContextSetup(ctx).build();
   }
   
  
   
   
//   @Test
//   public void testInsert() {
//	   Board vo = new Board();
//	   vo.setMemID("와플");
//	   vo.setTitle("합병조건");
//	   vo.setContent("일반집합 연산자");
//	   vo.setWriter("관계대수");
//	   mapper.insertSelectKey(vo);
//   }
   
	
	  @Test 
	  public void testController() throws Exception{ 
		  
		  log.info(
				   mockMvc.perform(MockMvcRequestBuilders.get("/board/modify?idx")) //perform - 요청하다
				   .andReturn() // return값을 받아오겠다. 
				   .getModelAndView() //controller의 model값과iew경로를 다 받아오겠다. 
				   );  // 콘솔창에 출력하는거임. }
	 
				  
	  }
	 
   
   
//   @Test
//   //10/05
//   public void testGetList() {
//	   List<Board> list = service.getList();
//	   for(Board vo: list) {
//		   System.out.println(vo.toString());
//	   }
//   }  
//   
//   @Test  //mapper 작동 ㄷ잘되는지 테스트         
//   public void testGetList() {
//	   List<Board> list  = mapper.getList();
//	   for(Board vo : list) {
//		   System.out.println(vo.toString());
//	   }
//   }
     
   //junit을 통해서 jsp없이도 테스트 가능하다. 모듈별로 테스트 가능하다.
//   @Test
//   public void testConnection() {
//      
//      try( Connection conn = dataSource.getConnection() ){
//         log.info(conn);
//      }catch(Exception e) {
//         e.printStackTrace();
//      }
//      
//   }
   
   

   
}

이렇게 실행하면 @Test 어노테이션을 찾아서 실행시킴.

BoardMapper.java
public List<Board> getList();
BoardMapper.xml
<select id="getList" resultType="kr.spring.entity.Board">
		SELECT * FROM TBLBOARD
		ORDER BY BOARDGROUP DESC, BOARDSEQUENCE ASC
</select>
DataSourceTest.java
   @Test  //mapper 작동 ㄷ잘되는지 테스트         
   public void testGetList() {
	   List<Board> list  = mapper.getList();
	   for(Board vo : list) {
		   System.out.println(vo.toString());	   }
 }

 

BoaradService interface
	@Override
	public List<Board> getList() {
		// 게시글 전체목록 가져오기 기능 = mapper가 하는 일임.controller > service > mapper.
		List<Board> list = mapper.getList();
		return list;
	}

J unit을 통해 페이지를 만들지 않더라도 확인해볼 수 있다.

root-context.xml
: test할 때, root-context.xml파일을 읽을 때. Service를 찾아야하기 때문에
   <context:component-scan base-package="kr.spring.service" />

이걸 추가해준다.

BoardController.java
@Controller
@RequestMapping("/board/*")
public class BoardController {

○ requestMapping을 통해 시작하는 url을 정할 수 있음.

○ /* 은 board/~ 무엇이든지 올 수 있게 함.

 

@GetMapping("/list")
	public String boardList(Model model) {		
		// board파일의 boardList.
		List<Board> list = service.getList();
		model.addAttribute("list",list);
		
		return "board/list";
	}
DataSourceTest,java
@Log4j // 테스트 실행결과를 콘솔창에 나오게 하기위함
@RunWith(SpringJUnit4ClassRunner.class) // 실행하기위해 스프링컨테이너에 올리는 코드
@ContextConfiguration({"file:src/main/webapp/WEB-INF/spring/root-context.xml",
	"file:src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml"}) 
// root-context.xml 경로를 잡아주는과정
@WebAppConfiguration // 10/05 servlet 컨테이너를 사용하기 위한 어노테이션
public class DataSourceTest {