JPA-Spring-Data 복습

-·2023년 12월 8일
0

JPA-Spring-Data

Spring boot에서 JPA를 편하게 사용하기 위해 만들어 놓은 것.

Entity클래스 설계 방법

  1. 데이터베이스를 그대로 설계
  2. 업무별로 나눠서 설계

ModelMapper (api)

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();
}

PersistenceContext

private EntityManager entityManager; -> Service에서 만들어서 인자로 넘겨줘도 되고,
Repository에서 만들어도 되는데, 결국 다 빠지게 되서 상관없음.

핵심은 @persistenceContext를 해주는 것. -> factory / init / close 메소드로 계속 
만들어 줬던 일련의 작업을 대신해준다. ->편-리
->스프링부트가 영속성 컨텍스트를 관리하는 엔티티 매니저를 가져온다. jpa에서 사용하는 형식대로 쓰겠다.

JpaConfiguration

@EnableJpaRepositories(basePackages = "com.greedy.data")
//-> JpaRepository를 상속받은 인터페이스들을 스캔 후 
//   사용할 클래스들로 동적으로 생성해 준다

ex)
// Repository를 interface로 만들고
extends JpaRepository<Category, Integer>{

       @Query(value = "쿼리문", nativeQuery = true)
    public List<Category> findAllCategory();
    // 사용 -> categoryRepository.findAllCategory();
}

Repository 인터페이스들의 상속 구조

Repository <- CrudeRepository <- PagingAndSortingRepository <- JpaRepository

  • Repository : 기능이 거의 없음
  • CrudeRepository : 기본적인 CRUD 기능을 제공한다.
  • PagingAndSortingRepository : 페이징 및 정렬 처리하고자 할 경우 사용
  • JpaRepository : Spring data Jpa에서 추가한 기능을 사용하고자 할 때 사용.

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());
}
  • 기타
    JPA는 한 번에 쿼리문을 다 날리기 때문에(지연로딩) 순서대로 insert등을 했을 때 순서가 꼬이는 경우가 있다.
    이때 jpql을 사용해야 한다. (요청 때마다 쿼리문을 날리기 때문에 순서대로 작동한다.)
    jpql은 flush를 한다는 것.

profile
신입 개발자의 개인 공부 공간입니다

0개의 댓글