본문 바로가기

개인적으로 공부한 것을 정리해 놓은 블로그입니다 틀린 것이 있으면 댓글 부탁 드립니다!


반응형

JPA

(55)
Spring Data JPA Named query 기능 Named query 기능 -엔티티에 쿼리를 지정해놓고 메서드에서 불러다가 사용할 수 있다. 1.순수 JPA NamedQuery 기능 엔티티에 @NamedQuery 어노테이션을 통해 쿼리를 지정해준다 name에는 메소드명 , query에는 사용할 쿼리 리파지토리에 메서드를 만들어주고 createNamedQuery를 통해 엔티티에 지정해놓은 NamedQuery를 불러올 수 있다. 위에 메서드를 실행한 결과 쿼리다 유저네임이 where 절에 들어갔다. 스프링 데이터 JPA에서는 더 편리하게 위의 기능을 사용할 수 있다. 1.스프링 데이터 JPA에서 NamedQuery 사용 리파지토리 인터페이스에서 @Query를 사용해 엔티티에 지정해놓은 @NamedQuery를 불러온다 파라미터를 불러올 경우 @Param을 ..
Spring Data JPA query method 기능 query method 기능 - Spring Data JPA에 구현되지 않은 기능을 구현하고 싶을때 query method를 사용한다. - 메서드 이름을 통해서 쿼리를 만들어낸다. 위 메서드는 순수 JPA로 유저이름과 나이를 파라미터로 받아 유저이름이 일치하고 나이가 파라미터로 받은 나이 보다 많은 유저를 찾아내는 메서드이다 위는 spring data jpa에서 querymethod기능으로 만든 메서드다 메서드명을 통해 쿼리가 작성되고 파라미터가 바인딩 된다. 정해진 프로퍼티를 통해 작동하기 때문에 맞춰진 형식에 맞게 메소드명을 만들어야한다. 정해진 프로퍼티들 조회: find ... By ,read...By, query...By get...By count: count ...By -> long 타입 반환 ..
Spring Data JPA Spring에서 JPA를 더 편하게 사용하기 위해서 사용하는 라이브러리 인터페이스 형식으로 되있으며 구현체없이 인터페이스를 상속을 받아 기능들을 사용한다. 리파지토리를 인터페이스 형식으로 만들고 해당 리파지토리를 사용하는 곳에서 @Autowired를 통해 인젝션을 받을때 프록싱을 통해 객체를 생성하고 스프링 데이터 JPA가 자동으로 기능들이 내장되 있는 리파지토리를 만들어 인젝션해 준다. 라이브러리를 보면 spring data commons 가있고 spring data jpa가 있다 spring data commons는 공통 기능 저장되 있고 CrudRepository PagingAndSortingRepository 같은 것들이 있다 spring data jpa는 JPA관련 기능 저장되있고 JpaRepo..
JPA 패치조인 활용 패치조인 위의 이미지는 주문 내역을 불러오는 컨트롤러다 . 패치 조인을 사용하지 않고 위의 코드가 실행된다면 n+1 문제가 발생하여 쿼리가 5번 나간다 위에 코드에서 n은 주문 수를 나타내고 +1은 처음 주문을 불러오는 쿼리를 말다 주문수가 2개이고 연관된 테이블 수(회원,배송)에 따라 n번씩 추가가 되기떄문에 총쿼리수는 n+n+1 = 5 가 된다 이런 상황에서는 성능 최적화를 위해 패치조인을 사용하는 것이 좋다 . join fetch 연관된 엔티티명을 적어주면 조인을 통해 한번에 데이터를 불러오기 때문에 쿼리는 한번만 생성된다 . 패치조인은 join 으로 지정해놓은 테이블의 모든 데이터를 가져오기 때문에 selelct절이 길어진다 여기서 한번더 성능을 최적화 하기 위해서는 직접 쿼리를 짜는 방식을 사용..
SPRING - JPA를 활용한 API 개발 ( 권장하는 방법 ) 엔티티를 DTO로 변환하여 사용하는 방법 생성자로는 Order를 파라미터로 받아 order의 정보가 set되게 하였다. 데이터로 받은 리스트인 orders를 SimpleOrderDto에 파라미터로 order 엔티티를 넘기면 리스트에 담긴 order 엔티티가 하나씩 꺼내져서 SimpleOrderDto로 변환되고 .collect를 사용하여 다시 List에 담아준 후 리턴했다 **위처럼 List를 바로 반환하게되면 배열이 반환되기 때문에 API 확장성이 굳어 버리기 떄문에 감싸줄 수 있는 객체를 만들어 한번 감싸주는 것이 좋다 ex)@Data @AllArgsConstructor static class Result{ private T data } -장점 1.DTO의 필드는 곧 API 스펙이 되기 때문에 엔티티를..
SPRING - JPA를 활용한 API 개발 (비권장) -API개발 양방향 연관관계 주의점 1.API 개발시 양방향 연관 관계에서는 한쪽에 @JSONEgnore를 걸어 주지 않으면 Jackson 라이브러리에서 양쪽을 왔다갔다하며 JSON 데이터를 무한으로 만들어 무한루프에 빠지게된다 . 2.지연로딩(Lazy Loading) 으로 해놓을 시 Jackson 라이브러리가 프록시를 인식하지 못해 오류가 난다. -해결방법 bulid.gradle에 라이브러리를 등록해준다. 빈으로 등록시켜 애플리케이션 실행시점에 실행 되도록 빈으로 만든다 애플리케이션을 실행시켜 postman으로 테스트를 해보면 데이터를 가져오긴하나 레이지로딩이 무시되어 DB에 갔다 오지는 않기 때문에 DB에 저장된 데이터는 null로 표시되었다 -강제로 레이지 로딩을 시키는방법 Hibernate5Mod..
SPRING BOOT-JPA entity , repository 생성과 테스트 코드 생성 예시) 회원의 아이디와 이름를 담는 Entity를 만든다한다면 1.Member 클래스 생성 후 어노테이션 지정 @Entity :엔티티를 선언하는 어노테이션 @Getter @Setter : 롬복을 이용할때 getter,setter를 롬복이 생성하도록 하는 어노테이션 @Id : PK를 지정하는 어노테이션 @GeneratedValue : 아이디값을 자동 생성하는 어노테이션 위의 코드에서는 id 값이 PK가되고 자동으로 값이 들어가게된다. 2.MemberRepository 클래스 생성 후 어노테이션 지정 @Repository : 리파지토리를 지정하는 어노테이션 @PersistanceContext: persistance 컨텍스트 지정 EntityManager를 주입(DI)함 회원정보를 저장하는 save 메소드와 ..

반응형