커뮤니티
포인트
쿠폰
내 강의실
국비 신청 내역
증명서
계정
로그아웃
학습 질문
개발 일지
나의 활동
답변 완료
숙제 질문
undefined주차
북마크
박*현
댓글
2
추천
0
조회수
26
조회수
26
답변 완료

* 겪고 있는 문제 상황을 최대한 자세하게 작성해주세요.

* 문제 해결을 위해 어떤 시도를 해보았는지 구체적으로 함께 알려주세요.



숙제 풀의 강의도 듣고 코드스니펫도 보면서 해봤는데 웹을 띄우고 어느 부분에서 업데이트가 되는건지 잘 모르겠어요


처음에 관심상품 등록하면서 myprice 설정하고, 다시 같은 상품의 myprice를 수정하면 모아보기 탭의 상품 최저가가 바뀌는것으로 생각했는데 그냥 상품이 하나 더 추가가되는데 이렇게 되면 새로고침이 되는것 말고는 똑같은것같은데 맞나요?


스파르타 즉문즉답

-> 위에서 3번째 상품 관심상품 담기

스파르타 즉문즉답

-> 결과


스파르타 즉문즉답

-> 같은 상품 관심상품 담기

스파르타 즉문즉답

-> 결과




basic.js

let targetId;

$(document).ready(function () {
    // id 가 query 인 녀석 위에서 엔터를 누르면 execSearch() 함수를 실행하라는 뜻입니다.
    $('#query').on('keypress', function (e) {
        if (e.key == 'Enter') {
            execSearch();
        }
    });
    $('#close').on('click', function () {
        $('#container').removeClass('active');
    })

    $('.nav div.nav-see').on('click', function () {
        $('div.nav-see').addClass('active');
        $('div.nav-search').removeClass('active');

        $('#see-area').show();
        $('#search-area').hide();
    })
    $('.nav div.nav-search').on('click', function () {
        $('div.nav-see').removeClass('active');
        $('div.nav-search').addClass('active');

        $('#see-area').hide();
        $('#search-area').show();
    })

    $('#see-area').show();
    $('#search-area').hide();

    showProduct();
})


function numberWithCommas(x) {
    return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}

//////////////////////////////////////////////////////////////////////////////////////////
///// 여기 아래에서부터 코드를 작성합니다. ////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////

//검색 실행
function execSearch() {
    /**
     * 검색어 input id: query
     * 검색결과 목록: #search-result-box
     * 검색결과 HTML 만드는 함수: addHTML
     */
    $('#search-result-box').empty()
    // 1. 검색창의 입력값을 가져온다.
    let query = $('#query').val();
    // 2. 검색창 입력값을 검사하고, 입력하지 않았을 경우 focus.
    if (query == '') {
        alert("검색어를 입력해주세요.")
        $('#query').focus()
    }
    // 3. GET /api/search?query=${query} 요청
    $.ajax({
        type: 'GET',
        url: `/api/search?query=${query}`,
        success: function(response){ //response : itemDto에 들어갈 응답값이 들어있음
            for (let i=0; i<response.length; i++) {
                let itemDto = response[i];
                let tempHtml = addHTML(itemDto);
                $('#search-result-box').append(tempHtml);
            }
        }
    })
    // 4. for 문마다 itemDto를 꺼내서 HTML 만들고 검색결과 목록에 붙이기!

}

function addHTML(itemDto) {
    /**
     * class="search-itemDto" 인 녀석에서
     * image, title, lprice, addProduct 활용하기
     * 참고) onclick='addProduct(${JSON.stringify(itemDto)})'
     *      -> itemDto는 json 형태이지만 괄호 안에는 문자열 형태가 들어가야 한다
     */
    return `<div class="search-itemDto">
                <div class="search-itemDto-left">
                    <img src="${itemDto.image}" alt="">
                </div>
                <div class="search-itemDto-center">
                    <div>${itemDto.title}</div>
                    <div class="price">
                        ${numberWithCommas(itemDto.lprice)}
                        <span class="unit">원</span>
                    </div>
                </div>
                <div class="search-itemDto-right">
                    <img src="images/icon-save.png" alt="" onclick='addProduct(${JSON.stringify(itemDto)})'>
                </div>
            </div>`
}

function addProduct(itemDto) {
    /**
     * modal 뜨게 하는 법: $('#container').addClass('active');
     * data를 ajax로 전달할 때는 두 가지가 매우 중요
     * 1. contentType: "application/json",
     * 2. data: JSON.stringify(itemDto),
     */
    // 1. POST /api/products 에 관심 상품 생성 요청
    $.ajax({
        type: 'POST',
        url: '/api/products',
        data: JSON.stringify(itemDto),
        contentType: 'application/json',
        success: function (response) {
            $('#container').addClass('active');
            targetId = response.id;
        }
    })
    // 2. 응답 함수에서 modal을 뜨게 하고, targetId 를 reponse.id 로 설정 (숙제로 myprice 설정하기 위함)

}

function showProduct() {
    /**
     * 관심상품 목록: #product-container
     * 검색결과 목록: #search-result-box
     * 관심상품 HTML 만드는 함수: addProductItem
     */
    // 1. GET /api/products 요청
    $.ajax({
        type: 'GET',
        url: '/api/products',
        success: function(response){
    // 2. 관심상품 목록, 검색결과 목록 비우기
            $('#product-container').empty();
            $('#search-result-box').empty();
    // 3. for 문마다 관심 상품 HTML 만들어서 관심상품 목록에 붙이기!
            for (let i=0; i<response.length; i++) {
                let product = response[i];
                let tempHtml = addProductItem(product);
                $('#product-container').append(tempHtml);
            }
        }
    })


}

function addProductItem(product) {
    // link, image, title, lprice, myprice 변수 활용하기
    return `<div class="product-card" onclick="window.location.href='${product.link}'">
                <div class="card-header">
                    <img src="${product.image}"
                         alt="">
                </div>
                <div class="card-body">
                    <div class="title">
                        ${product.title}
                    </div>
                    <div class="lprice">
                        <span>${numberWithCommas(product.lprice)}</span>원
                        <span>myprice &nbsp; ${numberWithCommas(product.myprice)}원</span>
                    </div>
                    <div class="isgood ${product.lprice <= product.myprice ? '' : 'none'}">
<!--                    (조건) ? (참일 경우 반환) : (거짓일 경우 반환)-->
                        최저가
                    </div>
                </div>
            </div>`;
}

function setMyprice() {

    // 숙제! myprice 값 설정하기.
    // id가 myprice 인 input 태그에서 값을 가져온다.
    let myprice = $('#myprice').val();
    // 만약 값을 입력하지 않았으면 alert를 띄우고 중단한다.
    if (myprice == '') {
        alert("올바른 가격을 입력 해 주세요.")
        return;
    }
    // PUT /api/product/${targetId} 에 data를 전달한다.
    $.ajax({
        type: 'PUT',
        url: `/api/products/${targetId}`,
        data: JSON.stringify({myprice:myprice}),
        contentType: 'application/json',
        success: function (response) {
            $('#container').removeClass('active');
            alert('성공적으로 등록되었습니다.')
            window.location.reload();
        }
    })
    // 주의) contentType: "application/json",
    //      data: JSON.stringify({myprice: myprice}),
    //      빠뜨리지 말 것!
    // 모달을 종료한다. $('#container').removeClass('active');
    // 성공적으로 등록되었음을 알리는 alert를 띄운다.
    // 창을 새로고침한다. window.location.reload();
}


ProductRestController.java

package com.sparta.week04.Controller;

import com.sparta.week04.medels.Product;
import com.sparta.week04.medels.ProductMypriceRequestDto;
import com.sparta.week04.medels.ProductRepository;
import com.sparta.week04.medels.ProductRequestDto;
import com.sparta.week04.service.ProductService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RequiredArgsConstructor // final로 선언된 멤버 변수를 자동으로 생성합니다.
@RestController // JSON으로 데이터를 주고받음을 선언합니다.
public class ProductRestController {

    private final ProductService productService;
    private final ProductRepository productRepository;

    // 등록된 전체 상품 목록 조회@GetMapping("/api/products")public List<Product> getProducts() {

        return productRepository.findAll();
    }

    // 신규 상품 등록@PostMapping("/api/products")public Product createProduct (@RequestBody ProductRequestDto requestDto) {
        Product product = new Product(requestDto);
        return productRepository.save(product);
    }

    // 설정 가격 변경@PutMapping("/api/products/{id}")public Long updateProduct(@PathVariable Long id, @RequestBody ProductMypriceRequestDto requestDto) {
        return productService.update(id, requestDto);
    }
}


ProductService.java

package com.sparta.week04.service;

import com.sparta.week04.medels.ItemDto;
import com.sparta.week04.medels.Product;
import com.sparta.week04.medels.ProductMypriceRequestDto;
import com.sparta.week04.medels.ProductRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import javax.transaction.Transactional;

@RequiredArgsConstructor // final로 선언된 멤버 변수를 자동으로 생성합니다.
@Service // 서비스임을 선언합니다.
public class ProductService {

    private final ProductRepository productRepository;

    @Transactional // 메소드 동작이 SQL 쿼리문임을 선언합니다.public Long update(Long id, ProductMypriceRequestDto requestDto) {
        Product product = productRepository.findById(id).orElseThrow(
                () -> new NullPointerException("해당 아이디가 존재하지 않습니다.")
        );
        product.update(requestDto);
        return id;
    }

    @Transactional // 메소드 동작이 SQL 쿼리문임을 선언합니다.public void updateBySearch(Long id, ItemDto itemDto) {
        Product product = productRepository.findById(id).orElseThrow(
                () -> new NullPointerException("해당 아이디가 존재하지 않습니다.")
        );
        product.updateByItemDto(itemDto);
    }
}


취소
 공유
취소
댓글 0
댓글 알림
나의얼굴