스프링 부트와 JPA 활용1 - 상품 도메인 개발 2

11678 단어 SpringbootJPAJPA

📌 스프링 부트와 JPA 활용1 - 상품 도메인 개발 2

인프런 - 스프링 부트와 JPA 활용1 by 김영한 을 기반으로 작성된 글입니다.
실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발


상품 도메인 개발 목차

1. 상품 엔티티 개발(비즈니스 로직 추가)

2. 상품 리포지토리 개발

3. 상품 서비스 개발


구현 기능

  • 상품 등록
  • 상품 목록 조회
  • 상품 수정

2. 상품 리포지토리 개발

1) 상품 리포지토리 (ItemRepository.java)

💻 코드

package jpabook.jpashop.repository;

import jpabook.jpashop.domain.item.Item;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;

import javax.persistence.EntityManager;
import java.util.List;

@Repository
@RequiredArgsConstructor
public class ItemRepository {

    private final EntityManager em;

    /*상품 저장*/
    public void save(Item item){
        //em.persitst - 신규 등록
        if (item.getId() == null){
            em.persist(item);
        } else{
            //update 
            em.merge(item);
        }
    }

    public Item findOne(Long id){
        return em.find(Item.class, id);
    }

    public List<Item> findAll(){
        return em.createQuery("select i from Item i", Item.class)
                .getResultList();
    }

}

📍 기능 설명

1) 기능

  • save()
    • em.persist() - 신규 등록
      Item은 JPA에 저장하기 전까지 id 값이 없다 👉 새로 생성한 객체라는 뜻
    • em.merge() - 이미 DB에 저장된 데이터 update 한다는 뜻으로 간단히 생각

3. 상품 서비스 개발

2) 상품 서비스 (ItemService.java)

상품 리포지토리에 단순히 위임만 하는 클래스

💻 코드

package jpabook.jpashop.service;

import jpabook.jpashop.domain.item.Item;
import jpabook.jpashop.repository.ItemRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class ItemService {

    private final ItemRepository itemRepository;

    @Transactional
    public void saveItem(Item item){
        itemRepository.save(item);
    }

    /*상품 조회*/
    public Item findOne(Long itemId){
        return itemRepository.findOne(itemId);
    }

    public List<Item> findItems(){
        return itemRepository.findAll();
    }

}

📍 설명

1) 기술

  • saveItem() 의 @Transactional
    : 전체 코드가 @Transactional(readOnly = true) 이기 때문에
    item을 저장해야 하는 메서드인 saveItem()이 DB 에 저장이 안된다.
    메서드에 가까이 있는 어노테이션이 우선권을 가지기 때문에
    메서드 위에 @Transactional 을 작성하여 오버라이딩 했다.

좋은 웹페이지 즐겨찾기