spring/게시판 api
Spring boot 게시판 API 서버 제작 (16) - 중간 정리 & 카테고리 API
얼킴
2023. 2. 27. 12:40
프로젝트를 진행하면서 중간중간 수정 작업이 있었지만 대부분 게시글 주제와는 거리가 좀 있어 설명을 생략했습니다. 이번에 수정했던 부분들을 짚어보면서 개념 정리도 다시 해보고 로그인 기능 구현 후 Swagger로 API 추가 했던 작업을 카테고리에서도 동일하게 해보겠습니다.
Entity 수정
먼저 Member와 Role 을 이어주는 MemberRole Entity를 수정하겠습니다.
[Before] MemberRole
@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
public class MemberRole {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "member_id")
private Member member;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "role_id")
private Role role;
public MemberRole(Member member, Role role) {
this.member = member;
this.role = role;
}
}
기존에는 MemberRole의 필드가 id, member, role로 MemberRole이 따로 id를 가지고 있었지만 MemberRole 자체가 복합키를 지니도록 수정하겠습니다.
[After] MemberRole
@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
@EqualsAndHashCode
@IdClass(MemberRoleId.class)
public class MemberRole {
@Id
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "member_id")
private Member member;
@Id
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "role_id")
private Role role;
}
이제 Member와 Role에 대해서 복합키를 지니고 있습니다. 그리고 member와 role을 복합키로 사용하기 위해 MemberRoleId를 추가 합니다.
MemberRoleId
@Embeddable
@EqualsAndHashCode
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
public class MemberRoleId implements Serializable {
private Member member;
private Role role;
}
MemberRole과 MemberRoleId는 @IdClass로 이어져서 작동하는데 자세한 내용은 다음 블로그를 참고해주세요
https://coding-kim.tistory.com/49
[Spring] @IdClass에 대해서 알아보자
spring에서 지원하는 JPA에서는 각 Entity 클래스에서 기본 키(Primary Key, PK)를 지정해야 합니다. 이때, 복합적인 기본 키를 사용하는 경우가 있습니다. spring에서는 @IdClass 어노테이션을 사용하여 복합
coding-kim.tistory.com
Category API 생성
@Api(value = "Category Controller", tags = "Category") // <- 추가
@RestController
@RequiredArgsConstructor
public class CategoryController {
private final CategoryService categoryService;
@ApiOperation(value = "모든 카테고리 조회", notes = "모든 카테고리를 조회한다.") // <- 추가
@GetMapping("/api/categories")
@ResponseStatus(HttpStatus.OK)
public Response readAll() {
return Response.success(categoryService.readAll());
}
@ApiOperation(value = "카테고리 생성", notes = "카테고리를 생성한다.") // <- 추가
@PostMapping("/api/categories")
@ResponseStatus(HttpStatus.CREATED)
public Response create(@Valid @RequestBody CategoryCreateRequest req) {
categoryService.create(req);
return Response.success();
}
@ApiOperation(value = "카테고리 삭제", notes = "카테고리를 삭제한다.") // <- 추가
@DeleteMapping("/api/categories/{id}")
@ResponseStatus(HttpStatus.OK)
public Response delete(@ApiParam(value = "카테고리 id", required = true) @PathVariable Long id) {
categoryService.delete(id);
return Response.success();
}
}
궁금한신점이나 잘못된 부분이 있으면 자유롭게 댓글 달아주세요.