반응형 Develop/JPA9 [JPA] @Where 무시하기 DB에서 데이터 삭제를 하기 위해서는 크게 hard delete와 soft delete가 존재한다. hard delete: SQL의 DELETE문을 이용해 직접 데이터를 삭제하는 방법. soft delete: SQL의 UPDATE문을 이용해 삭제 여부를 저장하는 컬럼을 변경하는 방법. 표준으로 정해진 것은 아니지만 soft delete는 일반적으로 deleted라는 컬럼에 true/false를 알 수 있는 값을 저장한다. soft delete의 단점은 조회할 때마다 조회 조건을 추가하는게 매우 귀찮다. (일반적으로 조회는 삭제되지 않은 데이터들을 조회해야하니 where deleted = 0 같은 조건을 넣어야 한다.) 헌데 JPA에서는 정말 편리하게도 @Where라는 어노테이션을 제공해준다. @Where.. 2023. 9. 11. [JPA] @Query와 @Transactional을 꼭 같이 써야하나요?🤔 😄 서론 지난 번에 deleteAll과 관련해 N+1 문제가 발생했었다. 그 과정에 @Query를 이용해 직접 JPQL을 작성하여 해결했는데 (🔗관련 글 링크) 한가지 의문이 생겼다. 해당 문제를 해결하기 위해 다양한 문서들을 찾아보았는데 많은 예제에서 JPQL을 사용할 때 @Transactional 어노테이션을 붙이고 있었다. 안 붙여도 잘 동작하는데 왜 그랬을까? 원인을 찾아보기 시작했다. 😏 Repository 구현체와 트랜잭션 우리가 JPA를 사용해서 ***Repository 클래스를 만들 때 일반적으로 Repository나 JpaRepository를 확장한다. public interface ReminderRepository extends Repository { // ... } Custom Rep.. 2022. 11. 17. [JPA] delete문이 N개가 발생한다고요?😱 💥 원인 발생 현재 진행중인 프로젝트에서 deleteAllByXXX를 호출하자 delete가 N개 나가는 현상이 발생했다. 왜 여러개가 나갈까? 왜 한번에 삭제되지 않는걸까?를 찾아보게 되었다. 📝 원인 분석 deleteAll이 어떤 식으로 동작하는지 확인하기 위해 아래와 같은 과정을 거쳤다. 일단 저희 Repository에서는 Repository를 extends하고 있기 때문에 해당 클래스로 살펴보았다. 구현체를 찾아 따라가다보니 SimpleJpaRepository 다다르게 되었다. 내부 구현을 확인해보니 delete를 for문을 돌면서 호출했다.😱 반면에 deleteAllInBatch는 여러번 호출하는 것이 아닌 한번에 호출하고 있었다. @Repository @Transactional(readOnly.. 2022. 11. 13. [JPA] Table 'DB.hibernate_sequence' doesn't exist 에러 java.sql.SQLSyntaxErrorException: (conn=602) Table 'DB이름.hibernate_sequence' doesn't exist 에러 Entity의 PK를 @GeneratedValue(strategy = GenerationType.AUTO)로 해두었을 때 발생한 문제이다. hibernate_sequence라는 테이블에서 PK를 조회하는데 해당 테이블이 존재하지 않아서 발생한다. 이 때 선택할 수 있는 방법이 두 가지 있다. DDL 자동생성 설정 하기 GenerationType 변경하기 1의 경우에는 실제 운영 환경에서 쓰기에는 매우 위험하다. DDL을 자동으로 생성한다는 것은 애플리케이션 실행 이후로 DB의 테이블 구조가 막 바뀔 수 있다는 의미이다. 개발 환경이라면 편.. 2022. 1. 14. [JPA] 프록시와 영속성 전이 이전에 읽으면 좋은 글 JPA란? https://yeonyeon.tistory.com/178 Entity 매핑 https://yeonyeon.tistory.com/179 목차 프록시 영속성 전이 1. Proxy; 프록시 Entity Manager의 .getReference()를 통해 DB 조회를 미루는 가짜(프록시) 엔티티 객체를 조회 실제 클래스를 상속 받아 생성해 겉 모양이 같음 사용자는 진짜 객체인지 프록시 객체인지 구분 X 실제 객체의 참조(target)를 보관 프록시 객체에서 메소드 호출 시, 프록시 객체가 실제 객체의 메소드를 호출 (아래 동작 과정 참고) proxy 동작 과정 Member member = em.getReference(Member.class, “id1”); member.getN.. 2022. 1. 13. [JPA] Entity 매핑 이전 글: https://yeonyeon.tistory.com/178 예제 코드: https://github.com/yeon-06/inflearnSpring/tree/master/jpa-ex1 목차 1. @Entity란? 2. DB 스키마 자동 생성 3. 필드와 컬럼 매핑 4. 기본 키 매핑 5. 연관 관계 매핑 6. 상속 관계 매핑 7. 공통 매핑 1. @Entity란? JPA가 관리하는 클래스 JPA를 사용해 테이블과 매핑할 클래스 public, protected 기본 생성자 필수 👉 JPA의 구현체(ex: hibernate)가 지원하는 다양한 기능을 사용하기 위함 final, enum, interface, inner 클래스 사용 불가 👉 @Entity로 매핑이 불가능 값을 저장할 필드에 final .. 2022. 1. 10. [JPA] JPA란? 목차 JPA가 등장한 이유 JPA란? 왜 JPA를 사용해야 하는가? JPA 주의사항 JPA의 중요한 기능 예제 코드: https://github.com/yeon-06/inflearnSpring/tree/master/jpa-ex1 GitHub - yeon-06/inflearnSpring: 🍃Inflearn에서 김영한님 강의를 듣고 정리하는 레포지토리 🍃Inflearn에서 김영한님 강의를 듣고 정리하는 레포지토리. Contribute to yeon-06/inflearnSpring development by creating an account on GitHub. github.com 1. JPA가 등장한 이유 현재 많은 웹과 앱에서 데이터베이스는 관계형 DB를 주로 사용하고 있다. NoSQL과 RDB 중 어떤 .. 2022. 1. 3. [MVC] 어댑터 추가 110v 코드에는 220v 코드를 꽂을 수 없다. 어댑터를 사용하면 220v 코드도 110v에서 사용할 수 있도록 해준다. 이처럼 코드에서도 호환을 도와주는 어댑터를 추가할 수 있다. 자세한 설명은 '어댑터 패턴'에 대해 공부해보길 바란다. V3 Controller 활용하기 먼저는 v3에서 만든 컨트롤러를 사용할 수 있도록 하겠다. v3 코드: https://yeonyeon.tistory.com/105 [MVC] Model 분리 현재 코드의 문제점 컨트롤러는 매번 사용하지도 않는 HttpServletRequest, HttpServletResponse를 받는다. "/WEB-INF/views/new-form.jsp" 같은 경로에서 "/WEB-INF/views" 같이 경로가 반복된다. 현재 서블릿에.. yeo.. 2021. 5. 19. [JPA] 더티 체킹 (설명만 보려면 게시글 아래로) 게시글을 수정하는 코드를 작성하고 있다. 순서대로 Controller와 Service 코드의 일부이다. @PutMapping("/api/v1/posts/{id}") public Long update(@PathVariable Long id, @RequestBody PostsUpdateRequestDto requestDto) { return postsService.update(id, requestDto); } @Transactional public Long udpate(Long id, PostsUpdateRequestDto requestDto) { Posts posts = postsRepository.findById(id) .orElseThrow(() -> new Illega.. 2021. 1. 18. 이전 1 다음 반응형