지금까지 사용했던 annotation을 정리해보겠다.
@Autowired
스프링 컨테이너에 빈으로 등록되어있는 객체를 자동으로 주입해준다.
@PersistenceContext
스프링에서 영속성 관리를 위해 Entity Manager가 존재한다.
그래서 스프링이 처음 시작할 때, entity manager를 만들어서 빈으로 등록을 해둔다.
entity manager는 @Autowired가 아니고 특별하게 @PersistenceContext라는 어노테이션으로 주입을 해줄 수 있다.
근데 최신 스프링부트에서는 @Autowired로도 할 수 있다고 한다.
@RequiredArgsConstructor
private final Member member;
라고 final로 선언한 필드가 있다고 했을 때
위 어노테이션을 사용하면 클래스에서 final 붙은 필드만 가지고 생성자를 만들어서 알아서 주입해준다.
예를 들어 아래의 코드처럼 작성하였다면
@RequiredArgsConstructor
public class MemberRepository{
private final EntityManager em;
}
@RequiredArgsConstructor 어노테이션을 사용했기 때문에 final 붙은 필드인 em에 entity manager를 주입해준다.
무슨얘기냐 하면
public class MemberRepository{
private final EntityManager em;
@Autowired
public MemberRepository(EntityManager em){
this.em = em;
}
}
이렇게 긴 코드를 @RequiredArgsConstructor로 쉽게 구현할 수 있다는 것이다.
그리고 클래스에 생성자가 하나만 있으면 @Autowired를 삭제해도 알아서 빈으로 등록된 em을 주입시켜준다! 꿀팁!
@Transactional
db에 접근하는 모든 객체 또는 메소드 위에 @Transactional을 사용해야한다.
성공하면 commit이 되어 db에 저장되고 실패하면 rollback이 된다.
test에서는 default가 rollback이라 테스트가 진행되고 끝나면 rollback이 되어 db에 저장이 되지 않는다.
test에서도 commit 되는 것을 눈으로 확인하고 싶으면 @Rollback(false)를 써주면 된다.
@Test
테스트를 위한 메소드 위에 써준다.
예외를 일으키기위해 테스트코드를 짤 때 @Test(expected = IllegalStateException.class) 처럼 예상되는 예외를 써주면 예외가 났을 때 통과를 하게된다.
@Test(expected = IllegalStateException.class)
public void 중복_회원_예외() throws Exception{
//given
Member member1 = new Member();
member1.setName("kim");
Member member2 = new Member();
member2.setName("kim");
//when
memberService.join(member1);
memberService.join(member2);
//then
fail("예외가 발생해야 한다.");
}
@SpringBootTest
통합테스트를 할 때 사용하는 어노테이션이다.
이 어노테이션을 써야지만 빈으로 등록되어있는 객체들을 다 로드해서 사용할 수 있다.
@Entity
도메인 객체 위에 쓴다.
도메인은 실제 db와 매칭될 클래스이다.
@Id @GeneratedValue
@Id - primary key와 매칭될 필드위에 쓴다.
@GeneratedValue - auto_increment와 같은 기능을 담당해준다.
@Column(name=" ")
테이블에서의 컬럼명을 지정해줄 수 있다.
@OneToMany, @OneToOne, @ManyToOne, @ManyToMany
@OneToMany - 1대다 관계에 일 때 사용한다.
@OneToOne - 1대1 관계일 때 사용, fetch 타입을 LAZY로 적용. ~ToOne 은 defaul fetch type이 EAGER이다. EAGER는 즉시로딩이라 연관된 테이블을 다 불러와서 LAZY로 쓰는 걸 권장한다.
@ManyToOne - 다대1 관계, 이 역시 fetch type을 LAZY로 사용하는 걸 권장
@ManyToMany - 대다다 관계..