728x90
반응형
728x90
반응형
728x90
반응형

모든 테이블에 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

역시 모르고 막 사용하면 이런 삽질을 하는 거다!! ㅠ_ㅠ

 

 

 

* 참고한 글

 

ModelMapper 사용하기 – Deliwind

이번에는 java에서 내가 애용하는 modelMapper에 관해 글을 써보고자 한다. 엄청 유용한 라이브러리임에도 불구하고, 그래서 java 사용자는 모두들 사용하고 있을거라고 생각했는데, 생각보다 주위에

blog.deliwind.com

 

 

[JPA] 특정 칼럼을 제외하고 INSERT, UPDATE하는 방법

보통 JPA는 SAVE시에 모든 칼럼을 INSERT한다. 그럴 경우, NOT NULL로 설정된 칼럼은 기본값으로 삽입되는것이 아닌 NULL로 삽입을 시도한다. 이로 인해 에러가 발생하는데, 이럴 경우에 아예 쿼리에서

jobc.tistory.com

 

 

 

728x90
반응형

+ Recent posts