TIL/Spring

TIL 2024-11-27 (Spring 심화 - 활용)

myoma 2024. 11. 27. 22:10

1 ) 학습한 내용

  • Bean
  • API 예외처리
  • JPQL
  • fetch join
  • JPA 와 JPQL

 


 

  • Bean
    • 생명주기
      1. Spring Container 초기화
      2. Bean 인스턴스 생성
      3. 의존성 주입
      4. 초기화 메서드 호출
      5. Bean 사용
      6. 소멸 메서드 호출
      7. Bean 소멸
    • 속성
      • Bean이 Spring 내부적으로 구현된 코드에 의존하지 않는다.
      • 메서드 이름을 자유롭게 설정할 수 있다.
      • 외부 라이브러리에도 초기화, 종료 메서드를 적용할 수 있다.
    • @PostConstruct
      • Bean이 생성되고 의존성 주입이 완료된 후에 호출되는 메서드를 지정
      • 주로 초기화 작업을 할 때 사용
    • Bean Scope
      • Singleton(싱글톤)
        • 기본으로 설정되는 스코프.
        • Spring 컨테이너 내에서 Bean이 하나만 생성되고 모든 요청이 같은 객체를 사용
        • 상태를 가지면 안된다.
      • prototype
        • 요청할 때 마다 새로운 인스턴스 생성
        • 필요한 의존관계 주입
        • 상태를 가지는 객체
      • Webscope
        • request
          • HTTP 요청마다 새로운 Bean 생성
          • 웹 요청이 들어오면 Bean 생성되고 요청이 완료된다.
          • 요청 데이터를 처리하는 객체
        • session
          • HTTP 세션 동안 하나의 Bean 인스턴스 유지
        • application
          • 서블릿 컨텍스트 내에서 Bean이 단일 인스턴스로 존재
          • 애플리케이션 구동되는 동안 동일한 객체가 유지

 

 

  • API 예외처리
    • @ExceptionHandler
      • 특정 컨트롤러에서 발생한 예외를 처리하기 위한 메서드를 지정
      • 단일 컨트롤러 내에서 예외를 처리
      • 계층별로 알맞은 예외를 발생 시키기만 하면된다.
      • 문제점
        • 코드 재사용, 유지보수성 부족
        • 단일 컨트롤러 내의 예외처리만 가능
        • 단일 책임 원칙 위반.
    • @ControllerAdvice
      • @RestControllerAdvice
        • 반환 값이 JSON이다.
        • REST API의 예외를 처리한다.

 

 

  • JPQL 
    • JPQL
      • 객체지향 쿼리 언어
      • Entity 객체를 대상으로 SQL Query를 작성할 수 있도록 도와준다.
      • SQL 추상화
      • 타입 안정성
      • 정적 쿼리 최적화
    • QueryDSL
      • Java 기반의 ORM 쿼리 빌더 라이브러리
      • 동적 쿼리를 지원한다.
    • JPA Criteria
      • JPQL과 유사한 쿼리를 코드로 생성할 수 있다.
      • 복잡하고 실용성이 없어서 QueryDSL을 사용한다.
    • Native SQL 
      • JPA가 제공하는 SQL을 직접 사용하는 기능

 

  • JQPL 기본 문법
    • 문법 규칙
      • 테이블 이름이 아닌 Entity 이름을 사용한다.
      • Entity와 필드는 대소문자를 구분한다.
      • JPQL 키워드는 대소문자 구분하지 않는다.
      • 별칭은 필수이고 as는 생략이 가능

 

 

  • fetch join
    • SQL의 Join과 비슷하지만 연관된 엔티티나 컬렉션을 한 번의 쿼리로 함께 로드하는 기능
      • 지연 로딩 설정된 엔티티도 fetch join으로 사용할 수 있다.
    • N + 1 문제 해결할 수 있다.
    • 데이터의 중복이 발생할 수 있다. (DISTINCT)
    • 컬렉션 페이징 처리가 힘들다.
    • 조회 시 여러 테이블이 Join 된다면 일반 Join을 사용하면 된다.

 

 

  • JPA 와 JPQL
    • Spring Data JPA
      • Query Methods 만으로는 조회하기 힘든 경우가 많다.
      • N + 1 문제가 발생한다.
      • Spring Data JPA 에도 JPQL을 적용할 수 있다.
      • @Query Annotation을 사용한다.
      • @Param을 사용하여 파라미터 바인딩한다.