구성
- Bean 생명주기 - API 예외처리 - JPQL - fetch join - Spring Data JPA와 JPQL
백지정리 & 피드백
Bean 생명주기
- Bean은 Application이 실행될 때 자동으로 생성되고 Application 종료 시 삭제되었던 것으로 기억
- Dr.G 피드백
API 예외처리
- @ControllerAdvice or @RestControllerAdvice를 통해 ExceptionHandler Class위에 어노테이션을 붙여주고, application 위에 application 전역에서 발생한 Exception들을 ControllerAdvice에서 처리하도록 하는 어노테이션을 붙여주면 ExceptionHandler가 Exception들을 다 잡아서 처리해줄 수 있다~
- Controller / Service / Repository 전반에서 발생하는 Exception들을 다 잡아줌
- 단, 필터는 못 잡아줌!
- GlobalExceptionHandler를 사용하면 에러코드를 효율적으로 관리할 수 있고, 어디에서 어떤 에러가 났는지 파악하기가 수월해져 유지 보수 관점에서도 장점이 있음!
- Dr.G 피드백
JPQL
- SQL의 JPA에 적용한 버전!
- select 약칭 from 필드명 (as) 약칭 where 조건 group by 집계조건 Having 출력 조건 order by 정렬 조건 이렇게 사용했던 듯
- Entity와 필드가 대상임. SQL과 유사한 문법으로 사용함.
- query를 짜서 em(entityManager).find(query, 삐리리) 이렇게 날려주면 쿼리를 반환함
- Type Query와 일반 Query로 나뉘는데, Type Query는 반환 받는 쿼리의 타입이 명확할 때 사용. 반대로 불명확할 때는 Query 사용 가능. 허나 대부분 Type Query를 사용함
- 쿼리 결과가 리스트일 경우 List resultList = 쿼리.getResultList()와 같이 받아올 수 있음. 쿼리 결과가 하나일 경우 타입 인스턴스명 = 쿼리.getSingleResult();로 받아올 수 있음
- 프로젝션(목차 보고 적음)은 필드 전체가 아니라 일부만 갖고 올 수 있다는 내용이었던 듯. 그래서 이름이 프로젝션(Projection).
- Paging은 데이터 중 일부만 받아오는 방식. 쿼리.setFirstResult(N).setFinalResult(N')이런식으로 시작/끝 데이터의 인덱스를 적어줬던 듯?
- SQL처럼 Join 구문도 사용 가능함. 서로 다른 두 테이블을 Join 구문으로 합친 다음 결합한 테이블의 필드를 가져올 수 있음.
- Case ... Case When (조건) Then (결과) ... End 방식으로 필드의 조건에 따라 결과값을 다르게 반환해 출력할 수도 있음. Case 쿼리짤 때 띄어쓰기 잘 해야 함. \n과 +로 줄바꿈 적절히 해주면서 쿼리를 짜줘야 함.
- 함수 ... sum, avg, max, min 이런 집계함수 사용 가능함.
- Dr.G 피드백
fetch join
- fetch join은 N+1 문제를 해결하는 방법임!
- 두 Entity에 연관관계가 있고, 한 Entity를 통해 연결된 Entity의 값을 조회하는 경우 Entity뿐만 아니라 연결된 Entity도 조회하게 되어 쿼리가 N+1번 실행되게 됨
- fetch join으로 묶으면, 해당 테이블의 값을 호출할 때만 쿼리가 실행되는 방법이었던 듯.
- @BatchSize로 불러올 테이블의 데이터 수도 제한할 수 있었음. Oracle에서는 Rownum 사용
- Dr.G 피드백
Spring Data JPA와 JPQL
- 아주 복잡한 쿼리에는 JPQL을 사용하기 어려움. 그럼에도 DB에 직접 접근하지 않고 Entity 단위에서 DB 처리와 유사한 처리를 할 수 있어 독립적으로 운영하기 좋음
- Dr.G 피드백
정리
- 전반적으로 큰 틀에서는 이해하고 있는 것 같은데, 세부적인 내용(Embedded Type, Projection, Paging, Join, Case, 함수, fetch join, @PostConstruct활용 등)에서 빈 틈이 많이 보인다. 아주 모호하게 정리했다고 느껴진다. BE와 DB의 연결은 아주 중요한 개념이니 주기적으로 이 개념을 꺼내보면서 익혀야겠다. 고생했다!