본문 바로가기

Spring boot/Blog 프로젝트 만들기(JPA)

완성 코드 STEP 02 - 게시글 쓰기 ( JPA API , JPQL 쿼리 사용, 인증(세션 로직 추가 )

BoardRepository save 메서드 구현하기

목표: Board 엔티티를 데이터베이스에 저장하는 save 메서드를 구현한다.

 

 

BoardRepository 코드 추가
    // em.persist(board) -> 비영속 상태인 엔티티를 영속상태로 전환
    @Transactional
    public Board save(Board board) {
        em.persist(board);
        return board;
    }

 

 

 

BoardDTO
package com.tenco.blog_v1.board;

import com.tenco.blog_v1.user.User;
import lombok.Data;

public class BoardDTO {

    @Data
    public static class SaveDTO {
        private String title;
        private String content;

        public Board toEntity(User user) {
            return Board.builder()
                    .title(title)
                    .content(content)
                    .user(user)
                    .build();
        }

    }

}

 

 

 

BoardController 코드 수정
   // 게시글 저장
    // 주소설계 - http://localhost:8080/board/save
    @PostMapping("/board/save")
    public String save(@ModelAttribute BoardDTO.SaveDTO reqDto) {
        User sessionUser =  (User) session.getAttribute("sessionUser");

        if(sessionUser == null) {
            return "redirect:/login-form";
        }
        // 파라미터가 올바르게 전달 되었는지 확인
        log.warn("save 실행: 제목={}, 내용={}", reqDto.getTitle(), reqDto.getContent());

        // boardNativeRepository.save(title, content);
        // SaveDTO 에서 toEntity 사용해서 Board 엔티로 변환하고 인수 값으로 User 정보 정보를 넣었다.
        // 결국 Board 엔티티로 반환이 된다.
        boardRepository.save(reqDto.toEntity(sessionUser));
        return "redirect:/";
    }

@ModelAttribute 와 @RequestBody 에 대한 차이점을 이해하자

@RequestBody: 이 어노테이션은 JSON, XML 또는 다른 형식의 요청 본문을 처리하기 위해 사용된다. 이 경우, 클라이언트는 요청 본문을 JSON 형식으로 전송해야 하며, Content-Type은 application/json이어야 한다.
application/x-www-form-urlencoded: 이 Content-Type은 HTML 폼에서 데이터를 제출할 때 사용되며, 서버는 이를 자동으로 매핑하여 DTO에 바인딩한다. 이 경우 @ModelAttribute 또는 단순히 파라미터로 DTO를 받을 수 있다.
 
@RequestBody 어노테이션 쓰면 Content-Type 'application/x-www-form-urlencoded;charset=UTF-8' is not supported. org.springframework.web.HttpMediaTypeNotSupportedException: Content-Type 'application/x-www-form-urlencoded;charset=UTF-8' is not supported 컨텐트 타입지원안한다고 오류가 뜬다.
 

 

728x90