2022_02_27 - oneso123456789/2022 GitHub Wiki
testRegister() ๋์ค bno ์ฆ ์ํ์ค๊ฐ 1์ด ์๋๋ผ 10 20 ์ฆ๊ฐํ ๋๊ฐ ์๋๊ฒ์ ํ์ธํจ
์ด ๋ฌธ์ ๋ oracle sequence ์๋ ์์น์ ์ํด ์ฌ๋ฌ๊ฐ์ ์ํ์ค ๊ฐ์ ์บ์์ ์ฌ๋ ค๋๊ณ
์์
ํ๊ธฐ ๋๋ฌธ์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ alter sequence ์ํ์ค ์ด๋ฆ nocache;
๋ฅผํด์ฃผ๋ฉด๋จ
๋๋ sqldeveloper๋ฅผ ์ด์ฉํด์ alter sequence seq_board nocache;
๋ฅผ ํด์ค
์ฐธ๊ณ ์ฌ์ดํธ :https://m.blog.naver.com/opgj123/221322082219
๋ ์ฌ์ฉํด๋ณด๊ณ ๋ ์ด๋ฐ ๋ฌธ์ ๊ฐ ์๊ธฐ๋ฉด ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ํด๊ฒฐํด๋ด์ผ๊ฒ ์
BoardController๋ com.crow.controller ํจํค์ง์ ์ ์ธํ๊ณ URL ๋ถ์๋ ๋ด์ฉ๋ค์ ๋ฐ์ํ๋ ๋ฉ์๋๋ฅผ ์ค๊ณํจ
package com.crow.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import lombok.extern.log4j.Log4j;
@Controller
@Log4j
@RequestMapping("/board/*")
public class BoardController {
}
BoardController๋ @Controller ์ด๋
ธํ
์ด์
์ ์ถ๊ฐํด์ ์คํ๋ง์ ๋น์ผ๋ก ์ธ์ํ ์ ์๊ฒ ํ๊ณ ,
@RequestMapping์ ํตํด์ '/board'๋ก ์์ํ๋ ๋ชจ๋ ์ฒ๋ฆฌ๋ฅผ BoardController๊ฐ ํ๋๋ก ์ง์ ํจ
BoardController๊ฐ ์ํ com.crow.controller ํจํค์ง๋ servlet-context.xml์ ๊ธฐ๋ณธ์ผ๋ก ์ค์ ๋์ด
์์ผ๋ฏ๋ก ๋ณ๋์ ์ค์ ์ด ํ์ํ์ง ์์
(Java ์ค์ ์ ์ด์ฉํ๋ ๊ฒฝ์ฐ์๋ @ComponentScan์ ์ด์ฉํ๋ฉด๋จ)
BoardController์์ ์ ์ฒด ๋ชฉ๋ก์ ๊ฐ์ ธ์ค๋ ์ฒ๋ฆฌ๋ฅผ ๋จผ์ ์์ฑํจ
BoardController๋ BoardService ํ์
์ ๊ฐ์ฒด์ ๊ฐ์ด ์ฐ๋ํด์ผ ํ๋ฏ๋ก ์์กด์ฑ์ ๋ํ ์ฒ๋ฆฌ๋ ๊ฐ์ด ์งํํจ
package com.crow.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.crow.service.BoardService;
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());
}
}
BoardController๋ BoardService์ ๋ํด์ ์์กด์ ์ด๋ฏ๋ก @AllArgsConstructor๋ฅผ ์ด์ฉํด์
์์ฑ์๋ฅผ ๋ง๋ค๊ณ ์๋์ผ๋ก ์ฃผ์
ํด์ค
(๋ง์ผ ์์ฑ์๋ฅผ ๋ง๋ค์ง ์์ ๊ฒฝ์ฐ์๋ @Setter(onMethod_ = { @Autowired })๋ฅผ ์ด์ฉํด์ ์ฒ๋ฆฌํจ)
- @AllArgsConstructor: ๋ชจ๋ ํ๋ ๊ฐ์ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ๋ ์์ฑ์๋ฅผ ๋ง๋ฆ
- @NoArgsConstructor: ํ๋ผ๋ฏธํฐ๊ฐ ์๋ ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ์์ฑ
- @RequiredArgsConstructor: final์ด๋ @NonNull์ธ ํ๋ ๊ฐ๋ง ํ๋ผ๋ฏธํฐ๋ก ๋ฐ๋ ์์ฑ์ ๋ง๋ฆ
list()๋ ๋์ค์ ๊ฒ์๋ฌผ์ ๋ชฉ๋ก์ ์ ๋ฌํด์ผ ํ๋ฏ๋ก Model์ ํ๋ผ๋ฏธํฐ๋ก ์ง์ ํ๊ณ ,
์ด๋ฅผ ํตํด์ BoardServiceImpl ๊ฐ์ฒด์ getList() ๊ฒฐ๊ณผ๋ฅผ ๋ด์ ์ ๋ฌํจ(addAttribute)
BoardController ํ
์คํธ๋ ์คํ๋ง์ ํ
์คํธ ๊ธฐ๋ฅ์ ํตํด์ ํ์ธํด ๋ณผ ์์์
src/test/java์ com.crow.controllerํจํค์ง์ BoardControllerTests ํด๋์ค๋ฅผ ์ ์ธํจ
์ด๋ฒ ํ
์คํธ ์ฝ๋๋ ๊ธฐ์กด๊ณผ ์ข ๋ค๋ฅด๊ฒ ์งํ๋๋๋ฐ ๊ทธ ์ด์ ๋ ์น์ ๊ฐ๋ฐํ ๋ ๋งค๋ฒ URL์ ํ
์คํธ ํ๊ธฐ ์ํด์
Tomcat๊ณผ ๊ฐ์ WAS๋ฅผ ์คํํ๋ ๋ถํธํ ๋จ๊ณ๋ฅผ ์๋ตํ๊ธฐ ์ํด์์
์คํ๋ง์ ํ
์คํธ ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ ๊ฐ๋ฐ ๋น์์ Tomcat(WAS)์ ์คํํ์ง ์๊ณ ๋ ์คํ๋ง๊ณผ ์น URL์ ํ
์คํธ๊ฐ๋ฅ
WAS๋ฅผ ์คํํ์ง ์๊ธฐ ์ํด์๋ ์ฝ๊ฐ์ ์ถ๊ฐ์ ์ธ ์ฝ๋๊ฐ ํ์ํ์ง๋ง ๋ฐ๋ณต์ ์ผ๋ก ์๋ฒ๋ฅผ ์คํํ๊ณ ,
ํ๋ฉด์ ์
๋ ฅํ๊ณ , ์ค๋ฅ๋ฅผ ์์ ํ๋ ๋จ๊ณ๋ฅผ ์ค์ฌ์ค ์ ์๊ธฐ ๋๋ฌธ์ Controller๋ฅผ ํ
์คํธ ํ ๋๋
ํ๋ฒ์ฉ ๊ณ ๋ คํด ๋ณผ ๋งํ ๋ฐฉ๋ฒ์
package com.crow.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 {
@Setter(onMethod_ = { @Autowired })
private WebApplicationContext ctx;
private MockMvc mockMvc;
@Before
public void setup() {
this.mockMvc = MockMvcBuilders.webAppContextSetup(ctx).build();
}
@Test
public void testList() throws Exception {
log.info(
mockMvc.perform(MockMvcRequestBuilders.get("/board/list"))
.andReturn()
.getModelAndView()
.getModelMap());
}
}
ํ
์คํธ ํด๋์ค์ ์ ์ธ๋ถ์๋ @WebAppConfiguration ์ด๋
ธํ
์ด์
์ ์ ์ฉํจ
@WebAppConfiguration์ Servley์ ServletContext๋ฅผ ์ด์ฉํ๊ธฐ ์ํด์ ์ธ๋ฐ,
์คํ๋ง์์๋ WebApplicationContext๋ผ๋ ์กด์ฌ๋ฅผ ์ด์ฉํ๊ธฐ ์ํด์์
@Before ์ด๋
ธํ
์ด์
์ด ์ ์ฉ๋ setup()์์๋ import ํ ๋ JUnit์ ์ด์ฉํด์ผํจ
@Before๊ฐ ์ ์ฉ๋ ๋ฉ์๋๋ ๋ชจ๋ ํ
์คํธ ์ ์ ๋งค๋ฒ ์คํ๋๋ ๋ฉ์๋์
MockMVC๋ ๋ง ๊ทธ๋๋ก '๊ฐ์ง mvc'๋ผ๊ณ ์๊ฐํ๋ฉด ๋จ
๊ฐ์ง๋ก URL๊ณผ ํ๋ผ๋ฏธํฐ ๋ฑ์ ๋ธ๋ผ์ฐ์ ์์ ์ฌ์ฉํ๋ ๊ฒ์ฒ๋ผ ๋ง๋ค์ด์ Controller๋ฅผ ์คํํด ๋ณผ ์ ์์
testList()๋ MockMvcRequestBuilders๋ผ๋ ์กด์ฌ๋ฅผ ์ด์ฉํด์ GET ๋ฐฉ์์์ ํธ์ถ์ ํจ
์ดํ์๋ BoardController์ getList()์์ ๋ฐํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ด์ฉํด์ Model์ ์ด๋ค ๋ฐ์ดํฐ๋ค์ด
๋ด๊ฒจ ์๋์ง ํ์ธํจ
Tomcat์ ํตํด์ ์คํ๋๋ ๋ฐฉ์์ด ์๋๋ฏ๋ก ๊ธฐ์กด์ ํ
์คํธ ์ฝ๋๋ฅผ ์คํํ๋ ๊ฒ๊ณผ ๋์ผํ๊ฒ ์คํํจ
TestList()๋ฅผ ์คํํ ๊ฒฐ๊ณผ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋ ๊ฒ์๋ฌผ๋ค์ ๋ณผ ์ ์์
BoardController์ POST ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌ๋๋ register()๋ฅผ ์์ฑํ๋ฉด ๋ค์๊ณผ ๊ฐ์
@PostMapping("/register")
public String register(BoardVO board, RedirectAttributes rttr) {
log.info("controller register: " + board);
service.register(board);
rttr.addFlashAttribute("result", board.getBno());
return "redirect:/board/list";
}
register() ๋ฉ์๋๋ ์กฐ๊ธ ๋ค๋ฅด๊ฒ string์ ๋ฆฌํด ํ์
์ผ๋ก ์ง์ ํ๊ณ , RedirectAttributes๋ฅผ ์ด์ฉํจ
๋ฆฌํด ์์๋ 'redirect:' ์ ๋์ด๋ฅผ ์ฌ์ฉํ๋๋ฐ ์ด๋ฅผ ์ด์ฉํ๋ฉด ์คํ๋ง MVC๊ฐ ๋ด๋ถ์ ์ผ๋ก
response.sendRedirect๋ฅผ ์ฒ๋ฆฌํด ์ฃผ๊ธฐ ๋๋ฌธ์ ํธ๋ฆฌํจ
ํ ์คํธ ์ฝ๋๋ ์๋์ ๊ฐ์ด ์์ฑํจ
@Test
public void testRegister() throws Exception{
String resultPage = mockMvc.perform(MockMvcRequestBuilders.post("/board/register")
.param("title", "BoardControllerTests ์ ๋ชฉ")
.param("content","BoardControllerTests ๋ด์ฉ" )
.param("writer", "BoardControllerTests ์์ฑ์")
).andReturn().getModelAndView().getViewName();
log.info(resultPage);
}
ํ
์คํธ ํ ๋ MockMvcRequestBuilder์ post()๋ฅผ ์ด์ฉํ๋ฉด POST ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ์ ์๊ณ ,
Param()์ ์ด์ฉํด์ ์ ๋ฌํด์ผ ํ๋ ํ๋ผ๋ฏธํฐ๋ค์ ์ง์ ํ ์ ์์
( ํ๊ทธ์ ์ ์ฌํ ์ญํ )
์ด๋ฌํ ๋ฐฉ์์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ์ต์ด ์์ฑ ์์๋ ์ผ์ด ๋ง๋ค๊ณ ๋๊ปด์ง์ง๋ง ๋งค๋ฒ ์
๋ ฅํ ํ์๊ฐ
์๊ธฐ ๋๋ฌธ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ฑฐ๋ ์์ ํ๋ ๊ฒฝ์ฐ ๋ฐ๋ณต์ ์ธ ํ
์คํธ๊ฐ ์์ํด์ง
ํ
์คํธ ์ฝ๋ ์คํ ๋ก๊ทธ๋ฅผ ๋ณด๋ฉด ์๋จ์ BoardVO๊ฐ์ฒด๋ก ์ฌ๋ฐ๋ฅด๊ฒ ๋ฐ์ดํฐ๊ฐ
๋ฐ์ธ๋ฉ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ ์๊ณ , ์ค๊ฐ์๋ SQL์ ์คํ๊ฒฐ๊ณผ๊ฐ ๋ณด์
๋ง์ง๋ง์๋ ์ต์ข
๋ฐํ ๋ฌธ์์ด์ ํ์ธํ ์ ์์
BoardController redirect:/board/list
String resultPage = mockMvc.perform(MockMvcRequestBuilders.post("/board/register")๋ฅผ post("/board/regiser")๋ก ๋งคํ์ ์๋ชป ์์ฑํจ ์ด๋ฐ ide ๋๋ฒ๊ฑฐ์ ์กํ์ง ์๋ ๊ตฌ๋ฌธ ์ค๋ฅ๋ฅผ ์กฐ์ฌํด์ผํจ