이 글은 김영한의 [실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발] 수강하며 정리한 글입니다.

 

 

🟦 기본 환경: IDE: IntelliJ, Language: Java

 

 

@Transactional

: 선언적 Transaction, 해당 범위 내 메서드가 트랜잭션이 되도록 보장

: 클래스, 메소드에 @Transactional이 선언되면 해당 클래스에 트랜잭션이 적용된 프록시 객체 생성

→ 프록시 객체는 @Transactional이 포함된 메서드가 호출될 경우, 트랜잭션을 시작하고 Commit or Rollback을 수행

* CheckedException or 예외가 없을 때는 Commit

  UncheckedException이 발생하면 Rollback

 

즉, @Transactional를 선언함으로써 연산의 원자성이 보장되어, 연산이 도중에 실패할 경우 변경사항이 Commit되지 않음

 

 

@Transactional 우선 순위

Class Method > Class > Interface Method > Interface

 

 

@Transactional 주의 사항

1. Public Method에서만 사용 가능

2. @Transactional이 적용되지 않은 Public Method에서 @Transactional이 적용된 Public Method를 호출할 경우, 트랜잭션이 동작 X

 

 

 

참고 자료

 

@Transactional - Incheol's TECH BLOG

스프링에서 트랜잭션 처리는 보통 @Transactional 어노테이션을 많이 사용하게 된다. @Transactional은 클래스 또는 메소드에 사용할 수 있으며 @Transactional이 포함된 메소드가 호출될 경우, 프록시 객체

incheol-jung.gitbook.io

 

 

[Spring] @Transactional의 이해

스프링에서 트랜잭션 처리를 위해 선언적 트랜잭션을 사용한다. 선언전 트랜잭션이란 설정 파일 or 어노테이션 방식으로 간편하게 트랜잭션에 관한 행위를 정의하는 것이다. (물론, 프로그래밍

imiyoungman.tistory.com

 

 

이 글은 김영한의 [실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발] 수강하며 정리한 글입니다.

 

 

🟦 기본 환경: IDE: IntelliJ, Language: Java

 

 

1. Dirty Checking, 변경감지

: Transaction Commit 시, 영속화된 Entity에서 가지고 있던 최초의 정보(Snap Shot)와 바뀐 Entity 정보를 비교해서 변경된 부분을 update해주는 기능

@Transaction 안에서 entity 값을 변경해야 dirty checking, 변경 감지가 일어날 수 있음
: flush  commit update query → DB

 

 

2. Merge, 병합

: 준영속 상태의 엔티티를 영속 상태로 변경할 때 사용

준영속 엔티티의 식별자 값으로 영속 엔티티를 조회(1차 캐시/DB→1차 캐시)
 → 영속 엔티티의 값을 준영속 엔티티의 값으로 모두* 교체
 → 트랜잭션 커밋 시점에 변경 감지 기능을 통해 데이터베이스에 UPDATE SQL 실행

* 모든 값이 변경되므로 입력되지 않은 값은 null로 변경되는 위험 존재

 

 

 

+ Entity 생명 주기

+ 영속성 컨텍스트

: 엔티티를 영구 저장하는 환경, 애플리케이션과 데이터베이스 사이에서 객체를 보관하는 가상의 데이터베이스 같은 역할

 : 엔티티 매니저를 통해 엔티티를 저장하거나 조회하면 엔티티 매니저는 영속성 컨텍스트에 엔티티를 보관하고 관리
 : 엔티티 매니저를 생성할 때 하나 만들어지며, 엔티티 매니저를 통해서 접근하고 관리할 수 있음

 

 

 

참고 자료

 

[JPA] 변경감지 개념과 @Transactional 위치에 따른 변경감지 사용

데이터 변경 로직에서 JPA 변경감지 기능을 자주 접할 수 있는데요. JPA 변경감지에 대해서 짤막한 정리와 함께 @Transactional과 같이 사용할 때 어떠한 점을 유의해야 되는지에 대해서 정리해보고자

beaniejoy.tistory.com

 

[JPA] 영속성 컨텍스트와 플러시 이해하기

영속성 컨텍스트JPA를 공부할 때 가장 중요한게객체와 관계형 데이터베이스를 매핑하는 것(Object Relational Mapping) 과영속성 컨텍스트를 이해하는 것 이다. 두가지 개념은 꼭 알고 JPA를 활용하자.

ict-nroo.tistory.com

 

 

[JPA] 변경 감지와 병합(merge)

지난번에 진행했던 hello shop 프로젝트에서 상품 수정 시 사용됐던 merge() 라는 친구를 기억하나 혹시~😎? JPA에서 준영속 엔티티를 수정하는 방법에는 2가지가 있는데, 이것이 매우 중요하다고 강

velog.io

 

'Java > JPA' 카테고리의 다른 글

[SpringBoot_JPA_1] @NoArgsConstructor  (1) 2023.05.30
[SpringBoot_JPA_1] @Transactional  (0) 2023.05.29
[SpringBoot_JPA_1] StringUtils.hasText()  (0) 2023.05.27
[SpringBoot_JPA_1] create Private Method  (0) 2023.05.27
[SpringBoot_JPA_1] Injection  (0) 2023.05.25

이 글은 김영한의 [실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발] 수강하며 정리한 글입니다.

 

 

🟦 기본 환경: IDE: IntelliJ, Language: Java

 

 

1. isEmpty()

 - Java6부터 사용 가능

 - String의 길이로 T/F 판단

 

2. isBlanck()

- Java11부터 사용 가능

 - 빈칸도 Blank로 인식

 

3. StringUtils.haxText()

- Check whether the given String contains actual text

- Null값이라도 실제 text가 없을 경우, false 반환

 - Spring FrameWork에서 제공

 

 

 

참고 자료

 

StringUtils (Spring Framework 6.0.9 API)

hasText Check whether the given CharSequence contains actual text. More specifically, this method returns true if the CharSequence is not null, its length is greater than 0, and it contains at least one non-whitespace character. StringUtils.hasText(null) =

docs.spring.io

 

 

자바 StringUtils.hasText를 이용한 공백 NULL 확인방법

자바에서 NULL 혹은 공백, 띄어쓰기만 있는 항목이 들어올 경우 isblank를 사용하면 null을 확인할 수 없고 == null을 사용하면 반대 경우의 문제가 생기는데 굳이 메소드를 따로 만들어서 사용하느니

wakestand.tistory.com

 

'Java > JPA' 카테고리의 다른 글

[SpringBoot_JPA_1] @Transactional  (0) 2023.05.29
[SpringBoot_JPA_1] Dirty Checking & Merge  (1) 2023.05.28
[SpringBoot_JPA_1] create Private Method  (0) 2023.05.27
[SpringBoot_JPA_1] Injection  (0) 2023.05.25
[SpringBoot_JPA_1] Cascade Type  (0) 2023.05.25

이 글은 김영한의 [실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발] 수강하며 정리한 글입니다.

 

 

🟦 기본 환경: IDE: IntelliJ, Language: Java

 

 

Class 내에서 일정한 로직이 반복이 될 때 메서드를 생성하여 호출함으로써 코드의 중복을 줄임

 

기존

 상품주문, 상품주문_재고수량초과 메서드에서 코드의 중복 발생

 

변경

 private method 생성 및 호출

(+ IntelliJ 단축키: ctrl + alt + m)

 

 setter 값 변경 불가 → 매개변수 활용

 

변경2

 매개변수를 활용하여 setter값 변경 가능

(+ IntelliJ 단축키: ctrl + alt + p)

 

'Java > JPA' 카테고리의 다른 글

[SpringBoot_JPA_1] Dirty Checking & Merge  (1) 2023.05.28
[SpringBoot_JPA_1] StringUtils.hasText()  (0) 2023.05.27
[SpringBoot_JPA_1] Injection  (0) 2023.05.25
[SpringBoot_JPA_1] Cascade Type  (0) 2023.05.25
[SpringBoot_JPA_1] FetchType.LAZY, EAGER  (0) 2023.05.25

이 글은 김영한의 [실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발] 수강하며 정리한 글입니다.

 

 

🟦 기본 환경: IDE: IntelliJ, Language: Java

 

 

1. Field Injection

❌ Test case 주입이 어려움

 

2. Setter Injection

⭕ Test case 주입 가능

❌ memberRepository가 제약없이 변경 가능

 

3. Constructor Injection

⭕ Test case 주입 가능

 memberRepository 변경의 제약(생성자 1회만 호출)

Test case가 반드시 주입될 수 있도록 함

 

4. Lombok: @AllArgsConstructor

모든 필드에 대해 생성자 생성

 

5. Lombok: @RequiredArgsConstructor

final 필드에 대해 생성자 생성

값이 주입되지 않을 경우, compile error 발생