Spring boot에서 JPA를 편하게 사용하기 위해 만들어 놓은 것.
DTO <-> Entity 객체로 변경해준다.
** 사용
* 하나를 바꿀 때
modelMapper.map(menuEntity, MenuDTO.class);
* 여러 개 (List)
menuList.stream().map(menu -> modelMapper.map(menu, MenuDTO.class)).collect(Collectors.toList());
--BeanConfiguration--
@Bean
public ModelMapper modelMapper(){
return new ModelMapper();
}
private EntityManager entityManager; -> Service에서 만들어서 인자로 넘겨줘도 되고,
Repository에서 만들어도 되는데, 결국 다 빠지게 되서 상관없음.
핵심은 @persistenceContext를 해주는 것. -> factory / init / close 메소드로 계속
만들어 줬던 일련의 작업을 대신해준다. ->편-리
->스프링부트가 영속성 컨텍스트를 관리하는 엔티티 매니저를 가져온다. jpa에서 사용하는 형식대로 쓰겠다.
@EnableJpaRepositories(basePackages = "com.greedy.data")
//-> JpaRepository를 상속받은 인터페이스들을 스캔 후
// 사용할 클래스들로 동적으로 생성해 준다
ex)
// Repository를 interface로 만들고
extends JpaRepository<Category, Integer>{
@Query(value = "쿼리문", nativeQuery = true)
public List<Category> findAllCategory();
// 사용 -> categoryRepository.findAllCategory();
}
Repository <- CrudeRepository <- PagingAndSortingRepository <- JpaRepository
long count() : 모든 엔티티의 개수 리턴
void delete(Id) : 식별 키를 통한 삭제
void delete(Iterable<? Extends T> : 주어진 모든 엔티티 삭제
boolean exist(ID) : 식별 키를 가진 엔티티가 존재하는지 확인
findAllById(Iterable<Id> ids) : id에 해당하는 모든 엔티티 목록 리턴
findAll() : 엔티티 전체 목록 리턴
Iterable<T> findAll(Iterable<ID>) : 해당 식별 키를 가진 엔티티 목록 리턴
Optional<T> findById(ID) : 해당 식별 키에 해당하는 단일 엔티티 리턴 (T: Type)
-> Optional : 1.8에 추가된 NPE방지 객체 타입.
saveAll<Iterable> : 여러 엔티티들을 한 번에 등록, 수정
<S extends T> save : 하나의 엔티티를 등록, 수정
정렬(Sort.by) :
List <Menu> menuList = menuRepository.findAll(Sort.by("menuCode").descending());
//ascending이 default
//order by 기준의 컬럼의 필드명
JPQL을 메소드로 대신 처리할 수 있도록 제공하는 기능.
메소드의 이름으로 필요한 쿼리를 만들어주는 기능으로 "find + 엔티티명 + By + 변수이름"과 같이 네이밍 룰만 알면 사용 가능하다.
(※엔티티명은 생략가능 왜? 밑에 JpaRepository<Menu 로 넣어줬기 때문.)
- AND ex) findByCodeAndName : where x.code = ?1 and x.name = ?2
- Or ex) findByCodeOrName : where x.code = ?1 or x.name = ?2 <br>
- Between ex) findByPriceBetween : where x.price between ?1 and ?2
- LessThan ex) findByPriceLessThan : where x.price < ?1
- LessThanEqual ex) findByPriceLessThanEqual : where x.price <= ?1
- GreaterThan ex)findByPriceGreaterThan -> where x.price > ?1
- GreaterThanEqual ex) findByPriceGreaterThanEqual -> where x.price >= ?1
- After ex) findByDateAfter -> where x.date > ?1 // 특정 날짜 이후
- Before ex) findByDateBefore -> where x.date < ?1 // 특정 날짜 이전
- IsNull ex) findByNameIsNull -> where x.name is null
- IsNotNull, NotNull ex) findBynameNotNull -> where x.name is not null
- Like ex) findByNameLike -> where x.name Like ?1
- NotLIke ex) findByNameNotLike -> where x.name not like ?1
- StartingWith ex) findByNameStartingWith -> where x.name like ?1||'%' //~로 시작하는
- EndingWith ex) findByNameEndingWith -> where x.name like '%'||?1 // ~로 끝나는
- Containing ex) findByNameContaining -> where x.name like '%'||?1||'%' //~를 포함하는
- OrderBy ex) findByPriceOrderByCodeDesc -> where x.price = ?1 order by desc
- Not ex) findByNameNot -> where x.name <> ?1
- In ex) findByNameIn(Collection<name> names) -> where x.name in (?1)
- // collection객체를 인자로 주면 순환을 돌면서 , ,를넣어서 in연산자로 처리를 해줌
*등록하기 (save)
@Transactional
public void registNewMenu(MenuDTO newMenu){
menuRepository.save(modelMapper.map(newMenu, Menu.class)); // 엔티티화(영속화)
} //엔티티타입변환
*수정하기(find + set)
@Transactional
public void modifyMEnu(MenuDTO menu){
Menu foundMEnu = menuRepository.findById(menu.getMenuCode()).get();
foundMenu.setMenuName(menu.getMenuName());
}