Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
Tags
- java 자료구조 활용
- java참조자료형
- java map 출력
- 노베이스부트캠프
- sqld자격증합격
- java list 출력
- 코딩부트캠프후기
- 격파르타장점
- 프로그래머스
- java기본자료형
- java map
- javaJVM
- 격파르타합격후기
- 항해15기
- java최솟값구하기
- 인터프린터언어
- java set 출력
- 항해99후기
- java list 저장
- java알고리즘
- java set 저장
- 작은수제거하기
- java알고리즘문제풀이
- 비전공자sqld
- 격파르타비전공자
- 컴파일
- java map 저장
- 프로그래머스제일작은수
- javaJRE
- 격파르타후기
Archives
- Today
- Total
코딩과 결혼합니다
230722 - Post 생성 + 수정 기능 에러 해결 본문
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만 되도록 설정해 놓았다. 시간이 된다면 사진도 수정할 수 있도록 로직을 만들고 싶다.
'2세 > Spring' 카테고리의 다른 글
230726 - Spring Transaction (0) | 2023.07.26 |
---|---|
230725 - .gitignore가 적용되지 않을 때 Git 캐시 삭제 (민감 정보 감추기 ) (0) | 2023.07.25 |
230721 - 클론코딩 프로젝트 : 오늘의 집 (0) | 2023.07.21 |
230720 - Error: Required a bean of type 'org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder' that could not be found(2) (0) | 2023.07.20 |
230719 - RestTemplate & Open API (0) | 2023.07.19 |