본문 바로가기
728x90

Spring data JPA11

[JPA] JPA Lock의 개념과 사용 JPA(Java Persistence API)에서의 락(Lock)은 동시에 여러 사용자가 같은 데이터를 수정할 때 데이터 일관성을 유지하기 위한 메커니즘이다. 이를 통해 여러 트랜잭션이 동시에 동일한 데이터를 수정할 때 발생할 수 있는 문제를 해결할 수 있다. 즉 트랜잭션에 포함되어 있는 개념이라고 할 수 있다. 이와 같이 하나의 Transaction이 특정 데이터에 접근하게 되면 해당 데이터에 대한 연산작업을 진행하는 동안 LOCK을 걸어 다른 트랜잭션에서 접근하지 못하게 한다. Optimistic Lock (낙관적 락): 낙관적 락은 데이터를 읽을 때 락을 걸지 않고, 데이터를 업데이트할 때 버전 번호 등을 체크하여 충돌이 발생하지 않도록 하는 방식이다. 버전 관리를 위한 필드에 @Version 어노.. 2023. 9. 11.
[JPA] 주요 개념 트랜잭션(Transaction) 데이터베이스를 다룰 때 트랜잭션을 적용하면 데이터 추가, 갱신, 삭제 등으로 이루어진 작업을 처리하던 중 오류가 발생했을 때 모든 작업들을 원상태로 되돌릴 수 있다. 모든 작업들이 성공해야만 최종적으로 데이터베이스에 반영하도록 한다. 즉 데이터를 추가, 수정, 삭제 시킬 때 바로 DB에 반영 하지 않고 영속성 캐시에 담아뒀다 한번에 반영 하게 된다. UPDATE JPA는 Update 메서드를 따로 제공하고 있지 않다. 그렇기에 Service로직에 @Transactional 어노테이션을 붙이고, Entity데이터를 조회 후 set() 하여 Entity의 데이터를 수정만 하면 데이터베이스에 대한 연산?작업이 끝날 때 @Transactional 어노테이션에 의해 Entity의 .. 2023. 9. 10.
[JPA] 고아 객체 제거(OrphanRemoval) JPA는 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 삭제한다. 💡 OrphanRemoval 고아가 된 값을 제거하는 속성이다. 즉, 연관관계를 가지고 있는 상위 Entity에서 값이 제거될 때 해당 Entity를 참조하고 있던 하위 Entity의 값도 제거한다. default값이 false고 true로 지정하면 적용된다. Ex> @OneToMany(orphanRemoval = true) @JoinColumn(name = “publisher_id”) private List books = new ArrayList(); 2023. 9. 10.
[JPA] Cascade. 영속성 전이 💡 cascade ‘종속’되다는 의미로 서로 관계가 있는 테이블의 속성에 대한 값을 종속 즉, insert, update 등이 같이 실행되어 값이 똑같이 유지되게 한다. [Option] ALL ⇒ 모든 Cascade옵션을 적용 (모르겠으면 ALL적용) PERSIST ⇒ entity를 영속 상태로 만들면, 매핑된 entity도 함께 영속 상태가 됨 (insert) MERGE ⇒ 준영속 상태의 entity를 영속 상태로 만들면, 매핑된 entity도 모두 영속 상태가 됨 (save) REMOVE ⇒ entity를 제거하면 매핑된 entity도 모두 제거 REFRESH ⇒ entity를 다시 읽어올 때, 매핑된 entity도 모두 다시 읽어옴 DETACH ⇒ entity를 준영속 상태로 만들면, 매핑된 ent.. 2023. 9. 10.
[JPA] JPA - MySQL 연동 💡 JPA와 MySQL을 연동하여 사용해보자! 1. 우측 상단 메뉴바의 Database → ‘+’버튼 → DataSource → MySQL → root(pw) 입력하고 OK 2. application.yml 파일에 정의 spring: h2: console: enabled: true jpa: show-sql: true properties: hibernate: format_sql: true generate-ddl: true hibernate: ddl-auto: create-drop datasource: url: jdbc:mysql://localhost username: root password: sql: init: mode: always 3. build.gradle 파일에 코드 추가 implementatio.. 2023. 9. 10.
[JPA] 1:N Relation. 관계 설정 [1:1] 관계와 거의 유사하지만 하나의 User가 여러 UserHistory를 가질 수 있는 관계이다. [1:N], [N:1] 관계는 상황에 따라 둘다 걸어 양방향에서 참조가 가능하게 할 수 도 있고 한쪽 방향에서만 걸어줄 수도 있다. 💡 1:N 릴레이션 (주 테이블) 매우 간단하다. (기본적인 것은 1:1 릴레이션 참고!) @OneToMany 어노테이션을 붙여준다. 1:1 관계에서 주 테이블(User)에서 대상 테이블(UserHistory) 타입의 속성을 선언했다면, 1:N 관계에서는 대상 테이블(UserHistory)타입을 갖는 List타입으로 속성을 선언해주면 된다. (UserEntity) @OneToMany(fetch = FetchType.EAGER) @JoinColumn(name = "user.. 2023. 9. 10.
[JPA] 1:1 Relation. 관계 설정 💡 1대1 관계 설정 1:1 관계에서는 @OneToOne 어노테이션을 사용하여 관계를 정의해 줄 수 있다. 일대다(1:N), 다대일(N:1) 관계에서는 다(N) 쪽이 항상 외래 키를 가지고 있다. 하지만 일대일(1:1) 관계에서는 주 테이블이나 대상이 되는 테이블 양쪽 모두 외래 키를 가질 수 있다. 그렇기 때문에 일대일 관계를 적용할 때는 주 테이블과 대상이 되는 테이블, 어느 쪽에 외래 키를 둘지 선택 해야 한다. JPA에서는 외래키를 갖는 Entity가 연관 관계의 주인이 되어 외래키를 관리(등록,수정,삭제) 할 수 있다. 1-1. 일대일 연관 관계에서 외래 키가 주 테이블에 있는 경우 - 단방향 1-2. 일대일 연관 관계에서 외래 키가 주 테이블에 있는 경우 - 양방향 2-1. 일대일 연관 관계에.. 2023. 9. 10.
[JPA] Entity Listener. 엔티티 리스너 💡 Entity Listener란? 엔티티의 변화를 감지하고 테이블의 데이터를 조작한다. @PrePersist Persist(insert)메서드가 호출되기 전에 실행되는 메서드 @PreUpdate merge메서드가 호출되기 전에 실행되는 메서드 @PreRemove Delete메서드가 호출되기 전에 실행되는 메서드 @PostPersist Persist(insert)메서드가 호출된 이후에 실행되는 메서드 @PostUpdate merge메서드가 호출된 후에 실행되는 메서드 @PostRemove Delete메서드가 호출된 후에 실행되는 메서드 @PostLoad Select조회가 일어난 직후에 실행되는 메서드 @EntityListeners(value = ???.class) Entity Listener를 현재 En.. 2023. 9. 10.
[JPA] JPA Annotation. 어노테이션 💡 JPA에서 사용되는 어노테이션! 1. @Entity JPA를 사용해 테이블과 매핑할 클래스에 붙여주는 어노테이션이다. JPA가 해당 클래스를 관리하게 된다. 속성 기능 name JPA에서 사용할 엔티티 이름 지정name을 쓰지 않을 경우 (default) 클래스 이름을 entity 이름으로 지정 @Entity의 name = "user2"로 함으로써 user2 테이블이 생성된 것을 볼 수 있다. @Entity(name = "user2") publicclassUser {} 주의 사항 기본 생성자가 꼭 필요 (@NoArgsConstructor) final, enum, interface, innter class에서는 사용 불가 필드(변수)를 final로 선언 불가 2. @Table 엔티티와 매핑할 테이블을 .. 2023. 9. 10.
728x90