Board 객체 만들어서 던지자!!
수정할 쿼리와 팁
@Transactional public void save(String title, String content, String username) { Query query = em.createNativeQuery("insert into board_tb(title, content, username, created_at) values(?,?,?,now())"); query.setParameter(1, title); query.setParameter(2, content); query.setParameter(3, username); query.executeUpdate(); }
기존의 이 Native 쿼리문을 수정할 것!
[ 수정 과정 ]
1. BoardPersistRepository save 만들기
package shop.mtcoding.blog.board; import jakarta.persistence.EntityManager; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; @RequiredArgsConstructor @Repository public class BoardPersistRepository { private final EntityManager em; @Transactional public Board save(Board board) { //아직 저장 안 된 Board // 1. 비영속 객체 em.persist(board); //persist를 거쳐서 들어오면서 영속객체가 됨 // 2. board -> 영속 객체 return board; //이제는 return도 적을 필요가 없다 } }
이게 바로... insert... 끝! ......이렇게만 적으면 된다..!
이전 코드
@RequiredArgsConstructor @Repository public class BoardPersistRepository { private final EntityManager em; //애초부터 Board 객체를 받는 것 @Transactional public Board save(String title, String content, String username) { // 1. 비영속 객체 Board board = new Board(title, content, username); // 퍼시스트 컨텍스트에 board 객체 전달 em.persist(board); // board -> 영속 객체 // 값이 아니고 레퍼런스니까 리턴받지 않고도 동기화가 되어있다. return board; } }
원래는 이렇게 title, content, username을 매개변수로 다 받아왔는데,
이제는 Board 객체 자체를 받아올 수 있게 되어 코드를 딱 2줄만 적게 될 것다.
테스트 해보기
@Import(BoardNativeRepository.class) @DataJpaTest public class BoardPersistRepositoryTest { @Autowired // DI private BoardPersistRepository boardPersistRepository; @Test public void save_test(){ // given Board board = new Board("제목5", "내용5", "ssar"); // when boardPersistRepository.save(board); System.out.println("save_test : "+board); // then } }
Board 엔티티 생성자 수정 및 날짜 어노테이션 수정
@NoArgsConstructor @Data @Table(name = "board_tb") @Entity public class Board { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; private String title; private String content; private String username; @CreationTimestamp // pc -> db (날짜주입) private Timestamp createdAt; public Board(String title, String content, String username) { this.title = title; this.content = content; this.username = username; } }
기본 생성자 없어서 오류가 남. Entity는 기본 생성자가 무조건 있어야한다!!
@NoArgsConstructor 추가하자!
pc에서 db로 전달 될 때, 날짜가 주입된다.
BoardRequest DTO 생성
public class BoardRequest { @Data public static class SaveDTO { private String title; private String content; private String username; //3개만 들고 옴! public Board toEntity(){ return new Board(title, content, username); } } }
BoardController save 메서드 수정하기
클라이언트한테 title, content, username 을 받을 것 아님? 이걸,, 필요한 정보만 requestDTO에 담아서 toEntity 메소드로 치는거임
끝 …
Share article