[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)
  1. 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() 이 자동호출된다.

반응형
LIST

+ Recent posts