[BoardService]
@Autowired
private UserRepository userRepository;
@Transactional
public void 댓글쓰기(ReplySaveRequestDto replySaveRequestDto) {
//영속화
User user = UserRepository.findById(replySaveRequestDto.getUserId())
.orElseThrow(()->{
return new IllegalArgumentException("댓글 작성 실패 : 유저 id를 찾을 수 없습니다.");
});
Board board = boardRepository.findById(replySaveRequestDto.getBoardId())
.orElseThrow(()->{
return new IllegalArgumentException("댓글 작성 실패 : 게시글 id를 찾을 수 없습니다.");
});
Reply reply = Reply.builder()
.user(user)
.board(board)
.content(replySaveRequestDto.getContent())
.buile();
replyRepository.save(reply);
}
이전 게시글에서 dto를 사용해 댓글 작성시 영속화하여
replySaveRequestDto.getUserId() 에서 유저id를 받아 user 객체에 변환해서 집어넣고 save를 한 과정이 복잡하다면
영속화 쓰지않고 사용자가 정의한 대로 쿼리가 생성하는 Native Query 를 이용해 직접 함수를 만들어보자
[ReplyRepository]
public interface ReplyRepository extends JpaRepository<Reply, Integer>{
@Modifying
@Query(value="INSERT INTO reply(userId, boardId, content, createDate) VALUES(?1, ?2, ?3, now())", nativeQuery = true)
int mSave(int userId, int boardId, String content); // 업데이트된 행의 개수를 리턴해줌.
}
* int mSave(ReplySaveRequestDto replySaveRequestDto) 하니까 오류나서 따로 넣어줌
* @Modifying : @Query 어노테이션을 통해 작성된 INSERT, UPDATE, DELETE 쿼리에서 사용되는 어노테이션
* int mSave : int로 리턴하게 되면 1이면 1개가 SAVE, 0 이면 save 된게 없고 , -1 이면 오류
NativeQuery 문 쓰는법
//인터페이스에 public 꼭 안써도 됨
@Query(value = "INSERT INTO reply(userId, boardId, content, createDate) VALUES(?1, ?2, ?3, now())", nativeQuery = true)
- userId, boardId, content, createDate 는 reply객체순이 아니라 ReplySaveRequestDto 순서대로 넣는다.
** [ReplySaveRequestDto]
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ReplySaveRequestDto {
private int userId;
private int boardId;
private String content;
}
2. VALUES(?1, ?2, ?3, now()) ▶ values 값에는 ? 뒤에 숫자를 붙여야한다.
3. nativeQuery = true 해야 내가 작성한 쿼리가 작동이 된다.
이제 mSave 를 호출하면 영속화 할 필요가 없다.
[BoardService]
@Transactional
public void 댓글쓰기(ReplySaveRequestDto replySaveRequestDto) { //요청받은 reply
replyRepository.mSave(replySaveRequestDto.getUserId(), replySaveRequestDto.getBoardId(), replySaveRequestDto.getContent());
}
이제 위처럼 영속화 할 필요없이 댓글쓰기 완료
※ toString()
혹시나 아래처럼 System.out.println() 을 하나씩 넣어서 확인하는 방법은 번거로우니까
@Transactional
public void 댓글쓰기(ReplySaveRequestDto replySaveRequestDto) { //요청받은 reply
int reply = replyRepository.mSave(replySaveRequestDto.getUserId(), replySaveRequestDto.getBoardId(), replySaveRequestDto.getContent());
System.out.println(reply.getId());
System.out.println(reply.getBoard());
System.out.println(reply.getContent());
}
Reply 오브젝트에 오버라이드로 toString() 넣고 다른 클래스에서 System.out.println(reply) 오브젝트 출력만하면
System.out.println() 처럼 콘솔창에 찍힌다
[Reply]
* 우클릭 - Source - Generate toString() - 모두 선택하고 생성

@Override
public String toString() {
return "Reply [id=" + id + ", content=" + content + ", board=" + board + ", user=" + user + ", createDate="
+ createDate + "]";
}
[BoardService]
@Transactional
public void 댓글쓰기(ReplySaveRequestDto replySaveRequestDto) { //요청받은 reply
int reply = replyRepository.mSave(replySaveRequestDto.getUserId(), replySaveRequestDto.getBoardId(), replySaveRequestDto.getContent());
System.out.println(reply); //오브젝트로 출력하게 되면 자동으로 toString()이 호출된다.
}
System.out.println(reply)
▶ reply 오브젝트를 출력하기만 한다면 toString() 이 자동호출된다.
'Spring boot | 블로그 만들기' 카테고리의 다른 글
블로그 만들기 | Exception 500 에러처리, cascade 옵션 (0) | 2022.12.01 |
---|---|
블로그 만들기 | 댓글 작성을 dto 사용해보기 (0) | 2022.12.01 |
블로그 만들기 | 게시글 댓글 작성, 댓글 삭제 (0) | 2022.11.25 |
블로그 만들기 | 무한참조 해결법 2가지 @JsonIgnoreProperties , 객체 다이렉트 호출 (0) | 2022.11.24 |
블로그 만들기 | 게시글 댓글 기능과 무한 참조 (0) | 2022.11.24 |