220818_TIL : @Query / 양방향과 단방향

백승한·2022년 8월 18일
0

@Query

개발자가 원하는 쿼리를 직접 짜야 하는 그런 상황이 올 때 @Query 는 아주 강력하다.

@Query는 실행할 메서드 위에 정적 쿼리를 작성 한다.
여기 들어가는 쿼리는 JPQL 이라는 쿼리가 들어가야 한다.

JQPL

Java Persistence Query Language 인 JPQL은 객체지향 쿼리로 JPA가 지원하는 다양한 쿼리 방법 중 하나이다.

  • SQL과 JPQL의 차이점
    • SQL - 테이블을 대상으로 쿼리
    • JPQL - 엔티티 객체를 대상으로 쿼리

이는 JPA가 탄생한 이유인 임피던스 불일치를 해결하려는 노력의 일환 같다.

쿼리문 내부에 다음과 같이 참조변수.필드 와 같은 형태로 사용된다.

파라미터 바인딩 시키기

이름 기반으로 파라미터 바인딩을 하고 파라미터에 @Param("") 어노테이션으로 메서드에 들어오는 파라미터가 어떤 이름으로 지정될 지 정할 수 있다.

ex 1)

@Query("select u from User u where u.username = :name")
List<User> methodName(@Param("name") String username);

ex 2)

@Query("SELECT u FROM User u WHERE u.username LIKE %:char% and u.age > :maxAge")
List<User> findByLetterWithConditions(@Param("char") char letter,
                                          @Param("maxAge") int age);
}

양방향과 단방향

단방향 연관관계가 객체지향적으로 봐도, 관심사로 봐도 훨씬 이득이 많다.

그래도 우리는 양방향을 사용해야 하는 어쩔 수 없는 상황들이 생기게 된다.

그럼 다음을 기억하자

  • 양방향 연관관계가 될 때 외래 키를 관리하고 있을 주체를 확실히 할 것
    • 외래 키를 갖는 주체는 DB 테이블에 외래 키가 있는 쪽으로 한다.
    • 외래 키를 갖는 쪽에서만 UPDATE와 INSERT 를 수행하고,
      없는 쪽은 SELECT 만 수행할 것
  • 양방향 연관관계에서 상호 참조를 주의할 것
    • Lombok 의 @ToString
      • @ToString(exclude = "") 를 이용하여 해결
  • MVC 에서 JSON Converting 될 때
    - 엔티티를 통신에서 그대로 사용하지 말고 DTO 객체를 만들어서 사용할 것

반환 타입에 따른 페이징 결과

profile
방문해주셔서 감사합니다🙂

0개의 댓글