본문 바로가기
개발진행목록/게시판 서비스

[JPA로 게시판 만들기] API 개발

by o3oppp 2025. 2. 5.
Member 관련 API

회원 등록 API

@PostMapping("/api/members")
public CreateMemberResponse saveMember(@RequestBody @Valid CreateMemberRequest request){
    Member member = new Member();
    member.setEmail(request.getEmail());
    member.setAddress(new Address(request.getCity(), request.getZip(), request.getStreet()));

    Long memberId = memberService.join(member);
    return new CreateMemberResponse(memberId);
}

@Data
static class CreateMemberRequest{
    @NotEmpty
    private String email;
    private String city;
    private String zip;
    private String street;
}

@Data
@AllArgsConstructor
static class CreateMemberResponse{
    private Long id;
}
  • DTO를 Request Body에 직접 매핑하여 진행
    • 엔티티와 프레젠테이션 계층을 위한 로직을 분리할 수 있다.
    • 엔티티와 API 스펙을 분리할 수 있다.
    • 엔티티가 변해도 API 스펙이 변하지 않는다.

회원 조회 API

@GetMapping("/api/members")
public Result members() {
    List<Member> findMembers = memberService.findMembers();
    List<MemberDto> collect = findMembers.stream()
            .map(m -> new MemberDto(m.getId(), m.getEmail()))
            .collect(Collectors.toList());

    return new Result(collect);
}

@Data
@AllArgsConstructor
static class Result<T> {
    private T data;
}

@Data
@AllArgsConstructor
static class MemberDto{
    Long id;
    String email;
}
  • 응답 값으로 엔티티가 아닌 별도의 DTO 사용하여 진행
    • 엔티티를 DTO로 변환해서 반환한다.
    • 엔티티가 변해도 API 스펙이 변하지 않는다.
    • Result 클래스와 같이 컬렉션을 감싸서 향후 필요한 필드를 추가할 수 있다.

회원 정보 수정 API

@PutMapping("/api/members/{id}")
public UpdateMemberResponse updateMember(
        @PathVariable("id") Long id,
        @RequestBody @Valid UpdateMemberRequest request){
    memberService.update(id, request.getEmail());
    Member findMember = memberService.findOne(id);
    return new UpdateMemberResponse(findMember.getId(), findMember.getEmail());
}

@Data
static class UpdateMemberRequest{
    @NotEmpty
    private String email;
}

@Data
@AllArgsConstructor
static class UpdateMemberResponse{
    private Long id;
    private String email;
}
  • 응답 값으로 엔티티가 아닌 별도의 DTO 사용하여 진행
  • 변경감지를 사용하여 데이터 수정 진행
  • 부분 업데이트 시 PATCH, POST를 사용

Post관련 API

게시글 조회 API

@GetMapping("/api/posts")
public Result posts(){
    List<Post> findPosts = postService.findPost();
    List<PostDto2> collect = findPosts.stream()
            .map(p -> new PostDto2(p.getId(), p.getTitle()))
            .collect(Collectors.toList());

    return new Result(collect);
}

@Data
@AllArgsConstructor
static class Result<T> {
    private T data;
}

@Data
@AllArgsConstructor
static class PostDto2{
    Long id;
    String title;
}
  • 응답 값으로 엔티티가 아닌 별도의 DTO 사용하여 진행

게시글 수정 API

@PutMapping("/api/posts/{id}")
public UpdatePostResponse updatePost(
        @PathVariable("id") Long id,
        @RequestBody @Valid UpdatePostRequest request){
    PostDto postDto = new PostDto(request.getTitle(), request.getContent(), LocalDateTime.now());
    postService.updatePost(id, postDto);
    Post findPost = postService.findPostById(id);
    return new UpdatePostResponse(findPost.getId(), findPost.getTitle(), findPost.getContent(), findPost.getStatus());
}

@Data
static class UpdatePostRequest{
    @NotEmpty
    private String title;
    private String content;
}

@Data
@AllArgsConstructor
static class UpdatePostResponse{
    private Long id;
    private String title;
    private String content;
    private PostStatus status;
}
  • 응답 값으로 엔티티가 아닌 별도의 DTO 사용하여 진행
  • 부분 업데이트 시 PATCH, POST를 사용

전체 코드

 

to_post/src/main/java/project/post/api at main · pparkcoder/to_post

[Side Project] SpringBoot + JPA를 활용한 게시판 만들기. Contribute to pparkcoder/to_post development by creating an account on GitHub.

github.com