JPA

실전! 스프링 부트와 JPA 활용1 정리

코딍코딍 2022. 8. 2. 21:14

@PersistenceContext 

@PersistenceContext
private EntityManager em;
  •  엔티티 매니저( EntityManager ) 주입
  • 스프링 부트를 사용하면 @PersistenceContext대신 @Autowired를 쓸 수 있다. 이유는 스프링 데이터 JPA가 지원해주기 때문이다.

 

@PersistenceUnit 

@PersistenceUnit
private EntityManagerFactory emf;

엔티티 매니터 팩토리( EntityManagerFactory ) 주입

 

@Transactional 

스프링에서 트랜잭션 처리를 하기위해선 DB와 관련된, 트랜잭션이 필요한 서비스 클래스 혹은 메서드에 @Transactional 어노테이션을 달아주면된다.
tx.begin();

try {
    --- 메소드 실행 ---
    tx.commit();
} catch (Exception e) {
	tx.rollback();
} finally {
	em.close();
}
  • @Transactional을 붙이면 메소드를 위와 유사한 코드로 감싸서 실행된다.
@Service
@Transactional(readOnly = true)
public class MemberService { 
    @Transactional //join()은 readOnly = false
    public Long join(Member member) { ... }
    ...
}
  • 트랜잭션, 영속성 컨텍스트
  • 클래스 레벨에 선언하면 클래스 내부의 모든 메소드에 적용된다. 추가적으로 메소드에 적용한 것이 우선순위를 가진다.(구체적인 것이 우선!)
  • readOnly=true : 데이터의 변경이 없는 읽기 전용 메서드에 사용, 영속성 컨텍스트를 플러시 하지 않 으므로 약간의 성능 향상(읽기 전용에는 다 적용)
  • 데이터베이스 드라이버가 지원하면 DB에서 성능 향상

테스트 코드에서 쓰면 DB로부터 데이터를 가져오고, 테스트가 끝나면 DB를 원래대로 돌려놓는다. (자동으로 롤백)

@Rollback(false): 테스트 코드 실행 중에 쿼리를 보낸 것들을 테스트 완료 후에도 롤백하지 않게한다.

 

@NoArgsConstructor

  • 파라미터가 없는 필드를 주입해주는 생성자 생성
  • @NoArgsConstructor(AccessLevel.PROTECTED) : 생성자의 접근 제어를 PROTECTED로 설정

 

@AllArgsConstructor

@AllArgsConstructor
public class test { 
    private int age;
}
  • 모든 필드를 주입해주는 생성자 생성

 

@RequiredArgsConstructor

@AllArgsConstructor
public class test { 
    private final int age;
}
  • final 필드만 주입해주는 생성자 생성

 

@Test(expected = IllegalStateException.class))

  • IllegalStateException 예외가 터지면 테스트 성공

 

Test에 resources 생성 후 yml 생성하면 test의 yml을 따른다.

 

@NotEmpty(message = "xxx")

@NotEmpty(message = "회원 이름은 필수 입니다.")
private String name;
  • @NotEmpty null "" 를 허용하지 않는다.

@NotBlank

@NotBlank(message = "회원 이름은 필수 입니다.")
private String name;
  • @NotBlank는 null 과 "" 과 " "모두 허용하지 않는다.

 

public String a (@Valid @ModelAttribute MemberForm memberForm, BindingResult result) {}

  • @Valid 뒤에 BindingResult 객체가 있으면 페이지가 튕기지 않고 오류 내용이 BindingResult에 담겨 코드가 정상적으로 실행된다.
  •  if(result.hasErrors()) {} 를 작성하여 오류 발생 시 방안을 세울 수 있다.