2022_02_27 - oneso123456789/2022 GitHub Wiki

other

testRegister() ๋„์ค‘ bno ์ฆ‰ ์‹œํ€€์Šค๊ฐ€ 1์ด ์•„๋‹ˆ๋ผ 10 20 ์ฆ๊ฐ€ํ• ๋•Œ๊ฐ€ ์žˆ๋Š”๊ฒƒ์„ ํ™•์ธํ•จ
์ด ๋ฌธ์ œ๋Š” oracle sequence ์†๋„ ์ƒ์Šน์„ ์œ„ํ•ด ์—ฌ๋Ÿฌ๊ฐœ์˜ ์‹œํ€€์Šค ๊ฐ’์„ ์บ์‹œ์— ์˜ฌ๋ ค๋†“๊ณ 
์ž‘์—…ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž„ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ alter sequence ์‹œํ€€์Šค ์ด๋ฆ„ nocache; ๋ฅผํ•ด์ฃผ๋ฉด๋จ
๋‚˜๋Š” sqldeveloper๋ฅผ ์ด์šฉํ•ด์„œ alter sequence seq_board nocache;๋ฅผ ํ•ด์คŒ
์ฐธ๊ณ  ์‚ฌ์ดํŠธ :https://m.blog.naver.com/opgj123/221322082219
๋” ์‚ฌ์šฉํ•ด๋ณด๊ณ  ๋˜ ์ด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋ฉด ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐํ•ด๋ด์•ผ๊ฒ ์Œ

10.2 BoardController์˜ ์ž‘์„ฑ

BoardController๋Š” com.crow.controller ํŒจํ‚ค์ง€์— ์„ ์–ธํ•˜๊ณ  URL ๋ถ„์„๋œ ๋‚ด์šฉ๋“ค์„ ๋ฐ˜์˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์„ค๊ณ„ํ•จ

com.crow.controller.BoardController ํด๋ž˜์Šค

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์„ ์ด์šฉํ•˜๋ฉด๋จ)

10.2.1 ๋ชฉ๋ก์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ์™€ ํ…Œ์ŠคํŠธ

BoardController์—์„œ ์ „์ฒด ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ค๋Š” ์ฒ˜๋ฆฌ๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•จ
BoardController๋Š” BoardService ํƒ€์ž…์˜ ๊ฐ์ฒด์™€ ๊ฐ™์ด ์—ฐ๋™ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์˜์กด์„ฑ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋„ ๊ฐ™์ด ์ง„ํ–‰ํ•จ

com.crow.controller.BoardController ํด๋ž˜์Šค

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 ํด๋ž˜์Šค๋ฅผ ์„ ์–ธํ•จ

WAS ์—†์ด ์ฝ”๋“œ ํ…Œ์ŠคํŠธ

์ด๋ฒˆ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ๊ธฐ์กด๊ณผ ์ข€ ๋‹ค๋ฅด๊ฒŒ ์ง„ํ–‰๋˜๋Š”๋ฐ ๊ทธ ์ด์œ ๋Š” ์›น์„ ๊ฐœ๋ฐœํ•  ๋•Œ ๋งค๋ฒˆ URL์„ ํ…Œ์ŠคํŠธ ํ•˜๊ธฐ ์œ„ํ•ด์„œ
Tomcat๊ณผ ๊ฐ™์€ WAS๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ถˆํŽธํ•œ ๋‹จ๊ณ„๋ฅผ ์ƒ๋žตํ•˜๊ธฐ ์œ„ํ•ด์„œ์ž„
์Šคํ”„๋ง์˜ ํ…Œ์ŠคํŠธ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ ๋‹น์‹œ์— Tomcat(WAS)์„ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ ๋„ ์Šคํ”„๋ง๊ณผ ์›น URL์„ ํ…Œ์ŠคํŠธ๊ฐ€๋Šฅ

WAS๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•ฝ๊ฐ„์˜ ์ถ”๊ฐ€์ ์ธ ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ ๋ฐ˜๋ณต์ ์œผ๋กœ ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜๊ณ ,
ํ™”๋ฉด์— ์ž…๋ ฅํ•˜๊ณ , ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋‹จ๊ณ„๋ฅผ ์ค„์—ฌ์ค„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Controller๋ฅผ ํ…Œ์ŠคํŠธ ํ•  ๋•Œ๋Š”
ํ•œ๋ฒˆ์”ฉ ๊ณ ๋ คํ•ด ๋ณผ ๋งŒํ•œ ๋ฐฉ๋ฒ•์ž„

src/test/java ๋ฐ‘์˜ com.crow.controller.BoardControllerTests ํด๋ž˜์Šค

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()๋ฅผ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋œ ๊ฒŒ์‹œ๋ฌผ๋“ค์„ ๋ณผ ์ˆ˜ ์žˆ์Œ

10.2.2 ๋“ฑ๋ก์ฒ˜๋ฆฌ์™€ ํ…Œ์ŠคํŠธ

BoardController์— POST ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋Š” register()๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Œ

BoardController ํด๋ž˜์Šค์˜ ์ผ๋ถ€

    @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๋ฅผ ์ฒ˜๋ฆฌํ•ด ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ํŽธ๋ฆฌํ•จ

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•จ

com.crow.controller.BoardControllerTests ํด๋ž˜์Šค์˜ ์ผ๋ถ€

    @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

testRegister() ์ž‘์„ฑ์ค‘ ์˜ค๋ฅ˜

String resultPage = mockMvc.perform(MockMvcRequestBuilders.post("/board/register")๋ฅผ post("/board/regiser")๋กœ ๋งคํ•‘์„ ์ž˜๋ชป ์ž‘์„ฑํ•จ ์ด๋Ÿฐ ide ๋””๋ฒ„๊ฑฐ์— ์žกํžˆ์ง€ ์•Š๋Š” ๊ตฌ๋ฌธ ์˜ค๋ฅ˜๋ฅผ ์กฐ์‹ฌํ•ด์•ผํ•จ

10.2.3 ์กฐํšŒ ์ฒ˜๋ฆฌ์™€ ํ…Œ์ŠคํŠธ

โš ๏ธ **GitHub.com Fallback** โš ๏ธ