[스프링부트] 어노테이션 정리

원서연·2023년 11월 28일
0

@Lazy

@Lazy 어노테이션은 빈의 지연 초기화(lazy initialization)를 설정하는 데 사용됩니다.

일반적으로 스프링은 애플리케이션 컨텍스트가 시작될 때 모든 빈을 생성하고 초기화합니다.

그러나 @Lazy를 사용하면 해당 빈의 초기화를 실제로 필요할 때까지 지연시킬 수 있습니다.

이는 애플리케이션이 시작될 때 모든 빈을 불필요하게 초기화하지 않고, 필요한 빈만 초기화하여 성능을 최적화하는 데 도움이 됩니다.

@LastModifiedDate

Update 시 수동으로 값을 넣어줄 필요가 없다.

필드에 지정해준다.

@LastModifiedDate
private LocalDateTime modifyDate;

@CreatedDate

객체 저장시(Insert 시) 수동으로 값을 넣어줄 필요가 없다.

필드에 지정해준다.

@CreatedDate
private LocalDateTime createDate;

@EntityListeners(AuditingEntityListener.class)

@CreatedDate, @LastModifiedDate를 사용하기 위해 필요

엔티티 클래스에 지정한다.

@EnableJpaAuditing

@CreatedDate, @LastModifiedDate를 사용하기 위해 필요

SpringBootApplication 클래스에 지정한다. (프로젝트의 Application 클래스에 지정)

@EqualsAndHashCode

객체 비교시, 참조 주소값이 아니라, 실제 내용을 비교하게 해준다. (필드 값)

  • @EqualsAndHashCode.Include
    : 비교 대상이 되게 할 필드에 지정하는 어노테이션이다.
    • 엔티티에서는 Id 필드에 지정한다.

@Transactional(readOnly = true)

읽기 전용 트랜잭션 설정 (성능 향상 효과)

서비스 클래스에는 다 붙여주도록 한다.
(클래스에 지정해준다.)

메서드에 붙여도 되고, 클래스에 붙여서 전체 적용도 가능

Insert, Update, Delete 하는 메서드에는 다시
@Transactional 을 지정해야 한다.

@Transactional

@Transactional이 지정된 메서드안에서
엔티티의 수정이 일어났을 경우

repository.save 가 실행되지 않았어도, 트랜잭션이 종료되기 전에
영속성 컨텍스트에서 더티체킹을 통해
엔티티의 수정을 인식하여 UPDATE가 발생한다.

💡객체 내부 호출시에는 지정을 하더라도 @Transactional 적용이 안됨.
💡객체 외부 호출시에만 @Transactional이 적용이 된다.
=> 내부 호출한 경우에는, 객체 자신을 필드로 사용하여 외부 호출처럼 사용하면 된다.

💡메서드가 또 다른 메서드를 호출하는 구조에서, 상위/하위 메소드 둘다 @Transactional이 붙은 경우, 상위 메소드의 @Transactional만 적용된다. (실험으로도 확인됨)
즉, 가장 바깥쪽의 @Transactional만 작동한다.

@Transactional, @Rollback

테스트 환경에서는 클래스 레벨에 @Transactional만 지정해도
@Transactional, @Rollback 두개가 적용이 된다.
(다른 환경에서도 @Rollback 이 자동 지정되는 건 아님)

profile
웹 백엔드 프로그래밍 Today I Learned

0개의 댓글