@Lazy 어노테이션은 빈의 지연 초기화(lazy initialization)를 설정하는 데 사용됩니다.
일반적으로 스프링은 애플리케이션 컨텍스트가 시작될 때 모든 빈을 생성하고 초기화합니다.
그러나 @Lazy를 사용하면 해당 빈의 초기화를 실제로 필요할 때까지 지연시킬 수 있습니다.
이는 애플리케이션이 시작될 때 모든 빈을 불필요하게 초기화하지 않고, 필요한 빈만 초기화하여 성능을 최적화하는 데 도움이 됩니다.
Update 시 수동으로 값을 넣어줄 필요가 없다.
필드에 지정해준다.
@LastModifiedDate
private LocalDateTime modifyDate;
객체 저장시(Insert 시) 수동으로 값을 넣어줄 필요가 없다.
필드에 지정해준다.
@CreatedDate
private LocalDateTime createDate;
@CreatedDate, @LastModifiedDate를 사용하기 위해 필요
엔티티 클래스에 지정한다.
@CreatedDate, @LastModifiedDate를 사용하기 위해 필요
SpringBootApplication 클래스에 지정한다. (프로젝트의 Application 클래스에 지정)
객체 비교시, 참조 주소값이 아니라, 실제 내용을 비교하게 해준다. (필드 값)
읽기 전용 트랜잭션 설정 (성능 향상 효과)
서비스 클래스에는 다 붙여주도록 한다.
(클래스에 지정해준다.)
메서드에 붙여도 되고, 클래스에 붙여서 전체 적용도 가능
Insert, Update, Delete 하는 메서드에는 다시
@Transactional 을 지정해야 한다.
@Transactional이 지정된 메서드안에서
엔티티의 수정이 일어났을 경우
repository.save 가 실행되지 않았어도, 트랜잭션이 종료되기 전에
영속성 컨텍스트에서 더티체킹을 통해
엔티티의 수정을 인식하여 UPDATE가 발생한다.
💡객체 내부 호출시에는 지정을 하더라도 @Transactional 적용이 안됨.
💡객체 외부 호출시에만 @Transactional이 적용이 된다.
=> 내부 호출한 경우에는, 객체 자신을 필드로 사용하여 외부 호출처럼 사용하면 된다.
💡메서드가 또 다른 메서드를 호출하는 구조에서, 상위/하위 메소드 둘다 @Transactional이 붙은 경우, 상위 메소드의 @Transactional만 적용된다. (실험으로도 확인됨)
즉, 가장 바깥쪽의 @Transactional만 작동한다.
테스트 환경에서는 클래스 레벨에 @Transactional만 지정해도
@Transactional, @Rollback 두개가 적용이 된다.
(다른 환경에서도 @Rollback 이 자동 지정되는 건 아님)