애노테이션들 정리

링딩·2021년 7월 7일
0

Spring

목록 보기
4/5
post-thumbnail

👀애노테이션들 정리(순서_실전1부터)

@PersistenceContext (영속성 컨텍스트)

이 곳에서 영속성 컨텍스트 외의 명령어들에 대해 참조하였습니다.

“Entity를 영구 저장하는 환경”

  • 영속성 컨텍스트이다.
  • em.persist() 같은 경우는 영속성 컨텍스트에 Entity를 영속화(저장) 한단 뜻.
  • 이것이 있어야 '리포지토리'에서 '인젝션 주입'이 가능했는데, 현재는 '스프링 부트 데이터 JPA'로 인해 -> @Autowired로 쓰기도 한다.

@Transactional

이 곳의 블로그를 참조하여 작성하였습니다.

📣 스프링에서는 @Transactional이 '테스트 케이스'에 있으면 기본적으로 RollBack을 한다.

"데이터베이스의 상태를 변경하는 작업 또는 한번에 수행되어야 하는 연산들을 의미"
메소드, 클래스, 인터페이스 위에 추가하여 사용하여 쓰인다.

  • 매우 많은 옵션과 속성들을 자랑하며,
    ex) @Transactional(readonly=True) 는 읽기 전용으로 쓰이는 곳이란 것을 뜻함
    -> jpa가 '조회하는 곳에서' 성능이 더 좋음.
    -> 아닌 곳은 따로 그 메서드에만 @Transactional을 해서 쓰기전용으로 설정해줄 수 있음.

@RequiredArgsConstructor


//(2) 생성자 주입식
private  MemberRepository memberRepository; //얘는 계속 내비두고

    //얘네를 넣어줌 이게 '생성자 인젝션'
    @Autowired
    public MemberService(MemberRepository memberRepository){
        this.memberRepository = memberRepository;
    }
    
    
//(3) lombok을 이용한
@RequiredArgsConstructor
public class MemberService {
    
    private final MemberRepository memberRepository;
    
    }

"@NonNull이나 final이 붙은 필드에 대한 생성자를 생성하는 애노테이션"

  • 이것이 있으면 생성자 주입의 단점을 보완한단 것이다.
    ->'의존성 주입'때 따로 생성자를 만들어주지 않고 간결하게 할 수 있음
  • 또한 Bean에 생성자가 1개일 경우 생성자에@Autowired 생략가능.

@RunWith(SpringRunner.class)

but..현재는 스프링부트 JUnit5 부터는 @RunWith를 쓸 필요가 없어짐

  • 쓴다면 @ExtendWith(SpringExtension.class) 를 이용해 Extension 구현체를 지정해줘야 함.
  • 📣 하지만 이마저도 이미 스프링 부트가 (모든 테스트용 애노테이션) @SpringBootTest에 적용해서 @ExtendWith(SpringExtension.class)생략이 가능하다

@SpringBootTest

이 블로그를 참조하여 작성했습니다.

통합 테스트를 제공하는 '스프링 부트 테스트 어노테이션'

  • 스프링 부트는 SpringBootTest를 이용해 테스트에 필요한 모든 의존성을 제공한다. ->테스트를 위한 빈을 생성.
  • @MockBean으로 정의된 빈을 찾아 교체

@Test(expected = 예외.class)

테스트하기에 코드가 너무 복잡해져서(try~catch문) 쓰이게 되었다.

  • 예외가 발생해 터져서 나간애가 (expected = 비교대상.class)의 '비교대상'의 예외클래스와 '발생한 예외' 같으면 테스트가 통과된다.

@NoArgsConstructor(access = AccessLevel.PROTECTED)

//==주문위해_생성 메서드==//
//복잡한 '주문생성 메서드'를 응집해놓음
//...orderItems 는 '자바 가변인자'임
    
    public static Order createOrder(Member member, Delivery delivery, OrderItem... orderItems){
        Order order = new Order();
        order.setMember(member);//회원 설정
        order.setDelivery(delivery);//배송지 설정

        for (OrderItem orderItem : orderItems){
            order.addOrderItem(orderItem); //주문상품목록에 상품 설정
        }

        order.setStatus(OrderStatus.ORDER);//주문상태는 '주문'으로 첫 상태로 강제해놓음
        order.setOrderDate(LocalDateTime.now()); //현재 시간으로
        return order;//order 객체 반환
    }

"유지보수가 힘들게 객체를 만들고 set으로 하나하나씩 하는 사람이 있다. 우리는 무분별한 객체 생성에 대해 한번 더 체크하기 위해 쓴다."

  • 이것은 lombok의 애노테이션으로 기본 생성자를 생성해준다.
  • Q. 왜 굳이? 자바는 기본생성자를 자동으로 생성해주는데도 써야할까?
    -> 우리는 '도메인 개념'을 포함하는 생성자를 별도로 생성해야 하기 떄문.

@NotEmpty

값이 null 혹은 "" 빈 문자열이 들어와선 안된다.
-> 이것을 쓴 필드에는 값이 들어가야 한다.


@Valid 와 BlindingResult

@Valid와 함께 쓰인 클래스에서 애노테이션들을 다 Validation해준다.

  • 앞에 @ValidBlindingResult가 같이 뒤에 쓰이게 되면 result에 오류가 잇을경우 이곳에 담김


👀 기본적인 애노테이션

이 블로그,gil.log님의 블로그를 참조하였습니다.

@Table(name="엔티티 이름")

해당 엔티티를 직관적으로 알아 볼 수 있도록 '엔티티 이름'을 써줘야 하며 엔티티가 어떤 테이블과 매핑하는지 알려준다.

  • 속성 _ name, Catalog, Schema 등등

@Autowired 의존성 주입

생성자 의존성 주입으로 " @Controller,  @Service, @Repository 등의  애노테이션들은 ‘스프링 빈’으로 자동 등록된다."

@Entity

테이블과의 매핑, 엔티티라고 불리며 , JPA가 관리한다.

  • 속성 _ name
  • final 클래스, enum, interface, inner class 등에 쓸 수 없음

@Id , @GeneratedValue

이 블로그를 참조하여 작성하였습니다.

  • @Id 는 테이블의 PK 필드를 나타냄
  • @GeneratedValue 는 PK(식별자)의 생성전략을 지정하는 애노테이션임.
profile
초짜 백엔드 개린이

0개의 댓글