๐Ÿ”ฅ #5 ํšŒ์›๊ฐ€์ž… ๊ตฌํ˜„ํ•˜๊ธฐ (Feat. Ajax๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ )

myeonjiยท2022๋…„ 2์›” 16์ผ
3

ํšŒ์›๊ฐ€์ž… ํผ (jsp ํŒŒ์ผ)์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•ด์•ผ ํ•œ๋‹ค.

<form action="/user/join" method="POST">
    <div class="form-group">
        <label for="username">Username</label>
        <input type="text" class="form-control" placeholder="Enter username" id="username">
    </div>
    <div class="form-group">
        <label for="email">Email</label>
        <input type="email" class="form-control" placeholder="Enter email" id="email">
    </div>
    <div class="form-group">
        <label for="password">Password</label>
        <input type="password" class="form-control" placeholder="Enter password" id="password">
    </div>
    <button type="submit" class="btn btn-primary">ํšŒ์›๊ฐ€์ž…ํ•˜๊ธฐ</button>
</form>

์ €๋ฒˆ ํ”„๋กœ์ ํŠธ๋Š” form ํƒœ๊ทธ๋ฅผ ์ด์šฉํ•˜์—ฌ ์œ„์ฒ˜๋Ÿผ ํ–ˆ์—ˆ๋‹ค๋ฉด.. ์ด๋ฒˆ์—๋Š” ์ข€ ๋‹ค๋ฅด๊ฒŒ !!

json ํ˜•ํƒœ๋กœ ํ•ด๋ณด๊ฒ ๋‹ค.


๐ŸŽˆ ํšŒ์›๊ฐ€์ž…์‹œ Ajax๋ฅผ ์‚ฌ์šฉํ•˜๋Š” 2๊ฐ€์ง€ ์ด์œ 

1๏ธโƒฃ1. ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์„ html์ด ์•„๋‹Œ Data(Json)๋ฅผ ๋ฐ›๊ธฐ ์œ„ํ•ด์„œ

(์˜ˆ์‹œ)

์ด๋ ‡๊ฒŒ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ธŒ๋ผ์šฐ์ € ๋ผ๋ฉด ์œ„์˜ ๊ทธ๋ฆผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. (html)

ํ•˜์ง€๋งŒ!!

๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์•„๋‹Œ ์•ฑ์ด๋ผ๋ฉด, ์•ฑ์€ html์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•œ๋‹ค.
์ •ํ™•ํžˆ ๋งํ•˜๋ฉด ํ™”๋ฉด์„ ๊ทธ๋ ค์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ž๋ฐ” ์ฝ”๋“œ๋ฅผ ๋ฆฌํ„ดํ•ด์•ผ ํ•œ๋‹ค.
์•ฑ์„ ๋‹ค์šด๋กœ๋“œํ•˜๋ฉด ํ™”๋ฉด ๋””์ž์ธ์€ ์ด๋ฏธ ์•ฑ์— ์‹ฌ์–ด์ ธ์žˆ๋‹ค.
์ฆ‰, Data๋งŒ ๋ฆฌํ„ดํ•˜๋ฉด ๋œ๋‹ค!

์ด๋ ‡๊ฒŒ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ธŒ๋ผ์šฐ์ € ์ผ๋•Œ์™€ ์•ฑ ์ผ๋•Œ์˜ ๋ฐฉ์‹์ด ๋‹ค๋ฅด๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์„œ๋ฒ„๋ฅผ 2๋ฒˆ ๋งŒ๋“ค์–ด์•ผ ํ• ๊นŒ??

-> ๋‹น์—ฐํžˆ ์•„๋‹ˆ๋‹ค! ๊ทธ๋ƒฅ ๋‘˜ ๋‹ค Data๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

์ด๋ ‡๊ฒŒ
1. ํšŒ์›๊ฐ€์ž… ์š”์ฒญ ํ›„ Data๋กœ ๋ฆฌํ„ด ๋ฐ›๊ณ 
2. ๋ฉ”์ธ ํŽ˜์ด์ง€๋ฅผ ๋‹ค์‹œ ์š”์ฒญํ•˜์—ฌ .html๋กœ ๋ฆฌํ„ด ๋ฐ›๋Š” ๊ฒƒ์ด๋‹ค.

์ฆ‰, Ajax๋ฅผ ์‚ฌ์šฉํ•ด์„œ Data๋ฅผ ์‘๋‹ต ๋ฐ›๊ฒŒ ๋˜๋ฉด ๋ธŒ๋ผ์šฐ์ €๋‚˜ ์•ฑ ๋‘˜ ๋‹ค ๋™์ผํ•œ ์„œ๋ฒ„๋กœ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.

2๏ธโƒฃ2. ๋น„๋™๊ธฐ ํ†ต์‹ ์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ

์ ˆ์ฐจ์ ์œผ๋กœ ์ผ์„ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ ์ˆœ์„œ์— ์ƒ๊ด€์—†์ด ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ

์ฝœ๋ฐฑ : ํ•˜๋˜ ์ผ์„ ๋ฉˆ์ถ”๊ณ  ๋Œ์•„๊ฐ€๋Š” ๊ฒƒ

  • ๋™๊ธฐ์  ์‹คํ–‰ : ์ ˆ์ฐจ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ, ์•ž ์ˆœ์„œ๊ฐ€ ๋์ด ๋‚˜์•ผ ๋’ค ์ˆœ์„œ ์‹คํ–‰
  • ๋น„๋™๊ธฐ์  ์‹คํ–‰ : ์ ˆ์ฐจ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ, ์•ž ์ˆœ์„œ๊ฐ€ ๋๋‚˜์ง€ ์•Š์•„๋„ ๋’ค ์ˆœ์„œ ๋จผ์ € ์‹คํ–‰ ๊ฐ€๋Šฅ

joinForm.jsp์—

<button id="btn-save" class="btn btn-primary">ํšŒ์›๊ฐ€์ž…ํ•˜๊ธฐ</button>
.
.
.
<script src="/blog/js/user.js"></script>

๋„ฃ์–ด์ฃผ๊ณ  ์ด์ œ user.js๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.

๋ฒ„ํŠผ id๊ฐ€ btn-save์ด๋‹ˆ๊นŒ .. ์•„๋ž˜์ฒ˜๋Ÿผ !!
< user.js >

let index = {
    init: function () {
        $("#btn-save").on("click", ()=>{ // function(){} ๋Œ€์‹  ()=>{} ๋ฅผ ์“ด ์ด์œ  : this๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜๊ธฐ ์œ„ํ•ด์„œ
            this.save();
        });
    },

    save: function () {
        // alert('user์˜ saveํ•จ์ˆ˜ ํ˜ธ์ถœ๋จ');
        let data = {
            username: $("#username").val(),
            password: $("#password").val(),
            email: $("#email").val()
        };

        // console.log(data);

        // ajax ํ˜ธ์ถœ์‹œ default๊ฐ€ ๋น„๋™๊ธฐ ํ˜ธ์ถœ -> ์ˆœ์„œ ์ƒ๊ด€์—†์Œ
        // ajax ํ†ต์‹ ์„ ์ด์šฉํ•ด์„œ 3๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ json์œผ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ insert ์š”์ฒญ
        // ajax๊ฐ€ ํ†ต์‹ ์„ ์„ฑ๊ณตํ•˜๊ณ  ์„œ๋ฒ„๊ฐ€ json์„ ๋ฆฌํ„ดํ•ด์ฃผ๋ฉด ์ž๋™์œผ๋กœ ์ž๋ฐ” ์˜ค๋ธŒ์ ํŠธ๋กœ ๋ณ€ํ™˜
        $.ajax({
            // ํšŒ์›๊ฐ€์ž… ์ˆ˜ํ–‰ ์š”์ฒญ
            type: "POST",
            url: "/blog/api/user",
            data: JSON.stringify(data), // http body ๋ฐ์ดํ„ฐ
            contentType: "application/json; charset=utf-8", // body ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ค ํƒ€์ž…์ธ์ง€ (MIME)
            dataType: "json" // ์š”์ฒญ์„ ์„œ๋ฒ„๋กœ ํ•ด์„œ ์‘๋‹ต์ด ์™”์„ ๋•Œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ๊ฒƒ์ด String(๋ฌธ์ž์—ด), ๋งŒ์•ฝ ์ƒ๊ธด๊ฒŒ json์ด๋ผ๋ฉด javascript ์˜ค๋ธŒ์ ํŠธ๋กœ ๋ณ€๊ฒฝ
        }).done(function (resp) {
            // ๊ฒฐ๊ณผ๊ฐ€ ์ •์ƒ์ด๋ฉด done ์‹คํ–‰
            alert("ํšŒ์›๊ฐ€์ž…์ด ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");
            //console.log(resp);
            location.href = "/blog";
        }).fail(function (error) {
            // ์‹คํŒจํ•˜๋ฉด fail ์‹คํ–‰
            alert("ํšŒ์›๊ฐ€์ž…์ด ์‹คํŒจํ•˜์˜€์Šต๋‹ˆ๋‹ค.");
            alert(JSON.stringify(error));
        });
    }
}


index.init();

ํšŒ์›๊ฐ€์ž… ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ajax์—์„œ ํšŒ์›๊ฐ€์ž… ์ˆ˜ํ–‰์š”์ฒญ์„ ํ•˜๋Š”๋ฐ

  • url : url์„ "/blog/api/user"๋กœ ์žก์•˜๋‹ค.

  • data : data์—์„œ๋Š” ์œ„์˜ data๊ฐ€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์˜ค๋ธŒ์ ํŠธ๋‹ˆ๊นŒ (let data = { id:1, username:"ssar" }; ์ด๋Ÿฐ ํ˜•ํƒœ๋กœ ์ƒ๊น€) ์ž๋ฐ”์—์„œ ์ดํ•ด๋ฅผ ํ•˜์ง€ ๋ชปํ•œ๋‹ค. (data: data๋ผ๊ณ  ์ ์œผ๋ฉด ์ž๋ฐ”๊ฐ€ ์ดํ•ด ๋ชปํ•จ)
    ๋”ฐ๋ผ์„œ js์˜ค๋ธŒ์ ํŠธ๋ฅผ json์œผ๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค. (JSON.stringify() ํ•จ์ˆ˜ ์‚ฌ์šฉ)

    ์œ„ : console.log(data); -> ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์˜ค๋ธŒ์ ํŠธ
    ์•„๋ž˜ : console.log(JSON.stringify(data); -> JSON ๋ฌธ์ž์—ด

  • contentType : ๋ฌด์Šจ ๋ฐ์ดํ„ฐ์ธ์ง€ ์•Œ๋ ค์ฃผ๊ธฐ (MIME ๋ฐ์ดํ„ฐ), ์œ„์˜ data์™€ ์„ธํŠธ๋กœ ์จ์ฃผ๊ธฐ

  • dataType : ์‘๋‹ต์ด ์˜จ ํ›„!!!๋ฅผ ๋งํ•จ. ์‘๋‹ต์œผ๋กœ ์˜จ ๋ฐ์ดํ„ฐ -> ํ…์ŠคํŠธ, ์ˆซ์ž, json ํ˜•ํƒœ ๋“ฑ..
    ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ๊ฒƒ์ด ๋ฌธ์ž์—ด๋กœ ์˜ค์ง€๋งŒ, "json"์ด๋ผ๊ณ  ์„ค์ •ํ•˜๋ฉด ์‘๋‹ต ์˜จ ๋ฐ์ดํ„ฐ์˜ ์ƒ๊ธด ํ˜•ํƒœ๊ฐ€ json ์ผ ๋•Œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์˜ค๋ธŒ์ ํŠธ๋กœ ๋ณ€๊ฒฝ
    -> ๊ฒฐ๊ณผ๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋ณ€ํ™˜ํ•ด์„œ ์‘๋‹ต ๊ฒฐ๊ณผ๊ฐ€ ์•„๋ž˜์˜ function(๊ฒฐ๊ณผ) ์—ฌ๊ธฐ ๊ฒฐ๊ณผ๋กœ ์ „๋‹ฌ๋จ

< UserApiController >

	@PostMapping("/api/user")
    public ResponseDto<Integer> save(@RequestBody User user) {
        System.out.println("UserApiController : save ํ˜ธ์ถœ๋จ");
        user.setRole(RoleType.USER);
        userService.ํšŒ์›๊ฐ€์ž…(user);
        return new ResponseDto<Integer>(HttpStatus.OK.value(), 1); // ํ†ต์‹  ์„ฑ๊ณต : 200, ์‹คํŒจ : 500 // ์ž๋ฐ” ์˜ค๋ธŒ์ ํŠธ๋ฅผ JSON์œผ๋กœ ๋ณ€ํ™˜ํ•ด์„œ ๋ฆฌํ„ด (Jackson)
    }

< UserService >

    @Transactional // ์ „์ฒด๊ฐ€ ์„ฑ๊ณตํ•ด์•ผ commit, ์‹คํŒจํ•˜๋ฉด rollback
    public void ํšŒ์›๊ฐ€์ž…(User user) {
        userRepository.save(user);
    }

์„œ๋น„์Šค๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

  1. ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ
  • ํŠธ๋žœ์žญ์…˜ : ์ผ์ด ์ฒ˜๋ฆฌ๋˜๊ธฐ ์œ„ํ•œ ๊ฐ€์žฅ ์ž‘์€ ๋‹จ์œ„
  • ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜์ด ๋ฌถ์—ฌ์„œ ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. -> ์„œ๋น„์Šค
  • ๋ณดํ†ต ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ํ•  ๋•Œ ์‚ฌ์šฉ, ๋ณ€๊ฒฝํ•ด์„œ ์ปค๋ฐ‹ ํ•˜๋Š” ์šฉ๋„ (update)
  1. ์„œ๋น„์Šค ์˜๋ฏธ ๋•Œ๋ฌธ (=๊ธฐ๋Šฅ)
  • update, insert, delete ๋“ฑ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋กœ์ง์ด ๋ฌถ์ธ ๊ฒƒ, update ๋ผ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋กœ์ง์„ ํ•˜๋‚˜๋งŒ ๋“ค๊ณ  ์žˆ์–ด๋„ ์„œ๋น„์Šค๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๊ธด ํ•จ.

  • (์˜ˆ์‹œ) ์†ก๊ธˆ ์„œ๋น„์Šค : A(ํ˜„์žฌ ์ž”์•ก : 5000) -> B(ํ˜„์žฌ ์ž”์•ก : 2000) ์—๊ฒŒ 1000์› ์ž…๊ธˆํ•˜๋ฉด A์˜ ๋ฐ์ดํ„ฐ 5000->4000์œผ๋กœ update, B์˜ ๋ฐ์ดํ„ฐ 2000->3000์œผ๋กœ update. ์ด 2๊ฐœ์˜ ๋กœ์ง์„ ๋ฌถ๋Š”๋‹ค. ๋˜ํ•œ 2๊ฐœ ๋กœ์ง์˜ ํŠธ๋žœ์žญ์…˜์„ ๋ฌถ์–ด์„œ ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ๋ฌถ์–ด ์„œ๋น„์Šคํ™” ์‹œํ‚จ๋‹ค.
    ์ฆ‰, ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŠธ๋žœ์žญ์…˜์ด ๋ชจ์—ฌ ์„œ๋น„์Šค๊ฐ€ ๋œ๋‹ค.

profile
๐Ÿ“š

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