Skip to content

[JPA study 1주차 주아정]

아정 edited this page Mar 27, 2024 · 2 revisions

S1 : 프로젝트 환경 설정

Written By Ajeong Joo

1주차 과제

Entity를 정의할 때 사용하는 @Id, @GeneratedValue가 언제 사용하는/무슨 기능을 하는 annotation인지 조사해오기

@Id

  • 객체의 Primary Key
  • jpa는 이 id를 통해 객체를 구분한다.

@GeneratedValue

  • 기본 키 생성을 DB에 위임하는 것
  • 데이터베이스가 생성될 때 id 값이 자동으로 생성된다
  • 테이블 생성 시 @Id와 함께 거의 필수로 사용된다고 생각하면 된다.
  • 여러 속성이 존재함. 대부분 실무에서는 IDENTITY를 사용하는 편.
  • 자동 생성이라 Id값이 1부터 증가하지 않을 수도 있음 (예시, 41부터 시작)
  • GenerationType : IDENTITY, SEQUENCE, TABLE, AUTO

PersistenceContext 와 EntitiyManager 에 대해 공부해보고 각자 이해한 내용 정리해오기

  • Spring Data Jpa 기술의 기반이 되는 것들. Spring Data Jpa를 사용하다 보면 거의 사용하지 않긴 하다. (실무에서는...)

EntityManager

  • 영속성 관리를 위해 사용한다.
  • 스프링 컨테이너에서 애플리케이션이 동작할 때 EntityManager을 만들어 빈으로 등록해둠.

PersistenceContext

  • EntityManager을 빈으로 주입할 때 사용하는 애노테이션
  • 여러 스레드가 동시에 접근하면 동시성 문제가 발생해 스레드 간 Entity 매니저를 공유해서는 안 된다. 그러나 PersistenceContext를 사용하면 이러한 문제를 보완할 수 있다.

Transactional annotation 에 대해 공부해보고 각자 이해한 내용 정리해오기

  • 이 개념은 데이터베이스에서 나온 개념으로, DB 개념 중 하나인 트랜잭션과 긴밀한 관계가 있다.

Transaction

  • 데이터베이스 트랜잭션은 데이터베이스 관리 시스템 또는 유사한 시스템에서 상호작용의 단위이다.
  • 단위 : 더 이상 쪼개질 수 없는 최소의 연산 (쉽게 말해 하나의 기능이라고 생각하면 된다)
  • 예시로는 상품 구매가 있다. 구매 창에 들어가 구매 버튼을 누르고 결제를 마치는 것까지를 하나의 단위라고 생각하면 된다.

Transactional Annotation

  • 쉽게 말하면 DB 트랜잭션 개념처럼, 하나의 기능이 끝나기 전에 무언가 실패하면 (저장이 안 됐다거나 데이터를 불러오는데 실패하면) 그 기능이 수행되기 이전으로 롤백하는 것. 기능을 안 수행했던 것처럼 중간에 저장되었던 데이터 등이 전부 취소되는 것.
  • 이 애노테이션을 붙이게 되면 기능이 끝나야 저장이 되든 함.
  • 강의에서는 Test에서 사용했다. -> 테스트에 @Transactional을 사용한다면 쉽게 롤백이 되어 테스트 코드에서 사용한 데이터를 관리하기 쉽다 (껐다 다시 켜면 데이터가 사라짐)
  • Transaction 개념이 없다면 결제를 마치기 전 창을 끔 -> 구매 버튼은 눌린 상태인데 롤백이 되지 않으면... 구매 안 했는데도 구매했다고 나올 수 있음.
  • 그러나 실무에서는 Service 코드에서 사용하는 편.
  • @Transactional(readOnly = true) 로 모든 서비스를 잠가 두고 데이터 변경이 필요할 때만 @Transactional을 붙여 놓는다. (나중에 강의에서 나오는 걸로 알고 있음)
  • 통합 테스트에서는 모르겠는데 단위 테스트에서는 @Transactional을 안 쓰고 ddl-auto를 create-drop으로 해둠 (껐다 다시 켜면 데이터가 사라짐 == Transactional을 붙인 것 같은 효과를 얻을 수 있음.)

참고 자료

Clone this wiki locally