@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값을 생성하도록 변경해줬다.