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
'개발진행목록 > 게시판 서비스' 카테고리의 다른 글
[JPA로 게시판 만들기] Session을 사용한 로그인, 로그아웃 (1) | 2025.02.19 |
---|---|
[JPA로 게시판 만들기] 지연로딩 적용 (0) | 2025.02.05 |
[JPA로 게시판 만들기] 테스트 코드 작성 (0) | 2025.01.23 |
[JPA로 게시판 만들기] TDD, BDD 란 (1) | 2025.01.23 |
[JPA로 게시판 만들기] 서비스, 레포지토리 개발 (0) | 2025.01.18 |