본문 바로가기

Spring/JPA34

JpaRepository 와 CrudRepository 의 차이점 JPA 를 사용할 때 JpaRepository 인터페이스를 상속해서 사용했는데, 다른 강의에서는 CrudRepository 를 사용해 어떤 차이점이 있는지 궁금해 정리했다. JpaRepository 와 CrudRepository 모두 CRUD 기능을 기본적인 메서드를 지원해준다. 위 관계를 보면 JpaRepository 가 CrudRepository 보다 더 많은 기능을 가진 것을 예상할 수 있다. CrudRepository 는 CRUD 관련 기능들만 기본적으로 제공한다. JpaRepository 는 JPA 관련 특화된 기능을 추가로 제공한다 ( 페이징, sort 등 ) 추가적으로, findAll() 메서드를 사용할때 CrudRepository 는 Iteratable 를 반환하지만, JpaReposito.. 2022. 12. 4.
JPA 순환 참조 해결해보기 쇼핑몰 개인프로젝트 구현 중 순환참조가 발생했다. 먼저 순환참조에 대해 알아보면, 순환 참조(Circular reference)란, 참조하는 대상이 서로 물려 있어서 참조할 수 없게 되는 현상을 말한다. 이전 JPA 강의를 들으면서 순환참조는 자주 발생한다 라고 해서 어떤건지 개념만 알고 있었는데, 처음 직접 마주치니 해결방법이 바로 떠오르지 않아 구글링을 통해 해결했다. 구현하고 싶었던 것은, 상품을 조회했을 때 goodsReponse 대로 응답을 내려주는 것인데 이 과정에서 순환 참조가 발생했다. 이 부분 중 imageList 와 options 부분에서 발생했다. public class Goods extends BaseTimeEntity { ... @OneToMany(mappedBy = "goods".. 2022. 11. 30.
data.sql 적용하기 (스프링부트 버전 2.7.x 이상 ) application.yml 기준 spring: jpa: defer-datasource-initialization: true # 더미 데이터 적용 sql: init: mode: always # 더미 데이터 적용 resources 폴더 아래 data.sql 생성 DB에 먼저 넣어두고 싶은 sql 문을 작성해서 실행하면 완료. insert into ROLE (role) values ('USER'); 참고 https://devvkkid.tistory.com/262 data.sql이 동작하지 않을 때, 의심해봐야 할 것 스프링에서 test 패키지 내부에 data.sql을 넣은 것만으로도 data.sql 내부의 쿼리를 실행시킬 수 있다. 이런 방법으로 테스트용 더미 데이터를 생성하고 테스트를 동작시킬 수 있다. .. 2022. 11. 10.
@OneToOne 는 1:1 을 보장하지않는다 + unique 제약조건 @OneToOne ( 1:1 ) 매핑을 하면 데이터 입력 시 1:1 을 보장할까?? 위의 내용에 대해 테스트를 해보았다. Member 클래스, Locker 클래스가 있다. 조건은 Member 1명당 1개의 Locker만 사용할 수 있다. Member 클래스가 연관관계의 주인이 되며, Locker 클래스에서는 mappedBy를 사용해 양방향으로 연결해준다. 테스트 내용 : 1명의 락커에 1명 이상의 멤버가 들어가는지 확인한다. public class Member { @Id @GeneratedValue @Column(name = "member_id") private Long id; private String username; @OneToOne @JoinColumn(name = "locker_id") priv.. 2022. 10. 17.
Where 다중 파라미터 사용 - 동적쿼리 동적쿼리를 다룰 수 있는 방법 2번째이다. 첫번째는 BooleanBuilder를 사용한 방법이였다. //Where 다중 파라미터 사용 @Test void 동적쿼리_whereParam() { String username = "member1"; Integer ageParam = 10; List result = searchMember2(username, ageParam); assertThat(result.size()).isEqualTo(1); } searchMember2 메서드를 확인해보면 아래와 같다. // 메서드 명으로 쉽게 의도를 알아차릴 수 있다. private List searchMember2(String usernameCond, Integer ageCond) { return queryFactory .. 2022. 10. 12.
BooleanBuilder - 동적 쿼리 쿼리 조건 설정인 where 뒤에 조건을 추가해줄 때 사용한다. // 동적쿼리 @Test void dynamicQuery_BooleanBuilder() { String username = "member1"; Integer ageParam = 10; List result = searchMember1(username,ageParam); assertThat(result.size()).isEqualTo(1); } username 이 member1 , age 가 10 인 회원을 찾는다고 할때, 위와 같이 searchMember1 이라는 메소드를 생성해 작성할 수 있다. searchMember1 메소드는 아래와 같다. private List searchMember1(String usernameCond, Intege.. 2022. 10. 12.
JPQL 과 QueryDsl 의 차이 (기초) 코드 작성에 효율적이며, JPQL 에 없는 큰 장점이 몇가지 있다. 1. 컴파일단계에서 에러를 잡아준다. -> 자바 문법으로 작성하는 QueryDsl 은 컴파일 오류로 잡을 수 있다. 2. 자동완성 기능이 뛰어나다. -> 메서드가 생각이 나지 않을때 자동완성 기능을 쉽게 사용할 수 있다. 3. 동적 쿼리 작성이 효율적이다 -> 아직 학습하지 않아서 다음에 포스팅. Entity 클래스는 생략. JPQL 코드 @Test public void startJPQL() { // member1을 찾아라 String qlString = "select m from Member m " + "where m.username = :username"; Member findMember = em.createQuery(qlString.. 2022. 10. 9.
Querydsl 설정 설정 - gradle 의 빌드 및 테스트 실행 방법에 따라 검증방법이 상이하다. gradle 에 추가하는 방법은 동일 gradle 추가 // Querydsl 추가 시작 implementation 'com.querydsl:querydsl-jpa' implementation 'com.querydsl:querydsl-core' annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jpa" annotationProcessor "jakarta.persistence:jakarta.persistence-api" annotationProcessor "jakarta.annotat.. 2022. 10. 9.
쿼리메소드 - 정렬처리 정렬처리하는 방법 메소드로도 가능하지만, List findByNameOrderByPrice(String name); 너무 길어지면 보기힘들다는 단점이 있어 파라미터로 생성한다. 그리고, 한가지 조건만이 아닌 여러 조건도 충족할 수 있는 장점이 있다. public interface ProductRepository extends JpaRepository { List findByName(String name, Sort sort); } 테스트 코드 @Test void sortingAndPagingTesT() { Product product1 = new Product(); product1.setName("펜"); product1.setPrice(1000); product1.setStock(100); product.. 2022. 10. 9.