๊ด€๋ฆฌ ๋ฉ”๋‰ด

th42500์˜ TIL

Ajax์—์„œ Controller๋กœ ๋ณด๋‚ธ ๊ฐ’์ด ์ œ๋Œ€๋กœ ๋“ค์–ด์˜ค์ง€ ์•Š๋Š” ์˜ค๋ฅ˜ (Feat. ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๊ธฐ๋Šฅ) ๋ณธ๋ฌธ

Frontend/Ajax

Ajax์—์„œ Controller๋กœ ๋ณด๋‚ธ ๊ฐ’์ด ์ œ๋Œ€๋กœ ๋“ค์–ด์˜ค์ง€ ์•Š๋Š” ์˜ค๋ฅ˜ (Feat. ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๊ธฐ๋Šฅ)

th42500 2023. 2. 9. 23:57

๐Ÿ›  ๊ฐœ๋ฐœํ™˜๊ฒฝ

Editor : Intellij Ultimate

Deb Tool : SpringBoot 2.7.5

JDK : JAVA 11

Build : Gradle 6.8

Server : AWS EC2

DevOps : Docker

DB : MySql 8.0

Library : SpringBoot Web, MySQL, Spring Data JPA, Lombok, Spring Security, Thymeleaf

 

 

โ“ Ajax์—์„œ Controller๋กœ ๋ณด๋‚ธ ๊ฐ’์ด ์ œ๋Œ€๋กœ ๋“ค์–ด์˜ค์ง€ ์•Š๋Š”๋‹ค โ“

์žฅ๋ฐ”๊ตฌ๋‹ˆ์—์„œ ์ƒํ’ˆ ์ผ๋ถ€๋ฅผ ์ฃผ๋ฌธํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ ์ฃผ๋ฌธํ•˜๊ธฐ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ์ƒํ’ˆ ์ฒดํฌ ์—ฌ๋ถ€๋ฅผ true์™€ false๋กœ ์ „๋‹ฌํ•˜๊ธฐ๋กœ ํ•˜๊ณ  ๊ฐœ๋ฐœ์„ ํ•˜๋˜ ์ค‘์ด์—ˆ๋‹ค.

ํ”„๋ก ํŠธ์—์„œ ๊ฐ’์ด ์ž˜ ๋‹ด๊ธฐ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด Console์—์„œ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜์˜€๊ณ  ๊ทธ ๊ฒฐ๊ณผ true์™€ false๋กœ ๊ธฐ๋ก๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ Controller์—์„œ log ํ™•์ธ ์‹œ ๋ชจ๋‘ false๋กœ ๊ธฐ๋ก์ด ๋˜์—ˆ๋‹ค.

"๊ฐ’์ด ๋งคํ•‘์ด ์•ˆ๋˜์–ด์„œ CheckOrderItemDto์— ์•„์˜ˆ ์•ˆ๋“ค์–ด์˜ค๋Š”๊ฑด๊ฐ€?" ์‹ถ์—ˆ์ง€๋งŒ item id์—๋Š” ์•Œ๋งž๊ฒŒ ๋ฐ์ดํ„ฐ๊ฐ€ ์ž˜ ๋“ค์–ด์˜ค๋Š” ๊ฒƒ์„ ๋ณด๋‹ˆ ๊ทธ ์ ์€ ์•„๋‹Œ๊ฒƒ ๊ฐ™์•˜๋‹ค.

ํ˜น์‹œ isChecked๋งŒ ๋ฐ์ดํ„ฐ ๋งตํ•‘์ด ์•ˆ๋˜์–ด boolean์˜ ๊ธฐ๋ณธ๊ฐ’์ธ false๋กœ ๋ฐ”๋€Œ๋Š” ๊ฑด๊ฐ€ ์ถ”์ธกํ•ด๋ณด์•˜๋‹ค.

 

[๐Ÿ‘‡ cart.js]

function saveOrder() {
   console.log('purchaseOrder() ์‹คํ–‰');
    var items = $(".form-check-input");
    console.log(items);
    var orderItems = [];

    for(var [idx, selectElement] of Object.entries(items)) {
        console.log(isNaN(idx));
        const cartItemId = $(selectElement).attr("cartItemId");
        const checked = selectElement.checked;
        if(!isNaN(idx)) {
            console.log("orderItems์— pushํ•ฉ๋‹ˆ๋‹ค");
            console.log(idx + " ๋ฒˆ ์ธ๋ฑ์Šค ํƒ€์ž… ์ฒดํฌ = " + typeof checked);
            orderItems.push({
                id: cartItemId,
                isChecked: checked
            })
        }
    }

    console.log(orderItems);
    console.log(JSON.stringify(orderItems));

    $.ajax({
        url: "/api/v1/carts/checkOrder",
        method: "POST",
        contentType: 'application/json;charset=utf-8',
        data: JSON.stringify(orderItems)
    }).done((data) => {
        console.log(data);
        // location.href = "/carts/order";
    }).fail((error) => {
        console.log(error);
        if(error.result) {
            alert(error.result);
        }
    }).always(() => {
        console.log("์ฃผ๋ฌธ ajax ์‹คํ–‰ ์™„๋ฃŒ");
    })
}

[๐Ÿ‘‡ CartRestController.java]

@PostMapping("/checkOrder")
public Response<String> updateCheckItem (@RequestBody List<CheckOrderItem> checkCartItemDto, Authentication authentication) {
    String userName = authentication.getName();
    for (CheckOrderItem itemDto : checkCartItemDto) {
        log.info("item id = {}", itemDto.getId());
        log.info("item isChecked = {}", itemDto.isChecked());
    }
    cartService.updateCheckItem(checkCartItemDto, userName);
    return Response.success("์žฅ๋ฐ”๊ตฌ๋‹ˆ ์ƒํ’ˆ ์ฒดํฌ ์™„๋ฃŒ");
}

[๐Ÿ‘‡ CheckOrderItemDto]

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@AllArgsConstructor
@NoArgsConstructor
public class CheckOrderItem {

    private Long id;

    private boolean isChecked;

}

 

Ajax์„ ์ด์šฉํ•œ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ์‹œ ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž…์ด ๋ฐ˜๋“œ์‹œ ์ผ์น˜ํ•˜์—ฌ์•ผ Controller๋กœ ์˜จ์ „ํžˆ ๊ฐ’์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ”„๋ก ํŠธ์—์„œ Console์„ ์ด์šฉํ•˜์—ฌ Type์„ ํ™•์ธํ•ด๋ณด์•˜๋‹ค.

Controller๋กœ ๋ณด๋‚ด๊ณ ์ž ํ•˜๋Š” ์ƒํ’ˆ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ชจ๋‘ boolean ํƒ€์ž…์ธ ๊ฒƒ์„ ์ž˜ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ, ์—ฌ์ „ํžˆ Controller์—์„œ๋Š” ๋ชจ๋‘ false๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

2์‹œ๊ฐ„ ๋„˜๊ฒŒ ๊ณ ๋ฏผํ•œ ๊ฒฐ๊ณผ JSON์œผ๋กœ ๋ณ€ํ™˜๋˜์–ด ๋„˜์–ด๊ฐˆ ๋•Œ boolean์œผ๋กœ ์˜จ์ „ํžˆ ๋„˜์–ด๊ฐ€๋Š”์ง€ ํ™•์ธ ํ•ด๋ณด๊ธฐ๋กœ ํ•˜์˜€๋‹ค.

Console์— ์ถœ๋ ฅํ•ด๋ณธ ๊ฒฐ๊ณผ JSON์œผ๋กœ ๋ณ€ํ™˜ํ–ˆ์„ ๋•Œ booleanํƒ€์ž…์ด์—ˆ๋˜ check ๋ณ€์ˆ˜๊ฐ€ String ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜๋˜์–ด ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์˜€๋‹ค.

์ฆ‰, Parameter Type Missmatch ๐Ÿ˜ข

 

 

๐Ÿ’ก ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

์ฝ”๋“œ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝํ•ด์ฃผ์–ด ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

[๐Ÿ‘‡ CartOrderItemDto.java]

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@AllArgsConstructor
@NoArgsConstructor
public class CheckOrderItemDto {

    private Long id;

    private String isChecked;

}

[๐Ÿ‘‡ CartRestController.java]

@PostMapping("/checkOrder")
public Response<String> updateCheckItem (@RequestBody List<CheckOrderItemDto> checkCartItemDto, Authentication authentication) {
    String userName = authentication.getName();
    for (CheckOrderItemDto itemDto : checkCartItemDto) {
        log.info("item id = {}", itemDto.getId());
        log.info("item isChecked = {}", itemDto.getIsChecked());
    }
    cartService.updateCheckItem(checkCartItemDto, userName);
    return Response.success("์žฅ๋ฐ”๊ตฌ๋‹ˆ ์ƒํ’ˆ ์ฒดํฌ ์™„๋ฃŒ");
}

[๐Ÿ‘‡ CartItemService.java]

public void updateCheckItem(List<CheckOrderItemDto> checkOrderItemDtoList, String userName) {
    UserEntity user = validateUser(userName);

    CartEntity cart = validateCart(user);

    for (CheckOrderItemDto dto : checkOrderItemDtoList) {
        log.info("cartItemEntity ๊ฒ€์ฆ");
        CartItemEntity cartItem = validateCartItem(cart, dto.getId());
        boolean dtoCheck = dto.getIsChecked().equals("true")?true:false;
        if(cartItem.isChecked() != dtoCheck) {
            log.info("cartItemEntity ๋ฐ”๊พธ๊ธฐ");
            log.info("cartItem.isChecked : {}", cartItem.isChecked());
            log.info("dto.isChecked : {}", dtoCheck);
            cartItem.updateCheckItem();
            log.info("๋ณ€๊ฒฝ๋œ cartItem.isChecked : {}", cartItem.isChecked());
        }
    }
}

์œ„์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝ ํ›„ ๋‹ค์‹œ ์‹คํ–‰ํ•ด๋ณด๋ฉด ์„ ํƒํ•œ ์ƒํ’ˆ์€ true, ์„ ํƒํ•˜์ง€ ์•Š์€ ์ƒํ’ˆ์€ false๋กœ ์„œ๋ฒ„๋กœ ์ž˜ ๋„˜์–ด๊ฐ€๋Š” ๊ฒƒ์„ ํ™•

์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

Comments