JPA8 JPA auditing, baseEntity를 활용하여 Soft delete 구현 지난번 softdelete와 관련한 글을 작성한 적이 있습니다. 그때는 직접 필드를 생성해서 관리해 주는 방식으로 진행했는데 이번 미니 프로젝트에서는 baseEntity에 생성일, 수정일, 삭제일을 입력받도록 수정해 보았습니다. BaseEntity 생성 먼저 baseEntity를 생성했습니다. package com.lahee.market.entity; import jakarta.persistence.Column; import jakarta.persistence.EntityListeners; import jakarta.persistence.MappedSuperclass; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstru.. JPA/ORM JPA 2023. 8. 9. JpaAuditing을 이용해서 base entity 생성하기 JPA Auditing Auditing은 감사, 감시한다는 뜻으로 JPA를 감시한다는 의미입니다. 즉 JPA Auditing은 Java Persistence API(JPA)를 감시하며 엔티티와 관련된 이벤트를 추적하고 기록합니다. JPA Auditing을 사용하면 엔티티의 생성일(createdDate)과 수정일(lastModifiedDate)을 자동으로 관리하는 기능을 제공하여 개발자가 수정일과 생성일 등을 수동으로 관리하지 않아도 되는 장점이 있습니다. JPA Auditing 설정 하기 의존성 추가 dependencies { // 다른 의존성들... implementation 'org.springframework.boot:spring-boot-starter-data-jpa' } 추가로 propertie.. JPA 2023. 6. 24. JPA에서 soft delete 쉽게 처리하기 이전 글 : 2023.05.09 - [SQL] - Soft Delete, Hard Delete (논리삭제와 물리삭제) Soft Delete, Hard Delete (논리삭제와 물리삭제) 프로젝트를 하다가 이런 생각을 하였다 멤버를 삭제하면 그냥 진짜 바로 삭제해야 하나..? 근데 그렇게 되면 만약 유저가 잘못 누른 경우라면? 만약 이 사람이 우리 사이트를 악용해서 관련 기록 lahezy.tistory.com 수정 전 코드 현재 멤버 클래스는 다음과 같이 구성되어 있다. 이 중 activated는 현재 해당 멤버가 삭제되었는지를 나타낸다. activated가 false 이면 삭제된 객체이다 (soft delete ) JPA에서 soft delete를 도와주는 기능을 모를때는 직접 query문을 조작하여 논.. JPA 2023. 5. 12. JPA, H2 데이터 베이스 대소문자 구분에러 결론 spring에서 대소문자 구분을 하지 않도록 하여 통과하였습니다. 공식문서 내용중 ""(따옴표로 이스케이프)되지 않은것은 대문자로 변경하여 실행한다는것을 보고 이로인하여 문제가 발생했다고 판단하였고 ""로 감싸지 않은 것들도 쿼리 그자체로 실행될 수 있도록 수정하였습니다(대문자로 변경하여 실행되지 않도록 하였습니다) spring.datasource.url=jdbc:h2:mem:testdb;DATABASE_TO_UPPER=FALSE 을 추가하고 기존에 수행하려던 코드(대소문자를 구분하지 않는 코드) @SQLDelete(sql = "UPDATE member SET activated = false WHERE member_id = ?") 로 수정하여 테스트 케이스를 통과하였습니다. 문제 발견 soft de.. JPA/ORM JPA 2023. 5. 12. JDBC, JPA, ORM JDBC(Java Database Connectivity) 자바에서 데이터베이스에 접속하고 쿼리문을 실행하는 자바 API이다. 데이터베이스 종류에 상관없이 일관된 방식으로 데이터베이스에 접속하고 데이터를 관리할 수 있도록 하며, 이를 통해 데이터베이스와 자바 애플리케이션 간의 상호작용을 간단하게 만들어 준다. Spring JDBC 스프링 프레임워크에서 제공하는 JDBC 추상화 계층이다. JDBC API를 좀 더 쉽게 사용할 수 있도록 추상화 계층을 추가하여 JDBC 코드 작성의 번거로움과 복잡성을 줄여준다. 그러나 JDBC를 사용하면 데이터베이스에 대한 직접적인 제어를 할 수 있어 필요한 경우에 더 세밀한 작업을 수행할 수 있는 장점이 있다. JDBC의 기본 기능 뿐 아니라 데이터베이스 연결, 트랜잭션 .. JPA 2023. 4. 12. spring boot 3 Query Dsl적용 (네이티브 쿼리 작성으로 N+1문제 해결) 지금 까지 모든 포스트를 확인하면 위처럼 포스트의 개수만큼 쿼리를 조회하였다. (Fatch type을 LAZY로 하여서 포스트에 걸려있는 좋아요의 수를 나중에 불러와서 발생하는 문제였다) 계속 고쳐야지 하다가 이번에 고쳐버렸다. JPQL로 FetchType.LAZY와 Fetch join 하는 방법고 batch 사이즈를 조정하는 방법등 다양한 방법이 있는것 같았지만 나는 query dsl을 적용하여 해결해보고 싶어 진행하였다. 그래서 현재는 아래처럼 한 번의 쿼리로 해결되는 것으로 보인다. 어째서 인지는 모르겠는데 테스트 코드에서는 N+1문제가 발생하지 않았다..? 그래서 한 번 더 확인해 보는 걸로 Query dsl을 스프링 부트 3.0 버전에 적용하는 방법은 블로그와 강의를 참고해서 세팅하였다. [세팅.. JPA 2023. 3. 31. @CreationTimestamp, @PrePersist(JPA라이프 사이클 어노테이션) @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @CreationTimestamp private LocalDateTime createdDate1; //생성 시점 private LocalDateTime createdDate2; //생성 시점 @UpdateTimestamp private LocalDateTime updatedDate; //업데이트 시점 @PrePersist public void prePersist(User user) { // 저장 전에 필요한 작업 수행 createdDate2 = LocalDateTime.now(); } } .. JPA 2023. 3. 28. 엔터티 설계 주의사항 엔터티에는 가급적 Setter를 사용하지 말자 모든 연관관계는 지연로딩으로 설정하자(실무에서 모든 연관관계는 지연로딩(lazy)해줘야 한다.) @ManyToOne, @OneToMany (@ManyToOne-> eager이 default, one to many -> lazy default 이기 때문에 주의) X to Many는 lazy 가 기본이어서 그냥 두면 되지만, 그 경우가 아니면 (EX. @Many to One) lazy로 변경해야 함 //fetch = FetchType.LAZY @OneToOne(fetch = LAZY) @ManyToOne(fetch = LAZY) 컬렉션은 필드에서 초기화한다. 테이블 이름 생성 전략 카멜 케이스 ➡️ 언더스코어(memberPoint ➡️ member_point) .. JPA 2023. 2. 27. 이전 1 다음