일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- NonUniqueResultException
- 우테코
- clearAutomatically
- @Query
- 우아한테크코스5기
- unique result
- 검색api
- jpa
- Argos
- 스프링부트배포
- 자바 롬복
- Mock
- 밤랩
- @Param
- 배포스크립트
- 우아한테크코스 블랙잭
- 우아한테크코스
- docker에 ubuntu
- 스프링 롬복
- 벌크연산
- @Modifying
- 회고
- bomblab
- 우분투
- 레벨인터뷰
- 영속성컨텍스트
- ubuntu이미지
- SpringDataJPA
- BDDMockito
- ubuntu
- Today
- Total
목록jpa (5)
Jeomxon's Tech Note
javax.persistence.NonUniqueResultException: query did not return a unique result: 2 서비스 단에서 개발하고 테스트를 직접하던 도중 발생한 에러이다. 현재 db에는 값이 두개 이상이 있고, 동일한 조건으로 find를 통해서 조회를 하려고하면 발생하는 오류이다. 따라서 service단에서 사용한 find관련 메소드에서 이상이 없는지 먼저 확인하면 빠르게 해결할 수 있다. 에러에 대해서 풀어보자면 unique result, 즉 하나의 유일한 결과에 대해서 return하여 받아야하는데 2개 이상이 db에 들어있기 때문에 발생했던 것이었다.
spring-data-jpa에서 벌크연산을 처리할 때 주의해야할 사항은 꼭 알아둬야할 것 같아서 포스팅을 한다. @Modifying @Query("update Member m set m.age = m.age + 1 where m.age >= :age") int bulkAgePlus(@Param("age") int age); 위 코드에서 파라미터로 들어온 age보다 크거나 같은 age에 대해서는 1을 더하여 update쿼리를 날려주는 것을 알 수 있다. 첫번째 주의사항은 @Modifying을 써줘야한다는 것이다. @Modifying을 쓰지 않으니깐 이런 경고문이 뜬다. update 혹은 delete쿼리를 보낼 때는 반드시 필요한 어노테이션임을 알 수 있다. 두번째 주의사항은 벌크연산 후 영속성 컨텍스트를 ..
spring-data-jpa에서는 @Query 어노테이션을 통해 JPQL을 사용할 수 있도록 기능을 제공한다. @Query("select m from Member m where m.username = :username and m.age = :age") List findUser(@Param("username") String username, @Param("age") int age); 이런 식으로 사용할 수 있다. 여기서 얼핏보면 @Query에 있는 string으로 이루어진 쿼리문이 JPQL처럼 단순 스트링쿼리라고 생각이 들었는데 다른 점이 있었다. JPQL에서는 쿼리문에 문법 오류가 있으면 컴파일 타임에 에러를 잡아주지를 못한다. 따라서 런타임 시에 에러가 발생할 수 있는데 이는 치명적이다. 사용자가 특정..
java.lang.IllegalArgumentException: Parameter value [\] did not match expected type [java.lang.String (n/a)] 위와같은 오류가 검색 api에 발생했다. 이상하게도 첫번째 한번은 검색 api가 정상적으로 작동하는데 두번째 호출부터는 위와 같은 에러를 표출하면서 작동이 되지 않았다. 이유를 찾아보니 깃허브 spring-data-jpa 이슈 탭에서 발견할 수 있는 오류였다. https://github.com/spring-projects/spring-data-jpa/issues/2479 public interface FoodRepository extends JpaRepository { List findAllByFoodNameCo..
엔티티 클래스에서 사용하는 id(자동으로 증가되는 등의 시퀀스), 즉 들어가는 id에 대해서 Long타입으로 쓰는 이유가 뭘까? 처음에는 그냥 int타입을 쓰면 되지 않나?하고 생각했는데 전혀 아니었다. Wrapper Type인 Long을 쓰는 이유, 그것도 Integer가 아닌 굳이 Long을 쓰는 이유는 뭘까? 일단 int가 아니라 long을 쓰는 이유는 허용 범위가 더 크다는 점에서 추측을 할 수 있다. 하지만 왜 Wrapper Type을 사용하는지가 궁금했다. 일단 primitive Type에서는 기본 값이 0인데, 0이라는것이 실제로 id에 부여된 값이 0인지 아니면 값이 없다는 뜻인지 구분하기 어렵다. 하지만 Wrapper Type을 쓴다면 값이 없을 때는 null로 표시가 되기 때문에 pri..