모든 테이블에 session_id라는 컬럼(not null)을 추가하고, jpa entity에서 @PrePersist를 이용해 insert시 자동 작성하도록 설정 했다.
그리고 modelmapper에서 null인 값은 맵핑하지 않을꺼야 라고 생각하고 수정 시는 테스트 하지 않았다.
근데 왠걸... 내 소스는 맵핑 설정에 그런건 없다.
그래서 ...... 이렇게 삽질이 시작됐다.
내가 생각한 순서는 이러했다.
1. 맵핑에서 sessionId 파라미터는 맵핑하지 않는다.
insert시에는 @PrePersist에서 처리하니 문제가 없을 것이고, 수정 시에는 find한 값에 modelmapper로 맵핑하니 Bean에 설정을 추가하면 된다고 생각했다.
소스는 아래와 같다.
1
2
3
4
5
|
// GrpCodeReqDTO -> GroupCode 맵핑 시에만 사용됨
TypeMap<GrpCodeReqDTO, GroupCode> typeMap = modelMapper.createTypeMap(GrpCodeReqDTO.class, GroupCode.class);
typeMap.addMappings(mapping -> {
mapping.skip(GroupCode::setSessionId);
});
|
cs |
근데 이 소스의 문제점은 GrpCodeReqDTO -> GroupCode 맵핑 시에만 사용된다는 것이다.
공통으로 상속받은 BaseDTO(dto 공통상속), Base(entity 공통상속)를 사용하고 싶었지만 안 된다.
단순하게 간단하게 하고 싶은 나의 욕심과 달리 하나하나 클래스 별로해야 한다는 거다.
2. 차선책으로 값이 null인 경우 맵핑에서 스킵한다.
1
2
|
// 값이 널인 경우 스킵
modelMapper.getConfiguration().setSkipNullEnabled(true);
|
cs |
1번이 안 되니 2번으로 만족해야 한다고 생각하고 수정을 마무리 하려고 했다.
그러다 번득든 생각! jpa save에 대한 예외처리 방법이 있지 않을까?
3. jpa entity에서 updatable=false 추가
1
2
3
|
@Column(name = "SESSION_ID", nullable = false, updatable=false)
@ColumnDefault("NONE")
private String sessionId;
|
cs |
insert를 위한 save시 제외를 원한다면 insertable=false,
update를 위한 save시 제외를 원한다면 updatable=false를 넣어주면 된다.
내 경우는 update시에만 해당되므로 updatable=false를 추가해서 해결했다.
이렇게 삽질을 마무리 했다.
그런데 ......
여기서 반전은 생성일, 생성자 컬럼에서 이미 아래와 같이 사용하고 있었다.
1
2
3
4
5
|
@Column(name = "CRT_DT", updatable = false)
protected Date crtDt;
@Column(name = "CRT_BY", updatable = false)
protected Integer crtBy;
|
cs |
역시 모르고 막 사용하면 이런 삽질을 하는 거다!! ㅠ_ㅠ
* 참고한 글