1. 지연 로딩
* JPA는 연관관계가 설정된 Entity의 정보를 바로 가져올지, 필요할 때 가져올지 정할 수 있다.
* 이 가져오는 방법을 JPA에서는 Fetch Type 이라하고 2가지가 있는데
- LAZY는 지연 로딩으로 필요한 시점에 정보를 가져온다.
- EAGER는 즉시 로딩으로 즉시 가져온다.
* Entity 연관관계 어노테이션들인 @OneToMany,@ManyToOne들은 default로 지연인지,즉시인지 기본값이 있는데
여기에서 TO 뒤에 오는 부분 One 이면 즉시 로딩 , Many면 지연 로딩 이렇게 보면 된다.
*보통 to뒤에 many인것들은 해당 필드가 리스트 형식이라 정보가 여러개 들어있을수도 있으니
지연 로딩이다. 반대로 one이면 해당 정보가 한개뿐이니 즉시 가져와도 무리가 없어서 즉시 로딩이다.
*기본 default설정들이 있지만 내가 원하는거로 바꾸고 싶을땐 연관관계 어노테이션에
(fetch = FetchType.변경할 타입) 변경할 타입엔 LAZY 아니면 EAGER
하지만 이때는 지연 로딩된 Entity 정보를 조회 할때는 영속성 컨텍스트가 존재해야한다.
영속성 컨텍스트가 존재해야한다’라는 의미는 결국 ‘트랜잭션이 적용되어있어야 한다’라는 의미와 동일, 그러므로 작업하는 메소드에 클래스에 @Transactional 있어야한다.
2. 영속성 전이
* N:1의 상황에서 주인이 아닌쪽인 고객이 음식의 정보들 N개를 리스트 형식으로 갖고 있을때
이제 작업시 해당 Entity객체들 생성하고 필드에 값 넣어 주고 저장할때 다 일일이 save() 해줘야 하는데 귀찮으니 고객 Entity저장할대 연관된 음식 Entity까지 자동 저장 할 수 있는 CASCADE의 PERSIST 옵션을 설정 하면된다.
이방법을 영속성 전이라 한다. (삭제 작업도 포함)
* 고객 Entity의 @OneToMany 애너테이션에 @OneToMany(mappedBy = "user", cascade = CascadeType.PERSIST)
cascade = CascadeType.PERSIST 이거를 해주면 고객을 저장할때 연관된 음식 Entity도 자동 저장이 된다.
* 어떤 해당 고객을 삭제 할시 그 고객이 주문한 음식도 동시에 삭제할때는 cascade = CascadeType.REMOVE 이고
PERSIST, REMOVE 동시에 적용할때는 ↓ { } 안에 넣어준다.
3. 고아 Entity 삭제
* N:1의 관계로 음식:고객에서 음식 주인일때 고객은 리스트로 음식의 객체들을 담고 있는데
예를들어 A유저가 리스트에 치킨,피자 갖고 있을때 치킨을 삭제 하려하면 A의 정보를 가져오고 A의 음식 정보 리스트에서 치킨을 선택후 JpaRepository의 delete()를 이용해서 삭제 하는 작업까지 했는데
그냥 자바의 리스트에 있는 값 remove()로 삭제 할시 자동으로 데이터 베이스에도 그 값을 삭제해주는 방법이 있다.
orphanRemoval 옵션을 사용하면 된다.
* orphanRemoval = true 해주고 foodList에서 해당값 선택후 리스트에서 그 값을 삭제해주면 자동으로
Delete SQL이 수행되어 DB에 데이터가 삭제된 것을 확인할 수 있다.
* orphanRemoval 는 CascadeType.REMOVE 기능도 포함하고 있다.
음식 테이블에서 Robbie가 주문한 음식들 pk1~3번 일경우 Robbie를 삭제하면 Robbie가 주문한 음식 1~3도 같이 삭제.
4. Schedule
* 서버 동작중 내가 설정한 시간마다 해당 기능이 자동으로 동작하도록 하는것.
1) 적용하기 위해 해당 애플리케이션 파일쪽에 @EnableScheduling 설정해준다 (예전 생성,수정 시간 자동으로 기록해주는 기능때처럼)
2) 자동으로 해당 시간에 동작 하게 하려는 기능쪽에 @Scheduled 설정해준다.
괄호안에 설정한거는 몇시에 동작하도록 한건가 하는건데 나중에 필요하면 그부분은 ↓ 링크에서 확인
스프링 공식 문서 -> 시간 설정방법
5. 페이징 및 정렬
* 클라에서 page( int형 조회할 페이지 번호 1부터 시작) , size ( int형 한페이지에 보여줄 데이터 개수),
sorBy(String형 정렬 항목 id순,가나다순,해당값순등) , isAsc ( boolean형 or int형 오름차,내림차순) 이 4개의 값을 쿼리스트링으로 보낸다.
이걸 받은 서버는 page는 -1 해줘야한다.(보통 웹페에지에서 페이징은 1부터 시작이지만 서버에서는 0부터 처리하니)
* 한페이지에 데이터가 여러개이니 Page인터페이스 이용한다.
* Pageable은 페이징,정렬 처리하기 위해 사용하는 인터페이스고,PageRequest는 해당 인터페이스의 구현체이다.
* PageRequest 매개변수 첫번째부터 시작할 페이지,페이지에 데이터 갯수,정렬방법을 넣는다
* 생성한 Pageable 구현체를 레포지토리쪽 쿼리메소드로 전달하면 Page타입으로 반환한다.
* Page 인터페이스에서 map 이라는 converter 있는데 쉽게 객체 변환 해준다
'Spring' 카테고리의 다른 글
Spring_5주차-(2) (0) | 2023.12.04 |
---|---|
Spring_5주차-(1) (0) | 2023.11.28 |
Spring_4주차-(1) (0) | 2023.11.10 |
Spring_3주차-(1) (0) | 2023.11.07 |
Spring_2주차-(2) (0) | 2023.11.02 |