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