본문 바로가기
공부/Java

#개인 프로젝트 3# DB와 프로젝트 연결 및 JPA로 쿼리 수행하기

by 앙팡공기팡 2024. 11. 23.

 

지난글: https://cooookieeee.tistory.com/36

 

(0) POST로 받은 데이터 Entity로 변환하기

 

#1  POST /board/save 요청 처리할 controller 메서드 생성하기

           

@PostMapping("/save") // METHOD:POST일 시 들어오는 요청 처리 
public String save(@ModelAttribute BoardDTO boardDTO){// body로 넘겨준 값을 boardDTO로 변환한다
    boardService.save(boardDTO);// boardService의 save함수를 통해 Entity로 변환하여 DB에 INSERT
    return "save";

 

 

 

#2  BoardService. save 메서드 생성

            -1. Service 패키지 생성

            -2. BoardService Class 생성

            -3  save 매서드 생성 및 구성 

@Service  // Service 클래스라는 것을 명시
@RequiredArgsConstructor // BoardRepository 인터페이스 클래스 변수 할당에 대한 의존성 주입
public class BoardService {
    private final BoardRepository boardRepository;

    public void save(BoardDTO boardDTO) {// 매개변수로 BoardDTO 
        BoardEntity boardEntity = BoardEntity.toSaveEntity(boardDTO);// BoardDTO의 BoardEntity화
        boardRepository.save(boardEntity);// BoardRepository의 save매서드를 통해 Entity를 INSERT

 

#3  BoardDTO Class와 BoardEntity class 구성하기

 

      -BoardDTO      

@Getter// 읽기 전용 데이터를 제공하거나, 값을 외부로 노출할 때 사용. ex(String name -> getname())
@Setter// 외부에서 값을 변경할 수 있도록 쓰기 권한을 부여할 때 사용. ex(String name -> setname())
@ToString// 클래스의 필드 값을 기반으로 객체를 문자열로 표현하는 toString() 메서드를 자동 생성
@NoArgsConstructor// 기본생성자
@AllArgsConstructor// 모든 필드를 매개변수로 하는 생성자 
public class BoardDTO {
    private Long id;
    private String boardWriter;
    private String boardPass;
    private String boardTitle;
    private String boardContents;
    private int boardHits;
    private LocalDateTime boardCreatedTime;
    private LocalDateTime boardUpdatedTime;

 

      -BoardEntity

 

@Entity // 이클래스가 Entity클래스임을 명시 
@Getter
@Setter
@Table(name = "Board_table") // 이 클래스로 생성된 Entity와 상호작용할 DB의 테이블을 명시
public class BoardEntity  {
    @Id// pk 컬럼 지정. 필수
    @GeneratedValue(strategy = GenerationType.IDENTITY)// auto_increment
    private Long Id;

    @Column(length = 30, nullable = false)// 크기 20 not null
    private String boardWriter;

    @Column // 크기 255 null 가능
    private String boardTitle;

    @Column
    private String boardPass;

    @Column(length = 500)
    private String boardContents;

    @Column
    private int boardHits;

    public static BoardEntity toSaveEntity(BoardDTO boardDTO) { // DTO를 Entity로 변환
        BoardEntity boardEntity = new BoardEntity();
        boardEntity.setBoardWriter(boardDTO.getBoardWriter()); Getter Setter를 이용하여 객체 변수를 가져와서 객체 변수에 저장 
        boardEntity.setBoardPass(boardDTO.getBoardPass());
        boardEntity.setBoardTitle(boardDTO.getBoardTitle());
        boardEntity.setBoardContents(boardDTO.getBoardContents());
        boardEntity.setBoardHits(0);

        return boardEntity;
    }
}

 

이를 통해 Controller를 통해 들어온 DTO 객체가 BoardService.save에서 호출된 메서드를 통해 Entity객체로 변환함

이후 Repoistory 인터페이스를 통해 Entity관련된 트랜잭션을 DB의 쿼리로 변환해 수행한다. 

 (1)  BoardRepository를 이용해서 Mysql 서버와 상호작용하기

#1  BoardRepository 구성

 

       -마지막 BoardService에 있던 BoardRepository.save()를 수행하기 위해 Repository interface를 생성한다.

       - Repository 패키지 생성한 뒤 BoardRepository 인터페이스를 생성한다.

// JpaRepository의 상위 인터페이스를 상속받아 Jpa 기능을 수행한다.
// <BoardEntity, Long> 제네릭을 통해 BoardEntity 타입과 Long 타입의 id를 받아올 것을 명시한다.

public interface BoardRepository extends JpaRepository<BoardEntity, Long> {
}

// 알아야할 점: 일부 쿼리는 JpaRepository통해 생성된 매서드로 사용가능하다.(ex: BoardRepository.save())

 

(2) 어플리케이션 서버 실행 후 글 작성 및 DB Insert 확인

  

     -   application.yml 의 정보를 통해 DB와 연결되어 동적 기능을 수행한다.

      -  Gradle을 통해 빌드 후 Application을 수행해보자.

       - http://localhost:port/board/save로 이동 시 위와 같은 페이지가 뜬다.

      -  빈칸을 임의로 채우고 글작성 버튼을 눌러보자

     

      - 위와 같이 table이 생성되고 튜플이 생성된 것을 확인 가능하다.

 

 

참고:  https://www.youtube.com/watch?v=2XEEPdQBKfs&list=PLV9zd3otBRt7jmXvwCkmvJ8dH5tR_20c0&index=4