2022_02_26 - oneso123456789/2022 GitHub Wiki

other

9.1.1 ์Šคํ”„๋ง์˜ ์„œ๋น„์Šค ๊ฐ์ฒด ์„ค์ •(root-context.xml)

๋น„์ฆˆ๋‹ˆ์Šค ๊ณ„์ธต์˜ ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ตฌํ˜„ ํด๋ž˜์Šค๊ฐ€ ์ž‘์„ฑ๋˜์—ˆ๋‹ค๋ฉด,
์ด๋ฅผ ์Šคํ”„๋ง์˜ ๋นˆ์œผ๋กœ ์ธ์‹ํ•˜๊ธฐ ์œ„ํ•ด์„œ roo-context.xml์—
@Service์–ด๋…ธํ…Œ์ด์…˜์ด ์žˆ๋Š” com.crow.service ํŒจํ‚ค์ง€๋ฅผ ์Šค์บ”
ํ•˜๋„๋ก ์ถ”๊ฐ€ํ•ด์•ผํ•จ

ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ์‹œ ๋งŒ๋“ค์–ด์ง„ root-context.xml์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค
ํƒญ์—์„œ context ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•จ

๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ํ•ด๋‹น ์ด๋ฆ„์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ํƒœ๊ทธ๋“ค์„ ํ™œ์šฉํ• 
์ˆ˜ ์žˆ์Œ

root-context.xml์˜ ์ผ๋ถ€

    <context:component-scan
        base-package="com.crow.service" />

9.2 ๋น„์ฆˆ๋‹ˆ์Šค ๊ณ„์ธต์˜ ๊ตฌํ˜„๊ณผ ํ…Œ์ŠคํŠธ

BoardMapper์™€ BoardService, BoardServiceImpl์— ๋Œ€ํ•œ
๊ตฌ์กฐ์„ค์ •์ด ์™„๋ฃŒ๋˜์—ˆ์œผ๋ฏ€๋กœ 'src/test/java' ๋ฐ‘์—
com.crow.service.BoardServiceTests ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•ด์„œ ์ง„ํ–‰ํ•จ

ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์˜ BoardServiceTests ํด๋ž˜์Šค

package com.crow.service;

import static org.junit.Assert.assertNotNull;

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

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class BoardServiceTests {
    
    @Setter(onMethod_ = {@Autowired})
    private BoardService service;
    
    @Test
    public void testExist() {
        
        log.info(service);
        assertNotNull(service);
        log.info("์—ฌ๊ธฐ๊ฐ€ ๋กœ๊ทธ ๋");
    }
    
}

BoardServiceTests์˜ ์ฒซ ํ…Œ์ŠคํŠธ๋Š” BoardService ๊ฐ์ฒด๊ฐ€ ์ œ๋Œ€๋กœ ์ฃผ์ž…์ด ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธํ•˜๋Š” ์ž‘์—…์œผ๋กœ ์‹œ์ž‘ํ•จ
์ •์ƒ์ ์œผ๋กœ BoardService ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  BoardMapper๊ฐ€ ์ฃผ์ž…๋˜์—ˆ๋‹ค๋ฉด
์•„๋ž˜์™€ ๊ฐ™์ด Service ๊ฐ์ฒด์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ จ ๋กœ๊ทธ๊ฐ€ ์ถœ๋ ฅ๋จ

9.2.1 ๋“ฑ๋ก ์ž‘์—…์˜ ๊ตฌํ˜„๊ณผ ํ…Œ์ŠคํŠธ

๋“ฑ๋ก ์ž‘์—…์€ BoardServiceImpl์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ €๋‚ ๋˜๋Š” BoardVO ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ
BoardMapper๋ฅผ ํ†ตํ•ด์„œ ์ฒ˜๋ฆฌํ•จ
๊ตฌํ˜„๋˜๋Š” ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Œ

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

    @Override
    public void register(BoardVO board) {
        // TODO Auto-generated method stub
        
        log.info("register......" + board);
        
        mapper.insertSelectKey(board);

    }

BoardService๋Š” void ํƒ€์ž…์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ์œผ๋ฏ€๋กœ mapper.insertSelectKey()
์˜ ๋ฐ˜ํ™˜๊ฐ’์ธ int๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์žˆ์ง€๋งŒ, ํ•„์š”ํ•˜๋‹ค๋ฉด ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋‚˜ void
๋Œ€์‹ ์— int ํƒ€์ž…์„ ์ด์šฉํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Œ

mapper์˜ insertSelectKey()๋ฅผ ์ด์šฉํ•ด์„œ ๋‚˜์ค‘์— ์ƒ์„ฑ๋œ ๊ฒŒ์‹œ๋ฌผ์˜ ๋ฒˆํ˜ธ๋ฅผ
ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ž‘์„ฑํ•จ ์ด์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•จ

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

    @Test
    public void testRegister() {

        BoardVO board = new BoardVO();
        board.setTitle("์„œ๋น„์Šค ํ…Œ์ŠคํŠธ ์ž‘์„ฑ์ œ๋ชฉ");
        board.setContent("์„œ๋น„์Šค ํ…Œ์ŠคํŠธ ์ž‘์„ฑ๋‚ด์šฉ");
        board.setWriter("์„œ๋น„์Šค ํ…Œ์ŠคํŠธ ์ž‘์„ฑ์ž");

        service.register(board);

        log.info("์ƒ์„ฑ๋œ ๊ฒŒ์‹œ๋ฌผ์˜ ๋ฒˆํ˜ธ: " + board.getBno());
    }

testRegister()์˜ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ์„ฑ๋œ ๊ฒŒ์‹œ๋ฌผ์˜ ๋ฒˆํ˜ธ๋ฅผ
ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ.

9.2.2 ๋ชฉ๋ก(๋ฆฌ์ŠคํŠธ) ์ž‘์—…์˜ ๊ตฌํ˜„๊ณผ ํ…Œ์ŠคํŠธ

BoardServiceImpl ํด๋ž˜์Šค์—์„œ ํ˜„์žฌ ํ…Œ์ด๋ธ”์— ์ €์žฅ๋œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š”
getList()๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌํ˜„๋จ

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

    @Override
    public List<BoardVO> getList() {
        // TODO Auto-generated method stub
        
        log.info("getList......");
        
        return mapper.getList();
    }

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

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

    @Test
    public void testGetList() {

        service.getList().forEach(board -> log.info(board));
    }

ํ…Œ์ŠคํŠธ์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋กœ ๋“ฑ๋ก ์ž‘์—…์„ ํ…Œ์ŠคํŠธํ•  ๋•Œ ์ถ”๊ฐ€๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ
๋‚˜์˜ค๋Š”์ง€ ํ™•์ธ๋ฐ”๋žŒ

9.2.3 ์กฐํšŒ ์ž‘์—…์˜ ๊ตฌํ˜„๊ณผ ํ…Œ์ŠคํŠธ

์กฐํšŒ๋Š” ๊ฒŒ์‹œ๋ฌผ์˜ ๋ฒˆํ˜ธ๊ฐ€ ํŒŒ๋ผ๋ฏธํ„ฐ์ด๊ณ  BoardVO์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฆฌํ„ด๋จ

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

    @Override
    public BoardVO get(Long bno) {
        // TODO Auto-generated method stub

        log.info("get......" + bno);

        return mapper.read(bno);
    }

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

    @Test
    public void testGet() {

        log.info(service.get(1L));
    }

9.2.4 ์‚ญ์ œ/์ˆ˜์ • ๊ตฌํ˜„๊ณผ ํ…Œ์ŠคํŠธ

์‚ญ์ œ/์ˆ˜์ •์€ ๋ฉ”์„œ๋“œ์˜ ๋ฆฌํ„ด ํƒ€์ž…์„ void๋กœ ์„ค๊ณ„ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์—„๊ฒฉํ•˜๊ฒŒ
์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ Boolean ํƒ€์ž…์œผ๋กœ ์ฒ˜๋ฆฌํ•จ

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

    @Override
    public boolean modify(BoardVO board) {
        // TODO Auto-generated method stub
        log.info("modify......" + board);

        return mapper.update(board) == 1;
    }

    @Override
    public boolean remove(Long bno) {
        // TODO Auto-generated method stub

        log.info("remove......" + bno);

        return mapper.delete(bno) == 1;
    }

์ •์ƒ์ ์œผ๋กœ ์ˆ˜์ •๊ณผ ์‚ญ์ œ๊ฐ€ ์ด๋ฃจ์–ด์ง€๋ฉด 1์ด๋ผ๋Š” ๊ฐ’์ด ๋ฐ˜ํ™˜๋˜๊ธฐ ๋•Œ๋ฌธ์—
'==' ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•ด์„œ true/false๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ

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

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

    @Test
    public void testDelete() {
        
        // ๊ฒŒ์‹œ๋ฌผ ๋ฒˆํ˜ธ์˜ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๊ณ  ํ…Œ์ŠคํŠธ ํ•  ๊ฒƒ
        log.info("REMOVE RESULT: " + service.remove(2L));
        
    }
    
    @Test
    public void testUpdate() {
        
        BoardVO board = service.get(1L);
        
        // ์ž…๋ ฅํ•œ ๋ฒˆํ˜ธ์˜ ๋‚ด์šฉ์ด ์กด์žฌ ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฆฌํ„ด์„ ์‹œํ‚ด
        if(board == null) {
            return ;
        }
        
        board.setTitle("์„œ๋น„์Šค ํ…Œ์ŠคํŠธ์ค‘ ์ œ๋ชฉ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค");
        log.info("MODIFY RESULT: " + service.modify(board));
    }

testDelete()์˜ ๊ฒฝ์šฐ์—๋Š” ํ•ด๋‹น ๊ฒŒ์‹œ๋ฌผ์ด ์กด์žฌํ•  ๋•Œ true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์„
ํ™•์ธํ• ์ˆ˜ ์žˆ๊ณ ,
testUpdate()์˜ ๊ฒฝ์šฐ์—๋Š” ํŠน์ •ํ•œ ๊ฒŒ์‹œ๋ฌผ์„ ๋จผ์ € ์กฐํšŒํ•˜๊ณ , title ๊ฐ’์„ ์ˆ˜์ •ํ•œ ํ›„ ์ด๋ฅผ ์—…๋ฐ์ดํŠธํ•จ

Chapter 10 ํ”„๋ ˆ์  ํ…Œ์ด์…˜(์›น)๊ณ„์ธต์˜ CRUD ๊ตฌํ˜„

๋น„์ฆˆ๋‹ˆ์Šค ๊ณ„์ธต์˜ ๊ตฌํ˜„๊นŒ์ง€ ๋ชจ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ ์ง„ํ–‰๋˜์—ˆ๋‹ค๋ฉด ์ด์ œ ๋‚จ์€ ์ž‘์—…์€
ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ๊ณ„์ธต์ธ ์›น ๊ตฌํ˜„์ž„
์›น์€ ์ด์ „ PART 2์—์„œ ์‹ค์Šตํ•œ ๋‚ด์šฉ์„ ๊ธฐ์ค€์œผ๋กœ ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์— ๋ฐ˜์˜ํ•ด์•ผํ•จ

10.1 Controller์˜ ์ž‘์„ฑ

์Šคํ”„๋ง MVC์˜ Controller๋Š” ํ•˜๋‚˜์˜ ํด๋ž˜์Šค ๋‚ด์—์„œ ์—ฌ๋Ÿฌ ๋ฉ”์„œ๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ ,
@RequestMapping๋“ฑ์„ ์ด์šฉํ•ด์„œ URL์„ ๋ถ„๊ธฐํ•˜๋Š” ๊ตฌ์กฐ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—
ํ•˜๋‚˜์˜ ํด๋ž˜์Šค์—์„œ ํ•„์š”ํ•œ ๋งŒํผ ๋ฉ”์„œ๋“œ์˜ ๋ถ„๊ธฐ๋ฅผ ์ด์šฉํ•˜๋Š” ๊ตฌ์กฐ๋กœ ์ž‘์„ฑํ•จ

๊ณผ๊ฑฐ์—๋Š” ์ด ๋‹จ๊ณ„์—์„œ Tomcat(WAS)์„ ์‹คํ–‰ํ•˜๊ณ  ์›น ํ™”๋ฉด์„ ๋งŒ๋“ค์–ด์„œ ๊ฒฐ๊ณผ๋ฅผ
ํ™•์ธํ•˜๋Š” ๋ฐฉ์‹์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด ์™”์Œ
์ด ๋ฐฉ์‹์€ ์‹œ๊ฐ„๋„ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ฑฐ๋‹ˆ์™€ ํ…Œ์ŠคํŠธ๋ฅผ ์ž๋™ํ™” ํ•˜๊ธฐ์— ์–ด๋ ค์›€์ด ๋งŽ์Œ

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

BoardController์˜ ๋ถ„์„

์ž‘์„ฑํ•˜๊ธฐ ์ „์—๋Š” ๋ฐ˜๋“œ์‹œ ํ˜„์žฌ ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด
ํ…Œ์ด๋ธ”๋กœ ์ •๋ฆฌํ•œ ํ›„ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Œ BoardController๋ถ„์„
ํ…Œ์ด๋ธ”์—์„œ From ํ•ญ๋ชฉ์€ URL์„ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ณ„๋„์˜ ์ž…๋ ฅํ™”๋ฉด์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•จ
์ด์— ๋Œ€ํ•œ ์„ค๊ณ„๋Š” ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•˜๋Š” ๋‹จ๊ณ„์—์„œ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Œ

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