관심쟁이 영호

[#14] Spring Boot ㅣ 상품 수정 구현하기 본문

Bank-End/인프런- Spring 공부

[#14] Spring Boot ㅣ 상품 수정 구현하기

관심쟁이 영호 2021. 4. 19. 01:31
반응형

제일 중요한 부분이다.

 

변경감지와 병합

이것에 대해서 알기전에, 왜 이것을 배우느냐?

실제로 웹에서 스프링 JPA를 이용하면 이러한 구조가 될 것이다.

- 위와 같은 구조이다.

 

- 웹에서 사용자가 데이터를 변경하면, 폼을 통해서 코드로 넘어온다. form 객체로 넘어온 데이터를 영속성 컨텍스트로 넘겨주어야 한다. 여기서 문제이다. 먼저 여러가지 방법을 보자.

/**
     * 상품 수정
     */
    @PostMapping(value = "/items/{itemId}/edit")
    public String updateItem(@ModelAttribute("form") BookForm form) {
        Book book = new Book();
        book.setId(form.getId());
        book.setName(form.getName());
        book.setPrice(form.getPrice());
        book.setStockQuantity(form.getStockQuantity());
        book.setAuthor(form.getAuthor());
        book.setIsbn(form.getIsbn());
        itemService.saveItem(book);
        return "redirect:/items";
    }

(1) 코드를 살펴보면 새로운 객체(item과 같은) 를 생성하고, form에서 값을 다 받은 다음, 영속성 컨텍스트로 넘겨준다.

이 때, itemService.saveItem(book)이 없다면, book은 영속성 컨텍스트가 아니라서 JPA가 관리하지 않는다. 그래서 값을 변경해주어도 값이 업데이트 되지 않는다.

 

(2) 변경 감지

itemService로 넘기고, 거기서 find해온 객체에다가 set해주어야한다.

그러면 영속성 컨텍스트에서 가져온 값이 변경 되기 때문에, JPA가 변경을 감지하고 자동으로

update가 된다.

 

(3) 병합방법

위의 코드에서 그냥 book을 영속성 컨텍스랑 merge를 해준다. 그러면 JPA는 기존의 영속성 컨텍스트에 있던 book을 새롭게 만든 book으로 바꿔치기한다.

 

여기서 병합 방법이 엄청 안좋다. 이유는, 병합할 때 어떠한 값이 null이라고 해도 무시하고 그냥 넣어버리기 때문이다.

가능하면 merge는 피해주자!

 

- 그러면 변경감지 방법이 안전하다는 것을 느꼈다. 코드를 좀 더 간단하게 해보자.

/**
     * 상품 수정
     */
    @PostMapping(value = "/items/{itemId}/edit")
    public String updateItem(@PathVariable Long itemId, @ModelAttribute("form") BookForm form) {
        /*Book book = new Book();
        book.setId(form.getId());
        book.setName(form.getName());
        book.setPrice(form.getPrice());
        book.setStockQuantity(form.getStockQuantity());
        book.setAuthor(form.getAuthor());
        book.setIsbn(form.getIsbn());
        itemService.saveItem(book);*/

        itemService.updateItem(itemId, form.getName(), form.getPrice(), form.getStockQuantity());
        return "redirect:/items";
    }

어설프게 Book 객체를 만들지 말고, form을 그대로 넘겨서

Service에서 바로 처리한다.

 

본 강의는 인프런의 김영한 개발자님이 강의하고 계신

"실전! 스프링 부트와 JPA활용1 - 웹 애플리케이션 개발"을 수강하면서 정리한 글입니다.

300x250
Comments