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());
스프링 addAttribute addFlashAttribute 차이점 (RedirectAttributes rttr) / 리다이렉트
addAttribute와 addFlashAttribute의 차이점 addAttribute는 삭제를 했을 때 url 을 보자. redirect는 list까지다. 근데 page , perPageNum, searchType, keyword 가 뒤에 따라 붙었다. rttr.addAttribute 때문..
bactoria.tistory.com
':: IT > Spring' 카테고리의 다른 글
AOP (0) | 2020.05.20 |
---|---|
[스프링프레임워크]VO클래스 작성, 수정,삭제 구현 (0) | 2020.05.13 |
[스프링프레임워크]오라클 테이블 생성과 Dummy 데이터 생성, (0) | 2020.05.12 |
[스프링프레임워크] 스프링프레임워크 폴더 생성, spring MVC 설명, DI, IoC, 스프링 MVC 프로젝트 기초 설정, (0) | 2020.05.11 |