반응형 Programing/JPA25 JPA Entity 내 Subquery 로 동작하는 속성 추가 방법 @Formula JPA Entity 에서 table 에는 존재하지 않지만, 특정 속성을 추가하여 관리해야되는 경우가 있습니다.이렇 때 사용하는 것이 @Formula 이고, subqyery로 동작하게 됩니다. 예를들어 아래와 같은 테이블이 있습니다. 여기서 진행중인 프로젝트를 조회를 한다면프로젝트 시작일자 진행중이지 않은 프로젝트를 조회한다면현재일자 프로젝트 종료일자 의 조건을 설정해야 합니다. 진행중 이라는 컬럼이 있으면 단순히 Y, N 으로 조회 할 수 있을 것 같습니다.이럴 때 @Formula 를 사용하여 처리 할 수 있습니다. @Getter@Setter@Entity(name = "project")public class Project extends BaseEntity { @Id @GenericGener.. Programing/JPA 2024. 5. 8. JPA 부모, 자식 관계에서 부모 삭제 시 모든 경우의 수를 알아보자 Cascade, orphanRemoval 차이, 벌크연산 FK 로 연결된 부모-자식 간의 관계에서 Cascade 를 설정하여 부모가 삭제되는 경우 자식도 삭제 해야하는 경우가 있고, 자식의 FK Column을 null로 초기화 해야 되는 경우가 있습니다. Cascade 의 오용은 큰 문제를 야기하기 때문에 주의해서 사용을 해야 됩니다. 예를 들어 부모(권한)-자식(멤버) 의 관계에서 부모에 Cascade.REMOVE 옵션을 주고 부모를 삭제할 경우 자식까지 모두 삭제가 되게 됩니다. 권한을 삭제했는데 해당 권한을 가지고 있는 멤버까지 삭제가 된다면 큰 문제가 발생하게 되겠죠! 그럼 부모 자식간의 영속성 전이가 발생하는 Casecade 와 고아객체 처리를 하는 orphanRemoval 옵션에 대해서 여러 예시를 들어 알아보도록 하겠습니다. 아래와 같이 권한과 멤.. Programing/JPA 2024. 4. 5. @MappedSuperclass 에 대해서 알아보자 @MappedSuperclass는 명칭과 같이 상속관계에서 부모 클래스를 매핑 할 때 사용합니다. 기존의 상속관계 매핑에서는 부모 자식 테이블 모두 엔티티로 생성하여 매핑을 하지만, @MappedSuperclass는 부모 클래스는 엔티티로 생성하지 않고 자식 클래스만 엔티티로 생성합니다. 이는 단순히 매핑 정보(엔티티 컬럼)를 상속할 목적으로 사용 됩니다. 예제) 예를들어 위와 같이 MANAGER, EMPLOYEE 테이블이 있다고 할 때, 두 테이블에는 ID와 NAME이 공통으로 있는 것을 보실 수 있습니다. 이 두 컬럼을 부모클래스로 생성해 위의 두 테이블의 엔티티가 상속받도록 합니다. @MappedSuperclass public abstract class CommonEntity { @Id @Colum.. Programing/JPA 2023. 8. 25. JPA could not initialize proxy - no Session 원인 / 해결방법 could not initialize proxy - no Session 해당 오류는 JPA 의 open-in-view 설정과 관련이 있습니다. OSIV open-in-view는 OSIV(Open Session In View) 라 하며 영속성 컨텍스트의 범위를 설정하는 옵션입니다. JPA default 설정 값은 true 이고 영속성 컨텍스트가 트랜젝션의 범위를 넘어서 요청이 끝날 때까지 살아있게 됩니다. false 설정의 경우 트랜젝션 범위 내에서만 영속성 컨텍스트가 살아있게 됩니다. 원인 open-in-view 설정이 false 인 상태에서 트랜젝션 없이 연관관계가 FetchType.LAZY 로 설정한 객체에 접근할 때 발생. /*application.yml*/ spring: jpa: open-in-v.. Programing/JPA 2023. 8. 24. @IdClass @EmbeddedId 의 활용 차이 @IdClass @EmbeddedId 모두 JPA에서 복합 기본 키 (Composite Primary Key) 를 다루는 방법입니다. 하나의 Entity에 @Id 를 하나 이상 쓰게되면 매핑 오류가 발생하게 됩니다. 그래서 복합 기본키를 사용할 때는 별도의 키 클래스를 생성해야 합니다. 이 때 생성하는 키 클래스는 다음과 같은 특징이 있습니다. 키 클래스 특징 1. 복합 키는 별도의 키 클래스로 만들어야 한다. 2. Serializable을 implements 받아야한다. 3. equals와 hashCode를 Override 해야 한다. (lombok 에서 @EqualsAndHashCode 사용) 4. 기본 생성자가 있어야 한다. (lombok 에서 @NoArgsConstructor 사용) 5. 키 클래.. Programing/JPA 2023. 8. 18. JPA 연관관계 매핑 알짜만 빼먹기. 일대일 일대다 다대일 다대다 이번 포스팅에서는 JPA 에서 사용되는 연관관계 매핑에 대해서 알아보도록 하겠습니다. 알아보기에 앞서, 알아두어야 할 용어 몇가지만 확인하고 가도록 하겠습니다. 용어 방향( Direction ) 한쪽 Entity에서만 참조하는 것을 '단방향' 관계라고 하고 양쪽 Entity에서 서로 참조하는 것을 '양방향' 관계라고 합니다. DB 테이블은 항상 양방향 관계이고, 객체를 사용하는 JPA에는 단방향만 존재합니다. 정확히 얘기하자면 Entity간 서로 단방향 관계로 양방향 처럼 보이게 합니다. 다중성 ( Multiplicity ) 객체간 관계성을 나타내며, 다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:N) 이 있습니다. JPA에서는 @ManyToOne, @OneToMany, @OneToOn.. Programing/JPA 2023. 8. 18. mapStruct updateFromDto, null 컬럼 제외하고 update mapStruct의 toEntity 메서드를 활용하여 전달받은 DTO 를 Entity로 변환하여 save 메서드를 호출할 때 전달되지 않은 변수 값의 경우 null로 update 됩니다. [DTO] @AllArgsConstructor @Getter @Setter public class TestDTO { private String grpCdId; private String cdId; private String cdNm; } [Entity] @Setter @Getter @Entity @Table(name = "TEST") public class TestEntity implements Serializable { @Id @Column(name = "grp_cd_id") private String grpCdId .. Programing/JPA 2023. 8. 10. named-native-query @Query에 String을 +로 연결하는게 너무 싫어요! JPA를 사용하다 보면 querydsl에서 지원하지 않거나, 복잡한 쿼리를 작성해야 할 때 org.springframework.data.jpa.repository.Query @Query 를 사용해야 하는 경우가 있습니다. 이런 경우 query를 String으로 연결해서 작성해야 하기 때문에 디버깅 해서 쿼리를 확인해야 할 때나 그 반대의 경우 매~우 불편하죠. Link : https://aljjabaegi.tistory.com/694#2._JPQL_(_Java_Persistence_Query_Language)_and_nativeQuery Querydsl vs Criteria API vs QueryMethod vs JPQL 비교 이전 포스팅에서 Querydsl 을 설정하는 방법을 알아보았습니다. Link .. Programing/JPA 2023. 8. 8. JpaRepository Custom / repository에 공통 사용 메서드 추가 JpaRepository의 메서드를 활용하면서, 공통으로 활용하는 메서드를 추가하기 위해 JpaRepository를 커스텀 하는 방법을 알아보겠습니다. 1. JpaRepository extends 한 CustomJpaRepository interface 작성 @NoRepositoryBean public interface CustomJpaRepository extends JpaRepository { /*추가로 작성할 메서드를 작성합니다.*/ JPAQueryFactory getQueryFactory(); } @NoRepositoryBean 은 말 그대로 repository bean으로 등록하지 않겠다는 어노테이션 입니다. JpaRespository를 상속받은 CustomJpaRepository interfa.. Programing/JPA 2023. 7. 27. Querydsl vs Criteria API vs QueryMethod vs JPQL 비교 이전 포스팅에서 Querydsl 을 설정하는 방법을 알아보았습니다. Link : https://aljjabaegi.tistory.com/691 Springboot 2.x + queryDSL 설정 방법 JPA를 사용하게 되면 Query method를 사용하면 간단한 조건의 작업들은 가능하지만 복잡한 쿼리로 작성되어야하는 로직의 경우 한계가 있습니다. 물론 어느정도 가능은 하겠지만 query method의 길이가 aljjabaegi.tistory.com 이번에는 JPA에서 활용되는 여러가지 방법들과 Querydsl을 비교해 보도록 하겠습니다. 샘플 쿼리에 있는 내용을 Query method, 샘플 쿼리 SELECT CD_ID , CD_NM , CD_SQNO FROM M_OP_CD WHERE GRP_CD_ID.. Programing/JPA 2023. 7. 20. Springboot 2.x + queryDSL 설정 방법 JPA를 사용하게 되면 Query method를 사용하면 간단한 조건의 작업들은 가능하지만 복잡한 쿼리로 작성되어야하는 로직의 경우 한계가 있습니다. 물론 어느정도 가능은 하겠지만 query method의 길이가 엄청나게 길어지겠죠. 이를 보완하기 위해 @Query, JPQL 를 사용하도 합니다. 하지만 문자열을 + 로 연결해야 하며 가독성도 떨어지고, 유지관리에 어려움이 있습니다. 1. Query method List findByKeyUserIdAndKeyAtndYmdBetweenOrderByKeyAtndYmd(String UseId, Date first, Date last); 2. @Query @Query(value = "select count(*)" + " from (" + " select *" +.. Programing/JPA 2023. 7. 18. JPA Date or Timestamp 저장 시 유용한 어노테이션 JPA Date or Timestamp 저장 시 유용한 어노테이션에 대해 알아보겠습니다. 1. @Temporal @Temporal 은 날짜, 시간 타입 매핑에 필수 어노테이션 입니다. TemporalType.DATE, TemporalType.TIME, TemporalType.TIMESTAMP 3가지가 있으며 각각의 컬럼 타입에 따라 설정하시면 됩니다. 2. @CreationTimestamp 신규저장 시 자동으로 현재 시간을 넣어주는 어노테이션 입니다. @Embeddable @EmbededId의 경우 정상동작 하지 않음에 주의 해야 합니다. 엔티티 클래스 필드에만 적용합니다. 3. @UpdateTimestamp @CreationTimestamp와 비슷하게 수정 시 현재 시간을 자동으로 업데이트 해주는데 사.. Programing/JPA 2023. 5. 16. JPA 에서 entity를 삭제하는 여러가지 방법과 차이 JPA에서 entity를 삭제하는 방법은 여러가지가 존재합니다. 각각의 삭제하는 방법의 내부코드와 사용방법, 차이점을 알아보도록 하겠습니다. 1. delete delete method를 사용하여 entity를 삭제할 수 있습니다. 1.1 how to use? repository.delete(entity); entity를 전달하므로써 해당 entity를 삭제하게 됩니다. 1.2 delete 구현 코드 참고 @Override @Transactional @SuppressWarnings("unchecked") public void delete(T entity) { Assert.notNull(entity, "Entity must not be null!"); if (entityInformation.isNew(ent.. Programing/JPA 2023. 5. 4. JPA Query Methods 정리 오늘은 JPA에서 간단하게 우리가 원하는 데이터를 조회 할 수 있는 방법중에 하나인 Query Methods 에 대해서 알아보도록 하겠습니다. Keyword Usage JPQL Where and findByColumne1AndColumn2(col1, col2); select ... where column1 = col1 and column2 = col2 Where or findByColumn1OrColumn2(col1, col2); select ... where column1 = col1 or column2 = col2 Distinct findDistinctByColumn1(col1); select distinct ... where column1 = col1 Is, Equals findByColumn1Is.. Programing/JPA 2023. 4. 13. JPA @Query 사용 시 주의점 ERROR: relation "table_name" does not exist, ConverterNotFoundException JPA에서 데이터를 조회 할 때는 보통 find로 시작하는 Query Method를 사용하여 조회합니다. 하지만 복잡한 관계에 있는 테이블들을 사용해 조회해야 할 경우에는 직접 쿼리를 작성하여 조회하는데요, 이럴 때 사용하는 Annotation이 @Query (org.springframework.data.jpa.repository.Query) 입니다. @Query 사용법 @Query(value = "query 작성", nativeQuery = true) @Query Parameter 전달 방법 @Query(value = "select userId, userNm from user where user_id = :userId", nativeQuery = true) Optional findUser(@Param(.. Programing/JPA 2023. 4. 8. 이전 1 2 다음 반응형