Open Leehyoungwoo opened 6 months ago
일반적으로 JPA나 Hibernate를 이용해 엔티티를 수정하고 저장할 때, 해당 엔티티의 모든 필드를 대상으로 UPDATE 쿼리가 생성됩니다. 즉, 실제로 변경된 필드가 하나라도 전체 필드를 대상으로 업데이트가 이루어집니다.
하지만 @DynamicUpdate 어노테이션을 사용하면, 실제로 변경된 필드만을 대상으로 UPDATE 쿼리가 생성되어, 성능 향상에 도움이 될 수 있습니다. 이 말은 즉슨, 변경된 컬럼만을 대상으로 동적으로 업데이트 쿼리를 만들어 실행한다는 뜻입니다.
예를 들어, User 엔티티의 name과 email 필드가 있고, name 필드만 변경되었다면, @DynamicUpdate가 적용된 경우 name 필드만을 대상으로 하는 UPDATE 쿼리가 생성됩니다.
다만, @DynamicUpdate를 사용할 때 주의해야 할 점은 이 어노테이션을 사용하면 Hibernate가 내부적으로 추가적인 처리를 해야 하므로, 반드시 필요한 경우에만 사용하는 것이 좋습니다. 또한, 이 어노테이션은 Hibernate에서만 제공하는 기능으로, 다른 JPA 구현체에서는 동작하지 않을 수 있습니다.
이 어노테이션을 사용하면, Spring Security는 메소드 호출 전후에 보안 표현식을 평가하여 접근 제어를 수행할 수 있습니다. 이를 통해 각 메소드에 대한 세부적인 접근 제어를 설정할 수 있으며, 이는 서비스 레이어의 보안을 강화하는 데 유용합니다.
prePostEnabled 속성을 true로 설정하면, @PreAuthorize와 @PostAuthorize 어노테이션을 사용하여 메소드 호출 전후의 보안 표현식을 평가할 수 있습니다.
@PreAuthorize는 메소드를 호출하기 전에 보안 표현식을 평가합니다. 만약 이 표현식이 false를 반환하면, 메소드는 호출되지 않습니다. @PostAuthorize는 메소드 호출 이후에 보안 표현식을 평가합니다. 이 어노테이션은 메소드의 반환값을 고려할 수 있으므로, 반환된 객체에 대한 접근 제어를 수행하는 데 사용될 수 있습니다. 예를 들어, 다음과 같이 @PreAuthorize를 사용하여 특정 권한을 가진 사용자만 메소드를 호출할 수 있도록 할 수 있습니다.
무결 제약 조건이란 데이터베이스에 저장되는 데이터의 정확성을 보장하기 위해 설정하는 규칙입니다. 예를 들어, 고유해야 하는 칼럼에 중복된 값이 들어가려고 하거나, 외래키 제약 조건이 있는 칼럼에 존재하지 않는 값이 들어가려고 할 때, 또는 NOT NULL 제약 조건이 있는 칼럼에 NULL 값이 들어가려고 할 때 이 예외가 발생할 수 있습니다.
다음은 DataIntegrityViolationException이 발생하는 경우의 예시입니다:
@NotNull: 이 어노테이션이 붙은 필드의 값이 null이 아님을 검사합니다. 즉, 필드의 값이 null이면 유효성 검사에서 실패합니다. 하지만 필드의 값이 공백이거나 빈 컬렉션일 경우에는 유효성 검사를 통과합니다. @NotEmpty: 이 어노테이션이 붙은 필드의 값이 null이 아니고, 또한 빈 문자열이나 빈 컬렉션이 아님을 검사합니다. 즉, 필드의 값이 null이거나 빈 문자열, 또는 빈 컬렉션일 경우 유효성 검사에서 실패합니다. 하지만 필드의 값이 공백만으로 이루어진 문자열일 경우에는 유효성 검사를 통과합니다. @NotBlank: 이 어노테이션은 문자열에만 사용할 수 있으며, 필드의 값이 null이 아니고, 빈 문자열이 아니며, 공백만으로 이루어진 문자열이 아님을 검사합니다. 즉, 필드의 값이 null이거나 빈 문자열, 또는 공백만으로 이루어진 문자열일 경우 유효성 검사에서 실패합니다. 이러한 어노테이션들은 각각의 상황에 맞게 적절하게 사용하면, 데이터의 유효성을 보장하고 의도치 않은 오류를 미리 방지하는 데 도움이 됩니다.
알고리즘
Spring