public @interface InsertOnlyProperty
- 공식 문서에 따르면 이 어노테이션이 있는 프로퍼티는 업데이트가 아닌 삽입 작업 중에만 데이터베이스에 기록된다고 합니다.
@InsertOnlyProperty
는 spring-data-relation에 속하는 어노테이션으로 JDBC와 R2DBC 접근을 위해 사용됩니다.
삽입 중에만 기록될 수 있는 이유
// SqlGenerator
// Columns 생성
Columns(RelationalPersistentEntity<?> entity,
MappingContext<RelationalPersistentEntity<?>, RelationalPersistentProperty> mappingContext,
JdbcConverter converter) {
this.mappingContext = mappingContext;
this.converter = converter;
populateColumnNameCache(entity, "");
Set<SqlIdentifier> insertable = new LinkedHashSet<>(nonIdColumnNames);
insertable.removeAll(readOnlyColumnNames);
this.insertableColumns = Collections.unmodifiableSet(insertable);
Set<SqlIdentifier> updatable = new LinkedHashSet<>(columnNames);
updatable.removeAll(idColumnNames);
updatable.removeAll(readOnlyColumnNames);
updatable.removeAll(insertOnlyColumnNames);
this.updatableColumns = Collections.unmodifiableSet(updatable);
}
// populateColumnNameCache 메서드 안에서 수행된다
private void initSimpleColumnName(RelationalPersistentProperty property, String prefix) {
SqlIdentifier columnName = property.getColumnName().transform(prefix::concat);
columnNames.add(columnName);
if (!property.getOwner().isIdProperty(property)) {
nonIdColumnNames.add(columnName);
} else {
idColumnNames.add(columnName);
}
if (!property.isWritable()) {
readOnlyColumnNames.add(columnName);
}
if (property.isInsertOnly()) {
insertOnlyColumnNames.add(columnName);
}
}
SqlGenerator
의 Columns
객체를 생성하는 과정에서 initSimpleColumnName
메서드를 통해 @InsertOnlyProperty
가 포함된 칼럼이 insertOnlyColumnNames
에 추가됩니다. 이후 insertOnlyColumnNames
를 기준으로 updatable
목록에서 제외되며 삽입될 때만 해당 칼럼을 처리하고 있는 것을 확인할 수 있습니다.
추가
spring data relation
Spring Data Relation 프로젝트는 Spring Data의 JDBC와 R2DBC의 접근을 위한 프로젝트입니다.
spring-data-jpa 이슈 2589에서 알 수 있었던 사실
- 수정 및 삽입을 제한하는
@ReadOnlyProperty
어노테이션이 존재합니다. - 매핑과 관련된 작업은 Spring Data JPA의 범위를 벗어납니다. 매핑은 JPA의 범위입니다.
'스프링' 카테고리의 다른 글
Entity Callbacks 실행 과정 (0) | 2025.04.10 |
---|---|
Entity Callbacks 공식 문서 정리 (0) | 2025.04.09 |
MVC의 요청 처리 과정 (0) | 2025.03.31 |
Webflux, ReactiveTransactionManager 환경에서의 이벤트 발행 (0) | 2025.03.24 |
인터페이스 타입으로 등록한 빈을 구현체 타입으로 DI 받지 못한 이유 (0) | 2025.03.19 |