Post Entity

Entity 클래스에 절대 Setter 메소드를 만들지 마라

자바빈 규약을 생각하며 getter/setter를 생성하면 안됩니다. 해당 클래스의 인스턴스 값들이 언제 어디서 변해야 하는지 코드상으로 구분이 힘들어 차후 기능 변경시 복잡해집니다.

  • 생성자를 통해 최종값을 채운 후 DB에 INSERT 하는 것이 기본입니다.
  • 그 목적과 의도를 알 수 있는 메소드를 통해 값을 변경합니다.
@Getter
@NoArgsConstructor
@Entity
public class Posts {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(length = 500, nullable = false)
    private String title;

    @Column(columnDefinition = "TEXT", nullable = false)
    private String content;

    @Column
    private String author;

    @Builder
    public Posts(String title, String content, String author) {
        this.title = title;
        this.content = content;
        this.author = author;
    }
}


PostRepository

public interface PostRepository extends JpaRepository<Posts, Long> { }

Repository Test

@SpringBootTest
class PostRepositoryTest {

    @Autowired
    PostRepository postRepository;

    @AfterEach
    public void clean(){
        postRepository.deleteAll();
    }

    @Test
    public void 게시글_저장_불러오기(){
        //given
        String title = "테스트 게시글";
        String content = "테스트 게시글 본문";
        String author = "jojolu@gmail.com";
        //when
        postRepository.save(Posts.builder()
                .title(title)
                .content(content)
                .build());
        List<Posts> postsList = postRepository.findAll();
        //then
        Posts posts = postsList.get(0);
        assertThat(posts.getTitle()).isEqualTo(title);
        assertThat(posts.getContent()).isEqualTo(content);
    }

}

PostsApiController

@RequiredArgsConstructor
@RestController
public class PostsApiController {
    private final PostsService postsService;
    
    @PostMapping("/api/v1/posts")
    public Long Save(@RequestBody PostsSaveRequestDto requestDto){
        return postsService.save(requestDto);
    }
}


PostsService

@RequiredArgsConstructor
@Service
public class PostsService {
    private final PostsRepository postsRepository;
    
    @Transactional
    public Long save(PostsSaveRequestDto requestDto) {
        return postsRepository.save(requestDto.toEntity()).getId();
    }
}

PostsDto

@Getter
@NoArgsConstructor
public class PostsSaveRequestDto {
    
    private String title;
    private String content;
    private String author;
    
    @Builder
    public PostsSaveRequestDto(String title, String content, String author) {
        this.title = title;
        this.content = content;
        this.author = author;
    }
    
    public Posts toEntity() {
        return Posts.builder().title(title).content(content).author(author).build();
    }
}

PostsApiControllerTest


댓글남기기