61일차 (1) - 스프링 (요청-응답 DTO, 게시판 기능 실습)

Yohan·2024년 5월 20일
0

코딩기록

목록 보기
90/156
post-custom-banner

스프링 개발 순서

db설계 - DB와 1대1 매칭되는 객체 생성 - repository 인터페이스 - repository 구현체 (+구현체는 Impl을 붙이는 경우도 있음!) - controller
-> repository에서 기능을 구현할 때 마다 테스트 해도되고 자유~


게시판 기능 실습

  • board_no, view_count, reg_date_time은 값이 주입되게 설계해놨으므로 따로 save 메서드에 안넣어줘도 된다.
  @Override
    public boolean save(Board board) {
        String sql = "INSERT INTO tbl_board " +
                "(title, content, writer) " +
                "VALUES (?, ?, ?)";
        return template.update(sql,
                board.getTitle(), board.getContent(), board.getWriter()) == 1;
    }
  • int boardNo = repository.findAll().get(0).getBoardNo();
    -> 첫번째 게시물을 고르려면 board = 1대신 findAll로 찾아준다.
    @Test
    @DisplayName("글번호가 1번인 게시물을 삭제할 수 있다.")
    void deleteTest() {
        //given
        int boardNo = repository.findAll().get(0).getBoardNo();
        //when
        boolean flag = repository.delete(boardNo);
        //then
        assertTrue(flag);
        assertEquals(2, repository.findAll().size());
    }
  • dto 필드명: html form태그의 입력태그들의 name과 반드시 일치


DTO

DTO(Data Transfer Object)는 클라이언트와 서버 간의 데이터 교환을 위한 객체

DTO 특징

  • 데이터 전송: 클라이언트와 서버 간의 데이터 전송을 위한 구조체로 사용
  • 간결성: 필요한 데이터만 포함하여 전송
  • 안전성: 민감한 데이터나 내부 엔티티를 노출하지 않고, 필요한 데이터만 포함시켜 전송

entity vs DTO, RequestDto, ResponseDto

  • entity : DB와 1대1 매칭되는 객체 (즉, DB와 연결)
  • Dto : 클라이언트와 서버간의 소통을 위해 사용되는 객체
    • RequestDto : 요청 처리에 필요한 데이터를 포장하는 객체
      ex) 게시판 글을 작성할 때 작성자, 게시글, 내용은 Dto로 따로 포장하여 파라미터로 보낼 수 있다.
    • ResponseDto : 화면에 보여질 데이터만 모아놓은 객체
      ex) 화면에 제목, 내용, 날짜만 보여주고싶으면 하고싶은대로 필터링하여 JSP 파일에 Dto 객체를 보낼 수 있다.

게시판 기능 DTO 추가

dto는 필요한 기능마다 하나씩 만들어주는 것이 좋다!!

  • 사이즈가 커지게되면 따로 쓰임새가 있을 수도 있고 원래 기능마다 다르게 만들어주는 것이 원칙!
  • BoardWriteRequestDto
    -> 요청 처리할 때 필요한 데이터를 포장하는 객체
    • 파라미터로 들어간다.

  • BoardListResponseDto
    -> 응답 처리할 때 화면에 필요한 데이터들만 모아놓은 클래스
    • 원하는대로 조건을 처리하여 보낼 수 있다.

엔터티를 DTO로 변환하는 이유

  1. 데이터 필터링 및 선택적 노출 (엔터티는 모든 정보가 들어있지만 dto는 화면에 보내고싶은 것만 선택하여 보낼 수 있음)
  2. 데이터 형식 변환 및 보안 등
// 서버에서 조회한 데이터 중 화면에 필요한 데이터만 모아놓은 클래스
@Getter
public class BoardListResponseDto {

    private String shortTitle; // 5글자 이상 줄임 처리된 제목
    private String shortContent; // 30자 이상 줄임 처리된 글 내용
    private String date; // 포맷팅된 날짜문자열
    private int view; // 조회 수
    private int boardNo;


    // 엔터티를 DTO로 변환하는 생성자
    public BoardListResponseDto(Board b) {
        this.shortTitle = makeShortTitle(b.getTitle());
        this.shortContent = makeShortContent(b.getContent());
        this.date = dateFormatting(b.getRegDateTime());
        this.view = b.getViewCount();
        this.boardNo = b.getBoardNo();
    }

    private String dateFormatting(LocalDateTime regDateTime) {
        DateTimeFormatter pattern
                = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
        return pattern.format(regDateTime);
    }

    private String makeShortContent(String content) {
        return (content.length() > 30)
                ? content.substring(0, 30) + "..."
                : content;
    }

    private String makeShortTitle(String title) {
        return (title.length() > 5)
                ? title.substring(0, 5) + "..."
                : title;
    }
}
  • Dto에서 생성한 생성자에 포함된 내용이 모두 전달 (원하는 데이터만 전달)
    -> mapping을 해도 OK, for문을 사용해도 OK

  • JSP 부분도 Dto에서 만든 객체와 같은 이름으로 변경

  • BoardDetailResponseDto
    -> detail에 대한 dto도 위와 똑같이 Controller, JSP에 반영

resources/static/에 img, 동영상 등 생성

profile
백엔드 개발자
post-custom-banner

0개의 댓글