본문 바로가기
Study/Spring

User 엔티티를 외래키로 가진 Post 엔티티 추가하기(INSERT) | Spring Spring boot JPA Study

by M개발자 2022. 2. 16.
반응형

✔ Java 11

✔ Gradle 7

✔ Spring boot 2.6.3

2. 게시글 추가 기능

 

1. PostController

@PostMapping("/{userpk}")
    public void createPost(@PathVariable(name = "userpk") @Valid long userPk, @RequestBody @Valid CreatePostRequestDto createPostRequestDto) {
        boardMinjService.createPost(userPk, createPostRequestDto);
    }

@PostMapping("/{userpk}")

  • user 엔티티가 post 엔티티의 FK이다. 그래서 누구의 글인지 알기 위해 user PK를 변수로 받는다.

@PathVariable(name = "userpk") @Valid long userPk

  • 변수의 값을 파라미터로 받을 때 사용하는 어노테이션이다. name으로 변수명을 받을 수 있고, 파라미터에서는 따로 이름을 작성할 수 있다.
  • 도메인은 대소문자를 구분하지 않아 경로 변수는 모두 소문자로, 자바 변수는 카멜 케이스를 사용하여 변수명을 나타냈다.

@RequestBody @Valid CreatePostRequestDto createPostRequestDto

  • 해당 어노테이션으로 JSON body를 받을 수 있다.

 

2. Request DTO

게시글 추가 메소드에서 body로 받을 Request DTO이다.

@Getter
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class CreatePostRequestDto {
    @NotNull
    private String title;
    @NotNull
    private String content;
}

@AllArgsConstructor

  • 모든 필드에 대한 생성자를 자동으로 생성해주는 어노테이션

@NoArgsConstructor(access = AccessLevel.PROTECTED)

  • 매개변수가 없는 생성자를 자도으로 생성해주는 어노테이션
  • DTO에서는 필수로 있어야하는 생성자(어노테이션)이다.

✔ 클래스 이름이나 메소드 이름은 해당 클래스/메소드가 어떤 기능을 수행하는지를 알 수 있도록 작성해주는 것이 좋다.

✔ DTO의 경우 API 명세서 작성할 때의 양식대로 작성해야 해당 API를 사용하는 사람들이 헷갈리지 않고 사용할 수 있다.

3. PostService

public void createPost(long userPk, CreatePostRequestDto createPostRequestDto) {
        UserMinj userMinj = userMinjRepository.findById(userPk).orElseThrow(() -> {
            throw new ApiExceptionMinJ(ErrorCodeEnum.USER_NOT_FOUND);
        });
        PostMinj postMinj = PostMinj.createPost(createPostRequestDto.getTitle(), createPostRequestDto.getContent(), userMinj);
        postRepository.save(postMinj);
    }

경로 변수로 받은 user PK가 존재하는 아이디인지 확인한다.

  • 존재할 경우 해당 User를 변수로 저장한다.
  • 존재하지 않을 경우 예외를 발생한다. (404 반환)
  1. Post 엔티티에 엔티티를 생성하는 createPost 메소드로 엔티티를 생성한다.
    • Post 엔티티는 User 엔티티를 FK로 설정해두었다.
  2. 리포지토리 내장 메소드인 save() 메소드를 사용하여 엔티티를 저장한다.

 

entity > Post.java

public static PostMinj createPost(String title, String content, UserMinj userMinj) {
        PostMinj postMinj = new PostMinj();
        postMinj.postTitle = title;
        postMinj.postContent = content;
        postMinj.userMinj = userMinj;
        return postMinj;
    }

엔티티를 생성하는 메소드를 구현한다.

 

실행 결과

  • 디비 조회

 


회의록

반응형

댓글