코딩과 결혼합니다

230722 - Post 생성 + 수정 기능 에러 해결 본문

2세/Spring

230722 - Post 생성 + 수정 기능 에러 해결

코딩러버 2023. 7. 22. 22:40
728x90

문제 : post가 잘 생성이 되는지 데이터를 넣어보는데 

403  java.sql.SQLIntegrityConstraintViolationException: Column 'nickname' cannot be null

이 뜨는 것...

 

이유 :  주어진 코드는 Post 엔티티에서 nickname 필드가 생성되고 있지만, 직접적으로 값을 설정하는 부분이 없고

Post 엔티티의 생성자에도 nickname 필드를 설정하는 로직이 없다.

 

해결 : 게시물을 생성할 때 Post 엔티티의 nickname 필드를 제대로 설정해야 한다. PostServie 클래스의 createPost 메서드에서 User 엔티티의 nickname 값을 가져와 Post 엔티티에 설정해주어야 한다. 

 

서비스 수정 전   

	//게시글 생성
    @Transactional
    public PostResponseDto createPost(PostRequestDto requestDto, MultipartFile postImg, UserDetailsImpl userDetails) throws IOException {
            User user = userDetails.getUser();

        //S3 이미지 저장
        String storedPostName = postS3Service.uploadImageFile(postImg);

        try {
            Post savedPost = postRepository.save(new Post(user ,requestDto.getContent(), storedPostName));
            return new PostResponseDto(savedPost);
        } catch (IllegalArgumentException | OptimisticLockingFailureException e) {
            throw new IllegalArgumentException("저장에 실패하였습니다");
        }
    }
서비스 수정

@Transactional
public PostResponseDto createPost(PostRequestDto requestDto, MultipartFile postImg, UserDetailsImpl userDetails) throws IOException {
    User user = userDetails.getUser();

    // S3 이미지 저장
    String storedPostName = postS3Service.uploadImageFile(postImg);

    try {
        // User 엔티티에서 nickname 가져와서 설정
        String nickname = user.getNickname();
        Post savedPost = postRepository.save(new Post(user, nickname, requestDto.getContent(), storedPostName));
        return new PostResponseDto(savedPost);
    } catch (IllegalArgumentException | OptimisticLockingFailureException e) {
        throw new IllegalArgumentException("저장에 실패하였습니다");
    }
}

 

또한, Post 엔티티의 생성자도 nickname 파라미터를 받도록 수정한다.

 

Dto 수정전

public class Post {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "post_id")
    private Long postId;

    @Column(nullable = false)
    private String nickname;

    @Column(nullable = false, length = 500)
    private String content;

    @Column(nullable = false)
    private String postImg;

    @OneToMany(mappedBy = "post", cascade = {CascadeType.REMOVE})
    private List<Comment> commentList = new ArrayList<>();

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id")
    private User user;


    public Post(User user, String content, String storedPostName) {
        this.user = user;
        this.content = content;
        this.postImg = storedPostName;
    }
Dto 수정

public Post(User user, String nickname, String content, String storedPostName) {
    this.user = user;
    this.nickname = nickname;
    this.content = content;
    this.postImg = storedPostName;
}

해결~ DB에도 잘 들어온다.

S3에도 사진이 잘 저장되고 있다 헿헿

 

 


다음은 수정기능 

문제 : 수정이 되었다는 메세지는 뜨는데 도무지 수정이 되지를 않았다.

 

    //게시글 수정 전
    public PostResponseDto updatePost(Long postId, PostRequestDto requestDto, UserDetailsImpl userDetails) {
        Post post = findPost(postId);

        if (!(post.getNickname().equals(userDetails.getUser().getNickname()) && !(userDetails.getUser().getRole().getAuthority().equals("ROLE_ADMIN")))){
            throw new IllegalArgumentException("작성자와 관리자만 수정할 수 있습니다.");
        }
        post.update(requestDto);
        return new PostResponseDto(post);
    }

이유 : 바뀐 내용을 읽어오지 못함.

해결 : @Transactional

    //게시글 수정 후
    @Transactional
    public PostResponseDto updatePost(Long postId, PostRequestDto requestDto, UserDetailsImpl userDetails) {
        Post post = findPost(postId);

        if (!(post.getNickname().equals(userDetails.getUser().getNickname()) && !(userDetails.getUser().getRole().getAuthority().equals("ROLE_ADMIN")))){
            throw new IllegalArgumentException("작성자와 관리자만 수정할 수 있습니다.");
        }
        post.update(requestDto);
        return new PostResponseDto(post);
    }

 


작성자가 다르면 수정이 안되게 함

게시글 작성자가 맞으면 수정 성공 메세지가 뜸!

 

DB에 수정이 잘 되어 들어옴

 

 

수정은 content만 되도록 설정해 놓았다. 시간이 된다면 사진도 수정할 수 있도록 로직을 만들고 싶다.