ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 상품 리포지토리, 서비스 개발
    JPA/JPA 활용 2023. 7. 11. 18:10

    ItemRepository class

    @Repository
    @RequiredArgsConstructor
    public class ItemRepository {
        
        private final EntityManager em;
        
        public void save(Item item) {
            if (item.getId() == null) {
                em.persist(item); // 새로 생성된 객체는 persist (신규로 등록)
            } else {
                em.merge(item); // update 비슷한건데 나중에 공부하고 일단 넘어가기
            }
        }
        
        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(); // 여러개 찾을 때에는 JPQL 작성
        }
    }

    Item의 저장소인 ItemRepository 클래스이다. save 메서드에 getId가 없으면 persist로 저장했고, id가 이미 있으면 merge를 사용했다. merge는 update 비슷한 개념인데, 다음 강의에서 설명할 예정이라 일단 업데이트 비슷하게 이해하고 넘어간ㄷ고 했다.

    findOne과 findAll 메서드는 id를 이용해서 하나를 찾거나 모두 찾아주는 메서드이다. 하나를 찾을 때에는 em.find로 찾아주면 되고 여러개를 찾을 때에는 JPQL을 작성해줘야한다.

     

     

     

    ItemService class

    @Service
    @Transactional(readOnly = true)
    @RequiredArgsConstructor
    public class ItemService {
        
        private final ItemRepository itemRepository;
        
        @Transactional // 단순히 읽는게 아니라 쓰기도 필요하면 readOnly = false(default)
        public void saveItem(Item item) {
            itemRepository.save(item);
        }
        
        public Item findOne(Long itemId) {
            return itemRepository.findOne(itemId);
        }
        
        public List<Item> findItems() {
            return itemRepository.findAll();
        }
    }
    

    Service 계층은 Repository에 있는 기능들을 단순히 Controller에 연결시키기 위한 계층이다. 나중에 생략을 하고 싶으면 컨트롤러에서 바로 리포지토리의 기능들을 꺼내 써도 되지만 여기서는 Service 계층에서 한번 트랜잭션 후 컨트롤러에 연결시켜줄 계획이다.

Designed by Tistory.