지금까지 사용했던 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 - 대다다 관계..