๐Ÿ”ฅ #11 ๊ธ€์“ฐ๊ธฐ ๊ธฐ๋Šฅ

myeonjiยท2022๋…„ 2์›” 21์ผ
0

๊ธ€์“ฐ๊ธฐ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด saveForm.jsp ๋ผ๋Š” ๊ธ€์“ฐ๊ธฐ ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.


๋นจ๊ฐ„์ƒ‰ ์—๋Ÿฌ

**์ƒ๋Œ€๊ฒฝ๋กœ** : 'ํ˜„์žฌ ์œ„์น˜ํ•œ ๊ณณ์„ ๊ธฐ์ค€'์œผ๋กœ ํ•ด์„œ '๊ทธ๊ณณ์˜ ์œ„์น˜'

- `/` : ๋ฃจํŠธ -> ๊ฐ€์žฅ ์ตœ์ƒ์˜ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™ํ•œ๋‹ค. (Web root)
- `./` : ํ˜„์žฌ ์œ„์น˜ -> ํŒŒ์ผ์ด ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
- `../` : ํ˜„์žฌ ์œ„์น˜์˜ ์ƒ๋‹จ ํด๋” -> ์ƒ์œ„ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™ํ•œ๋‹ค.

์ด๋ ‡๊ฒŒ ๋ณ€๊ฒฝํ•ด์ค€๋‹ค!

< BoardController >

@Controller
public class BoardController {

    @GetMapping({"", "/"})
    public String index() { // ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋กœ๊ทธ์ธ ๋œ ์„ธ์…˜์„ ์ฐพ๋Š” ๋ฐฉ์‹ : @AuthenticationPrincipal PrincipalDetail principal
        // /WEB-INF/views/index.jsp
        return "index";
    }

    @GetMapping("/board/saveForm")
    public String saveForm() {
        return "board/saveForm";
    }
}

BoardController์—์„œ ์ฃผ์†Œ ๋งคํ•‘๋„ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.


๋กœ๊ทธ์ธ ํ•œ ํ›„ ์ธ์ฆ์ด ๋œ ์ƒํƒœ์—์„œ ๋ฉ”์ธํ™”๋ฉด์„ ๋ณด๋ฉด ์™ผ์ชฝ ์ƒ๋‹จ์— ๊ธ€์“ฐ๊ธฐ๊ฐ€ ๋‚˜์˜จ๋‹ค.

๊ธ€์“ฐ๊ธฐ์—๋Š” /board/saveForm ์ฃผ์†Œ๊ฐ€ ๋งคํ•‘๋˜์–ด ์žˆ๋‹ค. (index.jsp)

< BoardController >

@Controller
public class BoardController {

    @GetMapping({"", "/"})
    public String index() { // ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋กœ๊ทธ์ธ ๋œ ์„ธ์…˜์„ ์ฐพ๋Š” ๋ฐฉ์‹ : @AuthenticationPrincipal PrincipalDetail principal
        // /WEB-INF/views/index.jsp
        return "index";
    }

    @GetMapping("/board/saveForm")
    public String saveForm() {
        return "board/saveForm";
    }
}

๋”ฐ๋ผ์„œ /board/saveForm ์ฃผ์†Œ๋ฅผ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ฐพ์•„ saveForm ์ด๋ผ๋Š” ๊ธ€์“ฐ๊ธฐ ํŽ˜์ด์ง€(jsp)๋ฅผ ๋ฆฌํ„ดํ•ด์ค€๋‹ค.

< saveForm.jsp >

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>

<%@ include file="../layout/header.jsp"%>

<div class="container">

    <form>

        <div class="form-group">
            <label for="title">Title</label>
            <input type="text" class="form-control" placeholder="Enter title" id="title">
        </div>
        <div class="form-group">
            <label for="content">Content</label>
            <textarea class="form-control summernote" rows="5" id="content"></textarea>
        </div>

    </form>
    <button id="btn-save" class="btn btn-primary">๊ธ€์“ฐ๊ธฐ์™„๋ฃŒ</button>

</div>

<script>
    $('.summernote').summernote({
        tabsize: 2,
        height: 300
    });
</script>

<script src="/js/board.js"></script>
<%@ include file="../layout/footer.jsp"%>

summernote์—์„œ ์งœ์ง‘๊ธฐ๋กœ ๊ฐ€์ ธ๋‹ค๊ฐ€ ๋งŒ๋“ค์—ˆ๋‹ค!

๊ธ€์“ฐ๊ธฐ ํŽ˜์ด์ง€์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ œ๋ชฉ(title)๊ณผ ๋‚ด์šฉ(content)๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ๊ธ€์“ฐ๊ธฐ์™„๋ฃŒ ๋ฒ„ํŠผ(id = "btn-save")์„ ๋ˆ„๋ฅด๋ฉด board.js๊ฐ€ ์ž‘๋™ํ•œ๋‹ค.

< board.js >

let index = {
    init: function () {
        $("#btn-save").on("click", ()=>{
            this.save();
        });
    },

    save: function () {
        let data = {
            title: $("#title").val(),
            content: $("#content").val()
        };

        $.ajax({
            type: "POST",
            url: "/api/board",
            data: JSON.stringify(data),
            contentType: "application/json; charset=utf-8",
            dataType: "json"
        }).done(function (resp) {
            // ๊ฒฐ๊ณผ๊ฐ€ ์ •์ƒ์ด๋ฉด done ์‹คํ–‰
            alert("๊ธ€์ž‘์„ฑ์ด ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");
            location.href = "/";
        }).fail(function (error) {
            // ์‹คํŒจํ•˜๋ฉด fail ์‹คํ–‰
            alert("ํšŒ์›๊ฐ€์ž…์ด ์‹คํŒจํ•˜์˜€์Šต๋‹ˆ๋‹ค.");
            alert(JSON.stringify(error));
        });
    },
}


index.init();

saveForm์—์„œ ๊ฐ€์ ธ์˜จ title๊ณผ content๋ฅผ /api/board ์ฃผ์†Œ์— json ๋ฐ์ดํ„ฐ ํƒ€์ž…์œผ๋กœ ๋ณด๋‚ธ๋‹ค.

< BoardApiController >

// Data๋งŒ ๋ฆฌํ„ด
@RestController
public class BoardApiController {

    @Autowired
    private BoardService boardService;

    @PostMapping("/api/board")
    public ResponseDto<Integer> save(@RequestBody Board board, @AuthenticationPrincipal PrincipalDetail principal) {
        boardService.๊ธ€์“ฐ๊ธฐ(board, principal.getUser());
        return new ResponseDto<Integer>(HttpStatus.OK.value(), 1);
    }
}

/api/board ์ฃผ์†Œ๊ฐ€ ๋งคํ•‘๋˜์–ด์žˆ๋Š” ๋ฉ”์†Œ๋“œ๋กœ ์™”๋‹ค.
์—ฌ๊ธฐ์„œ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์€ board์—๋Š” title๊ณผ content๊ฐ€ ๋“ค์–ด์žˆ์„ ๊ฒƒ์ด๋‹ค.
ํ•˜์ง€๋งŒ board ํ…Œ์ด๋ธ”์—๋Š” user์˜ id๋„ ํ•„์š”ํ•˜๋ฏ€๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜์— @AuthenticationPrincipal PrincipalDetail principal ๋„ ์ถ”๊ฐ€ํ•œ๋‹ค.
์ด๊ฒƒ์€ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋กœ๊ทธ์ธ ๋œ ์„ธ์…˜์„ ์ฐพ๋Š” ๋ฐฉ์‹์ด๋‹ค.

board์™€ principal์•ˆ์— ๋“ค์–ด์žˆ๋Š” User๋ฅผ boardService์˜ ๊ธ€์“ฐ๊ธฐ ํ•จ์ˆ˜๋กœ ๋„˜๊ธด๋‹ค.

< BoardService >

@Service // ์Šคํ”„๋ง์ด ์ปดํฌ๋„ŒํŠธ ์Šค์บ”์„ ํ†ตํ•ด์„œ Bean์— ๋“ฑ๋ก์„ ํ•ด์คŒ. (IoC)
public class BoardService {

    @Autowired
    private BoardRepository boardRepository;

    @Transactional // ์ „์ฒด๊ฐ€ ์„ฑ๊ณตํ•ด์•ผ commit, ์‹คํŒจํ•˜๋ฉด rollback
    public void ๊ธ€์“ฐ๊ธฐ(Board board, User user) { // title, content
        board.setCount(0);
        board.setUser(user);
        boardRepository.save(board);
    }
}

Count๋Š” ์กฐํšŒ์ˆ˜์ธ๋ฐ ๊ธฐ๋ณธ์„ 0์œผ๋กœ set ํ•œ๋‹ค.
User์—๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์€ user์„ setํ•˜๊ณ ,
๋ ˆํผ์ง€ํ† ๋ฆฌ์— saveํ•œ๋‹ค.

์ด๋ ‡๊ฒŒ DB์— save๊นŒ์ง€ ์ •์ƒ์ ์œผ๋กœ ์™„๋ฃŒ๋˜๋ฉด ๋‹ค์‹œ BoardApiController๋กœ ๋Œ์•„์™€์„œ HttpStatus๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋ฆฌํ„ด๋œ๋‹ค.
๊ทธ๋‹ค์Œ board.js๋กœ ๋Œ์•„์™€ ๊ฒฐ๊ณผ๊ฐ€ ์ •์ƒ์ด๋ฏ€๋กœ done์ด ์‹คํ–‰๋˜์–ด ๊ธ€ ์ž‘์„ฑ์ด ์™„๋ฃŒ๋˜์—ˆ๋‹ค๋Š” ๋ฉ”์„ธ์ง€๊ฐ€ ๋„์›Œ์ง€๊ณ  / ์ฃผ์†Œ๋กœ ๊ฐ€๊ฒŒ ๋œ๋‹ค.


์ˆœ์„œ ์ •๋ฆฌ

  1. /board/saveForm์œผ๋กœ ๋“ค์–ด์˜ค๋ฉด ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ํ•ด๋‹น ์ฃผ์†Œ๋ฅผ ์ฐพ๊ณ  ๋ฆฌํ„ด์œผ๋กœ saveForm.jsp ํ˜ธ์ถœ
  2. saveForm.jsp ์—์„œ title๊ณผ content๋ฅผ ๊ฐ€์ง€๊ณ  ๋ฒ„ํŠผ(id = "btn-save")์„ ๋ˆ„๋ฅด๋ฉด board.js ์ž‘๋™
  3. title๊ณผ content ๊ฐ€์ ธ์™€์„œ /api/board์— json ๋ฐ์ดํ„ฐ๋กœ ๋‚ ๋ฆผ
  4. ๊ทธ๋Ÿผ title๊ณผ content๊ฐ€ BoardApiController์˜ ํ•ด๋‹น ์ฃผ์†Œ ๋ฉ”์†Œ๋“œ๋กœ ๋‚ ๋ผ์˜ด
  5. BoardApiController์˜ save ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜ board๋Š” title๊ณผ content๋งŒ ๋“ค๊ณ  ์žˆ์Œ
  6. board(title, content)์™€ User ๊ฐ™์ด ๋“ค๊ณ  BoardService์˜ ๊ธ€์“ฐ๊ธฐ๋กœ ๊ฐ
  7. BoardService์˜ ๊ธ€์“ฐ๊ธฐ ํ•จ์ˆ˜๋กœ ์™€์„œ ์กฐํšŒ์ˆ˜ 0์œผ๋กœ setํ•˜๊ณ  User๋„ ๋“ค๊ณ  ์˜จ user๋กœ setํ•จ
  8. BoardRepository์— save
  9. save ํ›„ ๋‹ค์‹œ BoardApiController๋กœ ๋Œ์•„์™€์„œ return ์œผ๋กœ ์ •์ƒ ์‘๋‹ต
  10. ๊ทธ๋Ÿฌ๋ฉด ์ •์ƒ ์‘๋‹ต์ด board.js์˜ done์œผ๋กœ ์™€์„œ / ๋กœ ์ด๋™
profile
๐Ÿ“š

0๊ฐœ์˜ ๋Œ“๊ธ€