Spring
-
ExistsBy쿼리를 직접 작성하기Spring 2022. 3. 4. 22:33
프로젝트 리팩토링을 진행하면서 연관관계의 데이터를 이용하여 데이터의 존재여부를 확인하는 경우가 필요하였다. JPA를 이용하면 "existsBy대상"을 통해서 작성하면 알아서 쿼리를 날려주지만, 나의 경우 처음에는 잘 작동하다가 갑자기 뒷부분의 toUserId 부분을 읽지 못하는 상황이 발생했다. (해당부분의 원인이 id를 Id로 작성하거나 대소문자의 구분이 잘 이루어지지 않아서(카멜표기법을 사용해야 함)라고 하여서 확인했으나 명확한 원인을 아직 발견하지 못했다. 😭) 우선 해결을 위하여 쿼리를 직접 구현해주어야 했다. existsBy 쿼리 작성 @Query(value = "SELECT CASE WHEN count(a) > 0 THEN true ELSE false END FROM Apple a WHERE ..
-
Validation failed for query for method public abstract 오류 발생시 (JPA)Spring 2022. 3. 4. 22:26
existsBy를 이용하여 연관관계의 데이터 아이디로 데이터 존재여부를 아는 쿼리를 작성하려고 할때 알맞은 쿼리임에도 쿼리 실패 오류가 발생했다. 기존의 코드 @Query(value = "SELECT CASE WHEN count(f) > 0 THEN true ELSE false END FROM Follow f LEFT JOIN FETCH f.fromUser a LEFT JOIN FETCH f.toUser b WHERE a.id=:fromUserId AND b.id=:toUserId") boolean existsByFromUserIdAndToUserId(Integer fromUserId, Integer toUserId); 기존코드를 보면 네이티브 쿼리로 작성되어 있으므로 수정한 코드 @Query(value..
-
CacadeType.REMOVE 와 orphanRemoval = true의 차이Spring 2022. 2. 24. 09:15
프로젝트 리팩토링을 진행하면서 연관관계의 데이터(1:N 부모 자식)에 옵션을 넣어줄 때 자식 데이터 삭제시 옵션을 주다가 궁금증이 생겨 찾아보게 되었다. CascadeType.REMOVE(부모 삭제시 자식 삭제) orphanRemoval = true(고아 객체 삭제) 공통점 (parentRepository.delete(parent)) parent의 삭제시 child도 함께 삭제시키는 것은 동일 차이점 (parent.getChild().remove()) 부모 엔티티에서 자식 엔티티 관계 삭제시 관계만 끊어질 뿐 부모 부분이 null로 들어간 자식 엔티티를 삭제하진 않는다. (parent.getChild().remove()) 부모 엔티티가 자식 엔티티의 관계를 삭제할 경우 남은 자식은 고아로 취급되어 그대로..
-
a collection with cascade="all-delete-orphan" was no longer referenced by the owning entity instance 발생 시Spring 2022. 2. 16. 21:30
연관관계를 가지고 있는 한 객체를 바꾸려고 할 때 다음과 같은 오류가 발생하였다. a collection with cascade=”all-delete-orphan” was no longer referenced by the owning entity instance 원인 @Entity class Parent { @OneToMany(mappedBy="parent", cascade=CascadeType.ALL, orphanRemoval=true) private List children; public void setChildren(List list){ this.children = list } @Entity class Child { @ManyToOne @JoinColumn(name = "parentid") Pare..
-
@ParameterizedTest사용할 때 java.lang.NoSuchMethodException 발생 시Spring 2022. 2. 16. 21:09
@ParameterizedTest를 사용하여 여러가지 경우를 테스트 하려고 할 때 java.lang.NoSuchMethodException 예외가 발생하게 되었다. (cannot invoke non-static-method) 원인 @ParameterizedTest @MethodSource("lottoGame") @DisplayName("추첨 번호를 이용하여 올바를 로또 결과를 반환한다.") void match_counts_with_winning_numbers(LottoGame lottoGame, WinningLotto winningLotto, int actual) { //given //when LottoResult lottoResult = lottoGame.draw(winningLotto); //then..
-
existsBy, countBy (JPA)Spring 2022. 2. 13. 18:52
미션을 진행하다가 넘어온 아이디로 조회한 객체가 존재하지 않을 때 예외를 발생시켜야 하는 부분에서 실제 객체를 찾고 null객체인지 확인하는 방법으로 체크를 하였는데 이 부분을 existsBy로 하여 JPA를 활용하도록 피드백을 받게 되었다. null 객체 확인 방법 ( 기존에 하던 방법 ) public ReviewDTO update(ReviewCreateDTO reviewCreateDTO) { if (reviewRepository.findById(reviewCreateDTO.getId()) == null) { throw new ReviewNotFoundException(); } } 하려고 하는 의도가 어떤 것인지 명확하지 않고 불필요한 부분이 존재한다. existsBy public ReviewDTO u..
-
인수테스트 (Acceptance Test) ① 환경 구축 및 작성Spring 2022. 2. 8. 20:10
지난 주, 미션 진행으로 인수테스트 코드를 작성하는 방법을 배웠다. 인수테스트에 대해서 알아보고 미션 수행 후 작성한 코드를 통해서 작성 방법을 정리한다. 인수테스트란 시스템이 예상대로(요구사항대로) 동작하는지 확인할 수 있는 테스트로 개발자 - 테스터 - 고객간의 협업을 기반으로 이루어진다. 인수테스트가 통과되면 우리가 원한대로 기능이 구현되었다는 것을 알 수 있다. 테스트 종류에 따른 의미 테스트 의도 단위 테스트 소프트웨어 설계의 최소 단위(모듈, 컴포넌트)에 맞춰 작성된 테스트 인수 테스트 소프트웨어가 사용자 요구사항을 만족하는지에 맞춰 작성된 테스트 (자동화된 인수테스트는 비용이 저렴) (BLACK BOX) 통합 테스트 단위테스트가 완료된 모듈들을 결합하여 하나의 시스템을 완성하는 과정에 맞춰 ..
-
테스트를 위한 Mock과 그 외의 Test DoubleSpring 2022. 2. 3. 18:49
https://dodop-blog.tistory.com/285 Service Layer의 단위테스트 작성 : (1) Mockito ① 서비스 계층을 테스트 하기 위해서 실제 Repository를 DI하게 된다면 단위테스트를 작성하기 위한 F.I.R.S.T원칙을 위배하게 된다. Fast : @SpringBootTest 어노테이션이 해당 어플리케이션이 모든 빈을 Ioc dodop-blog.tistory.com https://dodop-blog.tistory.com/287 Service Layer의 단위테스트 작성 : (2) Fake 객체 https://dodop-blog.tistory.com/285 Service Layer의 단위테스트 작성 : (1) Mockito ① 서비스 계층을 테스트 하기 위해서 실제..