[Spring Boot] JPQL / 페이징 처리 / join / 서브쿼리 / 애플리케이션 아키텍쳐

seulki·2022년 12월 13일
0

[springboot]

목록 보기
24/27

🎈페이징 처리

  • setFirstResult(int startPoint) : 조회 시작 위치(0부터 시작)
  • setMaxResults(int maxResult) : 조회 할 데이터 수
  • 몇 번째부터 몇 개를 가지고 올 것인지 설정
public static void main(String[] args) {

		EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
		EntityManager em = emf.createEntityManager();
		EntityTransaction tx = em.getTransaction();
		tx.begin();
		
		try {
			for(int i = 0; i < 100; i++) {
			
				Member member = new Member();
				member.setUsername("member" + i);
				member.setAge(i);
				em.persist(member);
			}
			
			em.flush();
			em.clear();

			// 페이징 처리
			String jpql = "select m from Member m order by m.id ";
			List<Member> resultList = em.createQuery(jpql, Member.class)
										.setFirstResult(10)
										.setMaxResults(20)
										.getResultList();
			
			System.out.println("result.size : " + resultList.size());
			
			for(Member member1 : resultList) {
				System.out.println("member1 = " + member1.toString());
				
			}
			     
			tx.commit(); 
		} catch (Exception e) {
			tx.rollback();
		}finally {
			em.close();
			emf.close();
		}
	}
  • 10번부터 20개 가져오기


🗝️ join

  • innerjoin -> inner는 생략가능
// 조인
String sql = "select m from Member m inner join m.team t where t.name = :teamName";
List<Member> resultList = em.createQuery(sql, Member.class).getResultList();


- left outer join
  // left outer join
String sql = "select m from Member m left outer join m.team t";
List<Member> resultList = em.createQuery(sql, Member.class).getResultList();



🗝️ 서브쿼리

  • JPA 서브쿼리 한계
    • where, having 절에서 사용 가능 -> JPA 표준 스펙
    • select 절에서도 가능 -> 하이버네이트에서 지원
    • from 절의 서브쿼리는 현재 JPQL에서 불가능하다.
String sql = "select m from Member m where m.age > (select avg(m2.age) from Member m2)";
List<Member> resultList = em.createQuery(sql, Member.class).getResultList();



🗝️ 애플리케이션 아키텍처

  • controller, web : 웹 계층
  • service : 비지니스 로직, 트랜잭션 처리
  • repository : JPA를 직접 사용하는 계층, 엔티티 매니저 사용
  • domain : 엔티티가 모여있는 계층, 모든 계층에서 사용 가능


  • service
    -> 트랜잭션 처리
  • 읽어만 오는 기능이라면, readOnly 옵션을 넣어줌으로써, crud 비용을 절감할 수 있다.

  • @Transactional(readonly = true) 가 계속 중복되기 때문에, 클래스 단위로 지정할 수도 있다. -> 변경 전

  • 변경 후
    -> readonly 조건이 아닌것만 @Transactional 어노테이션을 붙여준다.



  • repository
    -> EntityManager 사용
profile
웹 개발자 공부 중

0개의 댓글