지난 블로그에서는 게시글의 권한 부여를 해보았다.
이번 블로그에서는 게시글 쓰기를 만들어보자.
1. 게시글 쓰기
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F404a9fb6-ab9b-45cc-8074-ee63a3334890%252F919308cb-b32e-4b14-9d39-ea519a94bb5a%252FUntitled.png%3Ftable%3Dblock%26id%3D23b5fcec-7150-412b-8b7f-d9a849b9bae7%26cache%3Dv2&w=3840&q=75)
게시판 글쓰기는 유저에게 게시글 제목과 내용 두가지 내용을 받는다.
클라이언트의 입력을 받기 위해 DTO를 만든다.
public class BoardRequest { @Data public static class saveDTO{ private String title ; private String content ; } }
saveDTO 클래스를 만든다. DTO를 통해 제목과 내용을 담는다.
@PostMapping("/board/save") public String saveWrite(BoardRequest.saveDTO requestDTO){ User sessionUser = (User) session.getAttribute("sessionUser"); boardRepository.save(requestDTO,sessionUser.getId()); return "redirect:/"; }
전달받은 DTO는 컨트롤러로 전달된다.
컨트롤러에선 로그인 정보를 확인 후 레파지스토리에 데이터를 전달한다.
로그인 정보 확인을 위해 session을 사용한다. 세션 정보는 로그인 시점에 생기기 때문에 UserController 에서 만든
sessionUser
키을 사용한다.session.setAttribute("sessionUser",user); // 세션은 해쉬맵으로 키:값의 형태로 되어있음.
sessionUser
을 통해 받은 데이터를 getAttribute
를 통해 세션 데이터를 꺼내고, DTO 와 세션의 getId() 를 함께 BoardRepository에 전달한다.@Transactional public void save(BoardRequest.saveDTO requestDTO,int userId) { Query query = em.createNativeQuery("insert into board_tb(title,content,user_id,created_at) values(?,?,?,now());"); query.setParameter(1, requestDTO.getTitle()); query.setParameter(2, requestDTO.getContent()); query.setParameter(3, userId); query.executeUpdate(); }
BoardRepository 에 save 메서드를 생성한다. saveDTO 의 데이터와 userId 를 전달받는다. userId 는 세선을 통해 전달받는다.
DB에 데이터를 추가할 때, 다른 작업 요청과 동시에 진행되면 안되기 때문에
@Transactional
을 사용해 고립성을 만들어야 한다.2. 결과
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F404a9fb6-ab9b-45cc-8074-ee63a3334890%252Fbbf5e55c-0de4-48c1-988e-c81784bdb610%252FUntitled.png%3Ftable%3Dblock%26id%3Dd327b6fe-8f7f-462a-812c-2c2eb7297643%26cache%3Dv2&w=3840&q=75)
유저네임 cos 로 로그인 한다.
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F404a9fb6-ab9b-45cc-8074-ee63a3334890%252F29f55088-8776-4465-bfe9-a0c2ce2ae9df%252FUntitled.png%3Ftable%3Dblock%26id%3D86b5e7c0-0999-4b5b-b97e-1447bdabb93f%26cache%3Dv2&w=3840&q=75)
테스트 글을 작성해본다.
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F404a9fb6-ab9b-45cc-8074-ee63a3334890%252F1481388a-af9c-4828-b6c6-491bb28bece2%252FUntitled.png%3Ftable%3Dblock%26id%3De334835a-6f6f-4346-81b0-7ff3727b9dc1%26cache%3Dv2&w=3840&q=75)
작성한 테스트 글이 정상적으로 조회된다.
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F404a9fb6-ab9b-45cc-8074-ee63a3334890%252F336624cd-b502-4d1b-8138-db829fd07d42%252FUntitled.png%3Ftable%3Dblock%26id%3D8569dc30-508c-44cd-9aff-96f8e1978e07%26cache%3Dv2&w=3840&q=75)
상세 보기 페이지도 정상적으로 표시된다.
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F404a9fb6-ab9b-45cc-8074-ee63a3334890%252F668269c2-b1b0-4ee9-9bd1-c89dc6a2cd8c%252FUntitled.png%3Ftable%3Dblock%26id%3Dadb32dc9-0c3d-4bd9-91e9-0cdadb099418%26cache%3Dv2&w=3840&q=75)
로그 아웃시 작성글은 그대로 남아있으나, 수정 삭제 버튼도 정상적으로 사라진다.
Share article