TIL- Bean 생명주기, API 예외처리, JPQL, fetch join (Spring 심화 3주차)_25.04.17

kb·2025년 4월 17일

Spring

목록 보기
17/21

구성

- 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의 연결은 아주 중요한 개념이니 주기적으로 이 개념을 꺼내보면서 익혀야겠다. 고생했다!
profile
Experience

0개의 댓글