@Transactional
→ 해당 트랜잭션을 하나의 메서드에 걸어줄 때 만약 이 안에서 객체를 생성하면 JPA에서는 Id Type을 Identify로 해놓았을 경우 영속성 컨텍스트에서 DB까지 다녀와야 ID가 생성된다.
→ 이 부분을 망각하여, Post라는 게시판 생성 시, Suspect라는 사기꾼 데이터 조회하는데 없을 경우 생성되는 메서드에서 Id가 생성되지 않는다는 태형이형의 조언을 들었다.
@Transactional
public boolean createPost(long memberId, CreatePostRequestDto createPostRequestDto) {
Member member = memberService.findMember(memberId);
//문제의 부분
Suspect suspect = findOrCreateSuspect(createPostRequestDto.suspectInfoRequestDto());
//
ProductCategory productCategory = findProductCategory(createPostRequestDto.productCategoryName());
String title = createPostRequestDto.title();
String content = createPostRequestDto.content();
String category = createPostRequestDto.category();
String postUrl = createPostRequestDto.postUrl();
String productName = createPostRequestDto.productName();
PostContent postContent = PostContent.create(title,content,productName,postUrl,productCategory);
PostMeta postMeta = PostMeta.create(category, 0);
Post post = Post.create(postContent,postMeta,member,suspect);
postRepository.save(post);
return true;
}
//이 메서드에서 조회하고 없을 경우 생성하고 있다.
private Suspect findOrCreateSuspect(SuspectInfoRequestDto suspectInfoRequestDto) {
Suspect suspect = null;
if(suspectInfoRequestDto != null){
suspect = suspectService.getSuspect(suspectInfoRequestDto.name(), suspectInfoRequestDto.email(), suspectInfoRequestDto.bank(),
suspectInfoRequestDto.account(), suspectInfoRequestDto.platform());
if(suspect == null){
suspect = suspectService.createSuspect(suspectInfoRequestDto);
}
}
return suspect;
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public Suspect createSuspect(SuspectInfoRequestDto suspectInfoRequestDto) {
String name = suspectInfoRequestDto.name();
String email = suspectInfoRequestDto.email();
String bank = suspectInfoRequestDto.bank();
String account = suspectInfoRequestDto.account();
String platform = suspectInfoRequestDto.platform();
Suspect newSuspect = Suspect.create(name, email, bank, account, platform);
return suspectRepository.save(newSuspect);
}
→ 이렇게 Suspect라는 객체를 생성시에 새로운 트랜잭션을 생성하여, DB까지 갔다와서 Suspect의 id값을 생성하도록 변경해줬다.