Spring
JPA와 DB 설정, 동작확인
date
Jun 28, 2023
slug
스프링부트-JPA-활용1-1
status
Public
tags
실전! 스프링 부트와 JPA 활용 1
author
summary
[실전! 스프링 부트와 JPA 활용 1] 섹션 1 강의 정리
type
Post
thumbnail
updatedAt
Jun 28, 2023 03:25 PM
category
Spring
김영한
인프런
🍯 꿀팁[1]. 단축키[2]. devtoolsdevtools[3]. 커스텀 라이브 템플릿설정🔧 Annotations📝 강의 정리[1]. 커맨드와 쿼리를 분리해라📌 Member가 아닌 Long을 리턴하는 이유? [2]. em 을 통한 모든 데이터 변경은 트랜잭션 내에서 이뤄져야 한다.📌 같은 영속성 컨텍스트 내에서 식별자가 같다면 같은 엔티티로 인식한다.📎 출처
🍯 꿀팁
[1]. 단축키
- cmd + opt + v
[2]. devtools
devtools
dependencies { implementation 'org.springframework.boot:spring-boot-devtools' }
- 정적 렌더링 페이지 변경 일어날 때 마다 서버 restart 안해줘도 됨
단축키
: 변경 파일에서 cmd + shift + F9 (mac)[3]. 커스텀 라이브 템플릿
- [custom command] + tab → 커스텀 코드 생성
ex) tdd + tab @Test public void $NAME$() throws Exception { //given $END$ //when //then } 코드를 생성해준다.
설정
- Settings → Live Template → 커스텀 그룹 추가
🔧 Annotations
@PersistenceContext
: 해당 어노테이션이 있으면 EntityManage를 주입해준다.
@Transactional
- @Test 와 함께 사용시에 테스트 수행 후 DB를 롤백해준다.
→ @Rollback(false) 를 달면 롤백 하지 않게 설정할 수 있다.
📝 강의 정리
[1]. 커맨드와 쿼리를 분리해라
public Long save(Member member){ em.persist(member); return member.getId(); } /** public Member save(Member member){ em.persist(member); return member; }**/
📌 Member가 아닌 Long을 리턴하는 이유?
- 멤버를 저장하는 과정이 사이드 이펙트를 일으키는 커맨드이기 때문에 리턴 값을 만들지 않는다.
[2]. em 을 통한 모든 데이터 변경은 트랜잭션 내에서 이뤄져야 한다.
@Test //@Transactional @DisplayName("Member Test") public void testMember() throws Exception { //given Member member = new Member(); member.setUsername("7unho"); //when Long savedId = memberRepository.save(member); Member findMember = memberRepository.find(savedId); //then Assertions.assertThat(findMember.getId()).isEqualTo(member.getId()); Assertions.assertThat(findMember.getUsername()).isEqualTo(member.getUsername()); Assertions.assertThat(findMember).isEqualTo(member); }
@Transactional
어노테이션 없이 해당 테스트 코드를 수행하면 에러가 발생한다.
TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'persist' call
📌 같은 영속성 컨텍스트 내에서 식별자가 같다면 같은 엔티티로 인식한다.
- Assertions.assertThat(findMember).isEqualTo(member) == True
- 같은 트랜잭션 안에서 엔티티를 저장하고 조회 → 같은 영속성 컨텍스트 안에서 이뤄짐
→ 영속성 컨텍스트 안에서 ID 값이 같다면, 같은 엔티티 값을 가진다.