본문 바로가기

스프링 스터디

게시글 추가 기능 구현 / 2022-02-15

유저가 게시글을 작성하면 해당 유저를 확인하고 게시글을 올립니다.

 

 

dto.request.PostRequestDto

package com.second.spring_study.dto.request.ywoo;

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.validation.constraints.NotNull;

@Getter
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class PostRequestDto {
    @NotNull
    String postTitle;
    @NotNull
    String postContent;
}

 

유저가 작성한 게시글의 제목과 내용을 받습니다. 형식을 맞추기 위해 dto를 사용합니다.

 

 

controller.PostYwooController

package com.second.spring_study.controller;

import com.second.spring_study.dto.request.ywoo.PostRequestDto;
import com.second.spring_study.service.PostYwooService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

@RequiredArgsConstructor
@RestController
@RequestMapping("/post-ywoo")
public class PostYwooController {
    private final PostYwooService postYwooService;

    @PostMapping("/{userpk}")
    public void createBoards(@PathVariable long userpk, @RequestBody PostRequestDto postRequestDto){
        postYwooService.createBoards(postRequestDto,userpk);
    }
}

 

공통인 도메인은 RequestMapping을 통해 빼줍니다. 해당 클래스 밑에 선언한 매핑들은 /post-ywoo를 가지게 됩니다. 따라서 createBoards의 URL은 /post-ywoo/{userpk}입니다.

 

userpk는 유저의 id를 의미합니다. 해당 기능에서는 글을 작성한 유저가 있는지 없는지 체크하는데 사용됩니다. 

 

 

 

entity.boardYwoo.PostYwoo

package com.second.spring_study.entity.ywoo.boardYwoo;

import com.second.spring_study.entity.BaseEntity;
import com.second.spring_study.entity.ywoo.userYwoo.UserYwoo;
import lombok.Getter;


import javax.persistence.*;

@Entity
@Getter
@Table
public class PostYwoo extends BaseEntity {

...

    public static PostYwoo createPost(UserYwoo userYwoo, String title, String content){
        PostYwoo postYwoo = new PostYwoo();
        postYwoo.userYwoo = userYwoo;
        postYwoo.postTitle = title;
        postYwoo.postContent = content;

        return postYwoo;
    }

}

 

게시글을 생성할 때 넘어온 정보를 가지고 게시글 객체를 생성합니다. 유저의 정보와 게시글의 제목, 내용을 생성한 객체에 담아 반환합니다.

 

 

 

service.PostYwooService

package com.second.spring_study.service;

import com.second.spring_study.dto.request.ywoo.PostRequestDto;
import com.second.spring_study.entity.ywoo.boardYwoo.PostYwoo;
import com.second.spring_study.entity.ywoo.boardYwoo.repository.PostYwooRepository;
import com.second.spring_study.entity.ywoo.userYwoo.UserYwoo;
import com.second.spring_study.entity.ywoo.userYwoo.repository.UserYwooRepository;
import com.second.spring_study.exception.ywoo.ApiExceptionYwoo;
import com.second.spring_study.exception.ywoo.ErrorCodeEnum;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@RequiredArgsConstructor
@Service
public class PostYwooService {
     final PostYwooRepository postYwooRepository;
     final UserYwooRepository userYwooRepository;

    @Transactional
    public void createPost(PostRequestDto postRequestDto, long userpk){
        UserYwoo userYwoo = userYwooRepository.findById(userpk).orElseThrow(()->{
            throw new ApiExceptionYwoo(ErrorCodeEnum.USER_NOT_FOUND);
        });

        PostYwoo boardYwoo = PostYwoo.createPost(userYwoo, postRequestDto.getPostTitle(), postRequestDto.getPostContent());

        postYwooRepository.save(boardYwoo);
    }
}

 

 

게시글을 작성할 때는 게시글의 정보와 유저의 정보 둘다 필요하기 때문에 둘의 리포지토리를 선언해줍니다.

먼저 userpk를 가진 유저를 찾습니다. 만약 없다면 USER_NOT_FOUND라는 커스텀 에러가 발생합니다.

 

createPost에 유저의 정보와 postRequestDto에서 제목과 내용을 가지고 와 새로운 게시글 객체에 넣습니다. 그런 다음

crudRepository에 있는 메서드인 save를 통해 게시글 객체를 저장합니다.

 

 

 

postman을 통해 게시글의 제목과 내용을 보내줍니다.

 

 

 

h2 console창에서 정상적으로 insert된걸 확인할 수 있습니다.

 

 

 


🔗 : ISSUES #40 게시글 추가 기능

🔗 : Spring Study