package com.ohj.controller;

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 lombok.Setter;
import lombok.extern.log4j.Log4j;

@RunWith(SpringJUnit4ClassRunner.class)
//Test for Controller
@WebAppConfiguration
@ContextConfiguration({"file:src/main/webapp/WEB-INF/spring/root-context.xml", "file:src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml"})
@Log4j
public class BoardControllerTests {
	
	
	// MockMvc : 가짜  MVC
	@Setter(onMethod_= {@Autowired})
	private WebApplicationContext ctx;
	private MockMvc mockMvc;
	
	//무조건 실행하는 메소드
	//@Before : import 할 때  JUnit을 이용.
	//이 어노테이션이 적용 된 메서드는 모든 테스트 전에 매번 실행 되는 매서드가 된다.
	
   @Before
   public void setup() {
      this.mockMvc = MockMvcBuilders.webAppContextSetup(ctx).build();
   }

   //MockMvcRequestBuilders를 이용하면 마치 GET방식의 호출을 할 수 있다.
   @Test
   public void testList() throws Exception{
	   
	   //BoardController.java쪽 
      log.info(mockMvc.perform(MockMvcRequestBuilders.get("/board/list")).andReturn().getModelAndView().getModelMap());
   }
   
	@Test
	public void testRegister() throws Exception{
		String resultPage= mockMvc
				.perform(MockMvcRequestBuilders.post("/board/register")
				.param("title", "테스트 새글 제목")
				.param("content", "테스트 새글 내용")
				.param("writer", "user00"))
				.andReturn().getModelAndView().getViewName();
		log.info(resultPage);
	}

}
​
package com.ohj.controller;

import org.springframework.stereotype.Controller;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.ui.Model; // 스프링은 모델이다.(모델 앤 뷰 객체)
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import com.ohj.domain.BoardVO;
import com.ohj.service.BoardService;

import lombok.AllArgsConstructor;
import lombok.extern.log4j.Log4j;

@Controller
@Log4j
@RequestMapping("/board/*")
@AllArgsConstructor
public class BoardController {
	
	private BoardService service; 
	
	@GetMapping("/list")
	public void list(Model model) {
		log.info("list");
		model.addAttribute("list", service.getList());
	}// list() END
	// 이 리스트 메소드가 호출되려면 /board/list 로 되어야 한다.
	
	//등록처리 와 테스트
	
	/*public BoardController()에 POST방식으로 처리 되는 register()추가
	리턴 타입 : String
	리다이렉트어튜비트 파라미터 : 등록 작업이 끝난 후, 다시 목록 화면으로 이동하기 위해 
	추가적으로 새롭게 등록된 게시물의 번호를 같이 전달하기 위해서 이용.
	
	리턴 할 떄에는 'redirect:'라는 접두어를 사용!
	스프링 MVC가 내부적으로 response.sendRedirect()를 처리해주기 때문에 편리하다.
	*/
	@PostMapping("register")
	public String register(BoardVO board, RedirectAttributes rttr) {
		log.info("register:"+board);
		service.register(board);
		rttr.addFlashAttribute("result",board.getBno());
		return "redirect:/board/list";
	}
	
}//BoardController CLASS END

//   BoardControllerTests :  
//log.info(mockMvc.perform(MockMvcRequestBuilders.get("/board/list")).andReturn().getModelAndView().getModelMap());​
스프링 MVC(기본프레임워크) + mybatis(DB프레임워크)

주제 : 게시물 관리

작업순서
1. 요구분석(요구사항) - Naming/내부구조(비즈니스영역(로직관련/ Service)/영속영역(데이터관련/domain,mapper)/프레젠테이션영역(사용자UI관련))
2. 개발환경 구축
3. 플랫폼 구축 (스프링 MVC 프로젝트 생성)
4. 데이터베이스 테이블
5. 데이터베이스 연결 테스트
6. 영속 계층 테스트
7. 비즈니스 계층 테스트


1. 요구 분석 : CRUD 기능 구현

2.JDK 1.8 이상(JAVA(jdk(환경변수(user/system(path)) 잡기)/jre)
*톰캣과 오라클은 8080 포트를 공통으로 잡고 있기 때문에 포트번호를 각각 따로 설정해준다.
오라클 11g EX (c:\에 다운)
톰캣 9.0 이상 (c:\에 다운)
이클립스 + STS플러그인(마켓플레이스에서 다운 가능)
마이바티스 플러그인(마켓플레이스에서 다운 가능)/workspace(인코딩 UTF-8설정해주기)

3.pom.xml
Maven을 위한 통합 버전 관리
스프링 5.3 아성
자바 1.8 이상
Log4j(콘솔창 로그 찍어주는 것/log.info(""+__))/Juinit(단위별 테스트/@Test)

4. 오라클
tbl_board
bno(PK(Number))
titie(varchar2)
content(varchar2)
writer(varchar2)
regdate(Date(default sysdate))
updatedate(Date(default sysdate))

폴더 구조

오라클 - 오라클디벨로퍼
		- cmd
1. 계정/비밀번호 생성
2. 접속/ 리소스 원한 설정
3. 테이블 생성
bno :Pk,title,writer,contents,regdate(등록날짜),updatedate(수정날짜)
4. dummy data
5.데이터베이스 연결테스트 
- (root-context.xml 수집
1.하카리 환경설정(*참고 : JDBC에 비해 약 15~30% 빠른 처리 속도를 가짐) 
2.데이터소스 객체
3.sqlsessionfactory 객체
4.마이바티스 관련 파일 위치)

6.영속 계층 테스트
7.비즈니스 계층 테스트
lombok
-@setter
-@AllArgconstructher


*lombok.jar
java jar lombok.jar
Java Bean  형태의 객체 생성시
1. getter/setter(@setter)
2. 생성자(@AllArgconstructher)
3. toString() wowjddml
Test용 클래스
1.
@단위테스트
@Context 환경 파일 위치
@log 출력
public class __ {
	@setter(onMethod = Autowired)
    2. 멤버변수
    
	3.실제테스트 메서드(){
    @test
	}
}

 

5. 영속(persistance) 계층 테스트 CRUD
	1. com.~.mapper
    	1.BoardMapper.java
        2.BoardMapper.xml->mybatis <- xmlns:__/(@ ex)Select / <> ex)<Select>)
        <?xml~?>
        <mapper>
        
        </mapper>

 

https://codedragon.tistory.com/6467

 

데이터 저장계층 또는 영속계층(Persistence Layer)에 대한 이해 - DAO(Data Acess Object), DTO(Data Transfer Objec

데이터 저장계층 또는 영속계층(Persistence Layer)에 대한 이해 DAO/DTO/VO란, 영속계층(Persistence Layer)에서 사용되는 특정 패턴을 통해 구현되는 Java Bean 용어 설명 DAO (Data Acess Object) · 특정 타입..

codedragon.tistory.com

 

프레젠테이션(웹) 계층의 CRUD 구현

 

1.Controller 의 작성

 

스프링 MVC의 Controller는

하나의 클래스 내에서 여러 매서드를 작성하고,

@RequestMapping등을 이용하여

URLdf 분기하는 구조로 작성 할 수 있기 때문에

 

하나의 클래스에서 필요한 만큼

매서드의 분기를 이용하는 구조로 작성.

 

 

이전 방식 :  톰캣(WAS)을 실행하고 웹화면을 만들어서 결과를 확인하는 방식의 코드를 작성

이전 방식의 단점 : 오래 걸리고, 테스트를 자동화 하기가 어렵다.

WAS를 실행하지 않고 컨트롤러를 테스트 할 수 있는 방법으로 진행

 

1.BoardController의 분석

작성하기 전에 이루어지는 사전 작업

반드시 현재 원하는 기능을 호출하는 방식에 대하여

테이블(표)로 정리한 후 , 작성

테이블에서 FROM 항목은 해당 url 호출하기 위해 별도의 입력 화면이 필요하다는 것을 의미 

 

1.BoardController의 작성

 

1.BoardController는 com.이니셜.controller 패키지에 선언

URL 분석된 내용들을 반영하는 메서드 설계

 

@Controller 어노테이션을 추가 하여 스프링의 빈으로 인식할 수 있도록한ㄷ.

@RequestMapping 을 통하여 '/board' 로 시작하는 모든 처리를 가 담당하도록 설정www.servlet-context.xmlwww.servlet-context.xml 에 기본적으로 설정되어 있으므로 별도의 설정이 필요없다.

 

보드컨트롤러는 보드서비스에 대하여 의존적이므로

@AllArgsConstructor 를 이용하여 생성자를 만들고, 자동주입

클래스 선언부에 어노테이션 추가
BoardController 는 BoardService에 대하여 의존적이므로
@AllArgsConstructor 를 이용하여 생성자를 만들고, 자동 주입


만약, 생성자를 만들지 않을 경우에는 반드시
@Setter(onMethod_ = {@Autowired} 를 이용하여 처리

 

 

 

조회를 위한 list() 메소드 추가

 

list()는 나중에 게시물의 목록을 전달해야 하므로 Model객체를 파라메터를 통하여

BoardServiceImpl객체의 getList()결과를 담아서 전달.

 

package com.ohj.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import com.ohj.service.BoardService;

import lombok.AllArgsConstructor;
import lombok.extern.log4j.Log4j;

@Controller
@Log4j
@RequestMapping("/board/*")
@AllArgsConstructor
public class BoardController {
	
	private BoardService service;
	
	@GetMapping("/list")
	public void list(Model model) {
		log.info("list");
		model.addAttribute("list",service.getList());
	}
}

 

 

테스트 코드는
웹을 개발하면서 매번 URL을 테스트하기 위해
Tomcat과 같은 WAS를 실행하는 불편한 단계를 생략할 수 있도록 코드를 작성.

이 때 필요한 클래스
- WebAppConfiguration
- WebApplicationContext

- MockMvc (가짜 예) 핸드폰 )
- MockMvcBuilders
- MockMvcRequestBuilders

 

 

package com.ohj.controller;

import org.junit.Before;
import org.junit.Test;
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 lombok.Setter;
import lombok.extern.log4j.Log4j;

public class BoardControllerTests {

}

 

클래스 선언 부에 어노테이션 추가

@WebAppConfiguration : 서블릿의 ServletContext를 이용하기 위함.

즉, 스프링에서는 WebAppConfiguration 라는 객체를 이용하기 위함이다.

 

의존성 주입을 위함 멤버(인스턴스) 변수 및 메서드 추가

 

MokMvc: 가짜 MVC

가상으로 URL과 파라미터등을 마치 브라우저에서 사용하는 것처럼 만들어서 컨트롤러를 실행 해 볼 수 있다.

 

 

 

등록처리 와 테스트

public BoardController()에 POST방식으로 처리 되는 register()추가
리턴 타입 : String
리다이렉트어튜비트 파라미터 : 등록 작업이 끝난 후, 다시 목록 화면으로 이동하기 위해 
추가적으로 새롭게 등록된 게시물의 번호를 같이 전달하기 위해서 이용.

리턴 할 떄에는 'redirect:'라는 접두어를 사용!
스프링 MVC가 내부적으로 response.sendRedirect()를 처리해주기 때문에 편리하다.

 

테스트 코드

의 post() : POST방식으로 데이터를 전달 할 수 있다.

param(): 전달해야 하는 파라미터들을 지정 할 수 있다. 마치 <input> 처럼

 

이와 같은 방식으로 코드를 작성하면 

최초 작성시에는 일이 많게 느껴지지만,

오류 매번 입력할 필요가 없기 때문에 오류 발생 및 수정하는 경우,
반복적인 테스트가 수월함

 

package com.ohj.controller;

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 lombok.Setter;
import lombok.extern.log4j.Log4j;

@RunWith(SpringJUnit4ClassRunner.class)


//Test for Controller
@ContextConfiguration({"file:src/main/webapp/WEB-INF/spring/root-context.xml", 
	"file:src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml"})
@Log4j
public class BoardControllerTests {
	
	
	// MockMvc : 가짜  MVC
	@Setter(onMethod_= {@Autowired})
	private WebApplicationContext ctx;
	private MockMvc mockMvc;
	
	//무조건 실행하는 메소드
	//@Before : import 할 때  JUnit을 이용.
	//이 어노테이션이 적용 된 메서드는 모든 테스트 전에 매번 실행 되는 매서드가 된다.
	
   @Before
   public void setup() {
      this.mockMvc = MockMvcBuilders.webAppContextSetup(ctx).build();
   }

   //MockMvcRequestBuilders 를 이용하면 마치 GET방식의 호출을 할 수 있다.
   @Test
   public void testList() throws Exception{
      log.info(mockMvc.perform(MockMvcRequestBuilders.get("/board/list")).andReturn().getModelAndView().getModelMap());
   }


}

 

 

상세보기

조회 처리와 테스트

@GetMapping : 특별한 경우가 아니라면, 조회는 GET방식으로 처리

@RequestParam : bno 값을 좀 더 명시적으로 처리하기 위함

Model 파라미터 :  화면 쪽으로 해당 게시번호의 게시물을 전달하기 위함

 

package com.ohj.controller;

import org.springframework.stereotype.Controller;
import org.springframework.test.annotation.Repeat;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.ui.Model; // 스프링은 모델이다.(모델 앤 뷰 객체)
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import com.ohj.domain.BoardVO;
import com.ohj.service.BoardService;

import lombok.AllArgsConstructor;
import lombok.extern.log4j.Log4j;

@Controller
@Log4j
@RequestMapping("/board/*")
@AllArgsConstructor
public class BoardController {
	
	private BoardService service; 
	
	@GetMapping("/list")
	public void list(Model model) {
		log.info("list");
		model.addAttribute("list", service.getList());
	}// list() END
	// 이 리스트 메소드가 호출되려면 /board/list 로 되어야 한다.
	
	//등록처리 와 테스트
	
	/*public BoardController()에 POST방식으로 처리 되는 register()추가
	리턴 타입 : String
	리다이렉트어튜비트 파라미터 : 등록 작업이 끝난 후, 다시 목록 화면으로 이동하기 위해 
	추가적으로 새롭게 등록된 게시물의 번호를 같이 전달하기 위해서 이용.
	
	리턴 할 떄에는 'redirect:'라는 접두어를 사용!
	스프링 MVC가 내부적으로 response.sendRedirect()를 처리해주기 때문에 편리하다.
	*/
	@PostMapping("register")
	public String register(BoardVO board, RedirectAttributes rttr) {
		log.info("register:"+board);
		service.register(board);
		rttr.addFlashAttribute("result",board.getBno());
		return "redirect:/board/list";
	}
	
	// Model 파라미터 : 화면 쪽으로 해당 게시번호의 게시물을 전달하기 위함
	@GetMapping("/get")
	public void get(@RequestParam("bno") Long bno, Model model) {
		log.info("/get");
	    model.addAttribute("board",service.get(bno));
		
	}
	
}//BoardController CLASS END


//   BoardControllerTests :  
//log.info(mockMvc.perform(MockMvcRequestBuilders.get("/board/list")).andReturn().getModelAndView().getModelMap());

 

package com.ohj.controller;

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 lombok.Setter;
import lombok.extern.log4j.Log4j;

@RunWith(SpringJUnit4ClassRunner.class)
//Test for Controller
@WebAppConfiguration
@ContextConfiguration({"file:src/main/webapp/WEB-INF/spring/root-context.xml", "file:src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml"})
@Log4j
public class BoardControllerTests {
	
	
	// MockMvc : 가짜  MVC
	@Setter(onMethod_= {@Autowired})
	private WebApplicationContext ctx;
	private MockMvc mockMvc;
	
	//무조건 실행하는 메소드
	//@Before : import 할 때  JUnit을 이용.
	//이 어노테이션이 적용 된 메서드는 모든 테스트 전에 매번 실행 되는 매서드가 된다.
	
   @Before
   public void setup() {
      this.mockMvc = MockMvcBuilders.webAppContextSetup(ctx).build();
   }

   //MockMvcRequestBuilders를 이용하면 마치 GET방식의 호출을 할 수 있다.
   @Test
   public void testList() throws Exception{
	   
	   //BoardController.java쪽 
      log.info(mockMvc.perform(MockMvcRequestBuilders.get("/board/list")).andReturn().getModelAndView().getModelMap());
   }
   
	@Test
	public void testRegister() throws Exception{
		String resultPage= mockMvc
				.perform(MockMvcRequestBuilders.post("/board/register")
				.param("title", "테스트 새글 제목")
				.param("content", "테스트 새글 내용")
				.param("writer", "user00"))
				.andReturn().getModelAndView().getViewName();
		log.info(resultPage);
	}
	
	
	@Test
	public void testGet() throws Exception{
		log.info(mockMvc.perform(MockMvcRequestBuilders
				.get("/board/get")
				.param("bno","2"))
				.andReturn()
				.getModelAndView().getModelMap()
				);
	}

}

 

수정 처리와 테스트

변경된 내용을 수집해서 BoardVO파라미터로 처리한 후

BoardService를 호출

 

수정 작업을 시작하는 화면의 경우 GET방식으로 접금하지만

실제 작업은 PoST 방식으로 동작하므로  @PostMapping을 이용하여 처리!

 

service.modify()는 수정 여부를 boolean으로 처리하므로

성공한 경우에만 RedirectArrtibutes에 추가

 

 

 

package com.ohj.controller;

import org.springframework.stereotype.Controller;
import org.springframework.test.annotation.Repeat;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.ui.Model; // 스프링은 모델이다.(모델 앤 뷰 객체)
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import com.ohj.domain.BoardVO;
import com.ohj.service.BoardService;

import lombok.AllArgsConstructor;
import lombok.extern.log4j.Log4j;

@Controller
@Log4j
@RequestMapping("/board/*")
@AllArgsConstructor
public class BoardController {
	
	private BoardService service; 
	
	@GetMapping("/list")
	public void list(Model model) {
		log.info("list");
		model.addAttribute("list", service.getList());
	}// list() END
	// 이 리스트 메소드가 호출되려면 /board/list 로 되어야 한다.
	
	//등록처리 와 테스트
	
	/*public BoardController()에 POST방식으로 처리 되는 register()추가
	리턴 타입 : String
	리다이렉트어튜비트 파라미터 : 등록 작업이 끝난 후, 다시 목록 화면으로 이동하기 위해 
	추가적으로 새롭게 등록된 게시물의 번호를 같이 전달하기 위해서 이용.
	
	리턴 할 떄에는 'redirect:'라는 접두어를 사용!
	스프링 MVC가 내부적으로 response.sendRedirect()를 처리해주기 때문에 편리하다.
	*/
	@PostMapping("register")
	public String register(BoardVO board, RedirectAttributes rttr) {
		log.info("register:"+board);
		service.register(board);
		rttr.addFlashAttribute("result",board.getBno());
		return "redirect:/board/list";
	}
	
	// Model 파라미터 : 화면 쪽으로 해당 게시번호의 게시물을 전달하기 위함
	@GetMapping("/get")
	public void get(@RequestParam("bno") Long bno, Model model) {
		log.info("/get");
	    model.addAttribute("board",service.get(bno));
		}
	

	@PostMapping("/modify")
	public String modify(BoardVO board, RedirectAttributes rttr) {
		log.info("modify:"+board);
		if(service.modify(board)) {
			rttr.addFlashAttribute("result","success");
		}
		return "redirect:/board/list";
	}
	
	
}//BoardController CLASS END


//   BoardControllerTests :  
//log.info(mockMvc.perform(MockMvcRequestBuilders.get("/board/list")).andReturn().getModelAndView().getModelMap());
package com.ohj.controller;

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 lombok.Setter;
import lombok.extern.log4j.Log4j;

@RunWith(SpringJUnit4ClassRunner.class)
//Test for Controller
@WebAppConfiguration
@ContextConfiguration({"file:src/main/webapp/WEB-INF/spring/root-context.xml", "file:src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml"})
@Log4j
public class BoardControllerTests {
	
	
	// MockMvc : 가짜  MVC
	@Setter(onMethod_= {@Autowired})
	private WebApplicationContext ctx;
	private MockMvc mockMvc;
	
	//무조건 실행하는 메소드
	//@Before : import 할 때  JUnit을 이용.
	//이 어노테이션이 적용 된 메서드는 모든 테스트 전에 매번 실행 되는 매서드가 된다.
	
   @Before
   public void setup() {
      this.mockMvc = MockMvcBuilders.webAppContextSetup(ctx).build();
   }

   //MockMvcRequestBuilders를 이용하면 마치 GET방식의 호출을 할 수 있다.
   @Test
   public void testList() throws Exception{
	   
	   //BoardController.java쪽 
      log.info(mockMvc.perform(MockMvcRequestBuilders.get("/board/list")).andReturn().getModelAndView().getModelMap());
   }
   
	@Test
	public void testRegister() throws Exception{
		String resultPage= mockMvc
				.perform(MockMvcRequestBuilders.post("/board/register")
				.param("title", "테스트 새글 제목")
				.param("content", "테스트 새글 내용")
				.param("writer", "user00"))
				.andReturn().getModelAndView().getViewName();
		log.info(resultPage);
	}
	
	
	@Test
	public void testGet() throws Exception{
		log.info(mockMvc.perform(MockMvcRequestBuilders
				.get("/board/get")
				.param("bno","2"))
				.andReturn()
				.getModelAndView().getModelMap()
				);
	}
	
	@Test
	public void testModify() throws Exception{ 
		String resultPage= mockMvc.perform(MockMvcRequestBuilders
				.post("/board/modify")
				.param("bno", "1")
				.param("title", "테스트 수정된 제목")
				.param("content", "테스트 수정된 내용")
				.param("writer", "user00"))
				.andReturn()
				.getModelAndView()
				.getViewName();
	}

}

 

삭제 처리와 테스트

삭제는 반드시 POST방식으로만 처리

 

 

package com.ohj.controller;

import org.springframework.stereotype.Controller;
import org.springframework.test.annotation.Repeat;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.ui.Model; // 스프링은 모델이다.(모델 앤 뷰 객체)
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import com.ohj.domain.BoardVO;
import com.ohj.service.BoardService;

import lombok.AllArgsConstructor;
import lombok.extern.log4j.Log4j;

@Controller
@Log4j
@RequestMapping("/board/*")
@AllArgsConstructor
public class BoardController {
	
	private BoardService service; 
	
	@GetMapping("/list")
	public void list(Model model) {
		log.info("list");
		model.addAttribute("list", service.getList());
	}// list() END
	// 이 리스트 메소드가 호출되려면 /board/list 로 되어야 한다.
	
	//등록처리 와 테스트
	
	/*public BoardController()에 POST방식으로 처리 되는 register()추가
	리턴 타입 : String
	리다이렉트어튜비트 파라미터 : 등록 작업이 끝난 후, 다시 목록 화면으로 이동하기 위해 
	추가적으로 새롭게 등록된 게시물의 번호를 같이 전달하기 위해서 이용.
	
	리턴 할 떄에는 'redirect:'라는 접두어를 사용!
	스프링 MVC가 내부적으로 response.sendRedirect()를 처리해주기 때문에 편리하다.
	*/
	@PostMapping("register")
	public String register(BoardVO board, RedirectAttributes rttr) {
		log.info("register:"+board);
		service.register(board);
		rttr.addFlashAttribute("result",board.getBno());
		return "redirect:/board/list";
	}
	
	// Model 파라미터 : 화면 쪽으로 해당 게시번호의 게시물을 전달하기 위함
	@GetMapping("/get")
	public void get(@RequestParam("bno") Long bno, Model model) {
		log.info("/get");
	    model.addAttribute("board",service.get(bno));
		}
	

	@PostMapping("/modify")
	public String modify(BoardVO board, RedirectAttributes rttr) {
		log.info("modify:"+board);
		if(service.modify(board)) {
			rttr.addFlashAttribute("result","success");
		}
		return "redirect:/board/list";
	}
	
	
	@PostMapping("/remove")
	public String remove(@RequestParam("bno") Long bno, RedirectAttributes rttr) {
		log.info("remove:"+bno);
		if(service.remove(bno)) {
			rttr.addFlashAttribute("result","success");
		}
		return "redirect:/board/list";
	}
	
	
}//BoardController CLASS END


//   BoardControllerTests :  
//log.info(mockMvc.perform(MockMvcRequestBuilders.get("/board/list")).andReturn().getModelAndView().getModelMap());

 

 

 

https://bactoria.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81-addAttribute-addFlashAttribute-%EC%B0%A8%EC%9D%B4%EC%A0%90-RedirectAttributes-rttr-%EB%A6%AC%EB%8B%A4%EC%9D%B4%EB%A0%89%ED%8A%B8

 

스프링 addAttribute addFlashAttribute 차이점 (RedirectAttributes rttr) / 리다이렉트

addAttribute와 addFlashAttribute의 차이점 addAttribute는 삭제를 했을 때 url 을 보자. redirect는 list까지다. 근데 page , perPageNum, searchType, keyword 가 뒤에 따라 붙었다. rttr.addAttribute 때문..

bactoria.tistory.com

 

+ Recent posts