벌써 6월이다 .. 덥다
개인과제를 진행했고 , 그에 대한 튜터님의 피드백이 왔다
안녕하세요 기석님 ㅇㅇㅇ 튜터 입니다. 개인과제 수행하시느라 정말 고생 많으셨습니다.
정말 잘 해주셨지만 몇가지 수정하면 좋을 만한 것들이 있어 피드백 드리겠습니다.
1. 여러 Entity에 @Setter 애너테이션이 사용되어있네요! '세터를 무조건 사용하면 안된다!' 는 아니지만
특히나 Entity 클래스와 같은 DB 테이블과 매핑되어 동작하는 클래스들은 데이터(상태) 변경에 매우
보수적으로 처리할 필요가 있습니다. Setter를 열어두면 의도하지 않은 데이터 변경이 일어날 수도 있기 때문에
생성자 혹은 메서드를 활용하여 꼭 데이터 변경을 진행하시면 좋을 것 같아요!
또한 Setter가 필요하다면 애너테이션으로 모든 필드를 여는 것 보다는
필요한 필드만 직접 Setter를 만들어주시는 것이 좋습니다!
2. 현재 Controller에서 대부분의 HTTP Status 상태값이 200으로 처리되고 있는데 다음번에는 새로운 자원생성(201), 반환 데이터 없음(204)등과 같은 API 응답 상태에 따른 Status Code를 활용하여 처리해보시면 좋을 것 같습니다!
3. @Transactional 애너테이션은 꼭 필요한 곳에만 사용해주시면 좋을 것 같습니다!
영속성 컨텍스트 환경이 필요한 상황이거나 여러 작업들을
하나의 작업으로 묶어야할 때 등과 같은 상황에 사용해주시면 좋습니다.
예를 들어 지금 댓글 서비스의 댓글을 생성하거나
삭제하는 메서드에서는 트랜잭션 환경이 필수로 필요해보이지 않습니다!
다음 프로젝트에서는 1) EntityListener 를 활용하여 테이블 row의 생성, 수정 데이터 관리하기
2) Bean Validation을 사용하여 Request 데이터(DTO) 손 쉽게 검증하기
3) Custom Exception 만들어 활용하기 && Exception Global로 처리하기
4) Security, JWT와 관련된 코드들 강의에 나온 코드는 참고만 하여 직접 새롭게 만들어보기
5) 로그 관리하기 등을 시도해보시면 좋을 것 같습니다!!
튜터님의 피드백을 보고 코드를 간단하게 수정 해 봤다.
setter도 지웠고 , user entity에서 빌더 패턴으로 사용해봤다
@Getter
@NoArgsConstructor
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, unique = true)
private String username;
@Column(nullable = false)
private String password;
@Column(nullable = false, unique = true)
private String nickname;
@Column(nullable = false)
@Enumerated(EnumType.STRING)
private UserRoleEnum role;
@Column(nullable = false)
private LocalDateTime createdAt;
@Builder
public User(String username, String password, String nickname, UserRoleEnum role) {
this.username = username;
this.password = password;
this.nickname = nickname;
this.role = role;
this.createdAt = LocalDateTime.now();
}
그다음 , http status 상태 코드 세분화를 해보았다.
public ResponseEntity<String> signup(@RequestBody SignupRequestDto requestDto) {
try {
authService.signup(requestDto);
return new ResponseEntity<>("회원가입 성공", HttpStatus.CREATED); // 상태 코드 변경
} catch (Exception e) {
return new ResponseEntity<>(e.getMessage(), HttpStatus.BAD_REQUEST);
}
}
@PostMapping
public ResponseEntity<CommonResponse<CommentResponseDto>> createComment(@RequestBody CommentRequestDto commentRequestDto, @AuthenticationPrincipal UserDetailsImpl userDetails) {
commentRequestDto.setUserId(userDetails.getUsername());
CommentResponseDto comment = commentService.createComment(commentRequestDto);
return new ResponseEntity<>(CommonResponse.<CommentResponseDto>builder()
.statusCode(HttpStatus.CREATED.value())
.msg("댓글이 성공적으로 추가되었습니다.")
.data(comment)
.build(), HttpStatus.CREATED);
}
@PutMapping("/{id}")
public ResponseEntity<CommonResponse<CommentResponseDto>> updateComment(@PathVariable Long id, @RequestBody UpdateCommentRequestDto updateCommentRequestDto, @AuthenticationPrincipal UserDetailsImpl userDetails) {
updateCommentRequestDto.setUserId(userDetails.getUsername());
CommentResponseDto updatedComment = commentService.updateComment(id, updateCommentRequestDto);
return new ResponseEntity<>(CommonResponse.<CommentResponseDto>builder()
.statusCode(HttpStatus.NO_CONTENT.value())
.msg("댓글이 성공적으로 수정되었습니다.")
.data(updatedComment)
.build(), HttpStatus.NO_CONTENT);
}
@GetMapping("/schedule/{scheduleId}")
public ResponseEntity<CommonResponse<List<CommentResponseDto>>> getCommentsByScheduleId(@PathVariable Long scheduleId) {
List<CommentResponseDto> comments = commentService.getCommentsByScheduleId(scheduleId);
return new ResponseEntity<>(CommonResponse.<List<CommentResponseDto>>builder()
.statusCode(HttpStatus.OK.value())
.msg("댓글 목록 조회가 완료되었습니다.")
.data(comments)
.build(), HttpStatus.OK);
}
@DeleteMapping("/{id}")
public ResponseEntity<CommonResponse<Void>> deleteComment(@PathVariable Long id, @RequestBody DeleteCommentRequestDto deleteCommentRequestDto, @AuthenticationPrincipal UserDetailsImpl userDetails) {
deleteCommentRequestDto.setUserId(userDetails.getUsername());
commentService.deleteComment(id, deleteCommentRequestDto);
return new ResponseEntity<>(CommonResponse.<Void>builder()
.statusCode(HttpStatus.NO_CONTENT.value())
.msg("댓글이 성공적으로 삭제되었습니다.")
.build(), HttpStatus.NO_CONTENT);
}
@PostMapping
public ResponseEntity<CommonResponse<ScheduleResponseDto>> createSchedule(@RequestBody ScheduleRequestDto scheduleRequestDto, @AuthenticationPrincipal UserDetailsImpl userDetails) {
scheduleRequestDto.setManager(userDetails.getUsername());
ScheduleResponseDto schedule = scheduleService.createSchedule(scheduleRequestDto);
return ResponseEntity.status(HttpStatus.CREATED).body(CommonResponse.<ScheduleResponseDto>builder()
.statusCode(HttpStatus.CREATED.value())
.msg("생성이 완료 되었습니다.")
.data(schedule)
.build());
}
@GetMapping
public ResponseEntity<CommonResponse<List<ScheduleResponseDto>>> getAllSchedules() {
List<ScheduleResponseDto> schedules = scheduleService.getAllSchedules();
return ResponseEntity.ok(CommonResponse.<List<ScheduleResponseDto>>builder()
.statusCode(HttpStatus.OK.value())
.msg("목록 조회가 완료 되었습니다.")
.data(schedules)
.build());
}
@GetMapping("/{id}")
public ResponseEntity<CommonResponse<ScheduleResponseDto>> getSchedule(@PathVariable Long id) {
ScheduleResponseDto schedule = scheduleService.getSchedule(id);
return ResponseEntity.ok(CommonResponse.<ScheduleResponseDto>builder()
.statusCode(HttpStatus.OK.value())
.msg("단건 조회가 완료 되었습니다.")
.data(schedule)
.build());
}
@PutMapping("/{id}")
public ResponseEntity<CommonResponse<ScheduleResponseDto>> updateSchedule(@PathVariable Long id, @RequestBody UpdateScheduleRequestDto updateScheduleRequestDto, @AuthenticationPrincipal UserDetailsImpl userDetails) {
updateScheduleRequestDto.setManager(userDetails.getUsername());
ScheduleResponseDto schedule = scheduleService.updateSchedule(id, updateScheduleRequestDto);
return ResponseEntity.status(HttpStatus.NO_CONTENT).body(CommonResponse.<ScheduleResponseDto>builder()
.statusCode(HttpStatus.NO_CONTENT.value())
.msg("수정이 완료 되었습니다.")
.data(schedule)
.build());
}
내일부터 팀 프로젝트여서 오늘은 쉬엄쉬엄 했다
'TIL' 카테고리의 다른 글
TIL - 2024/06/05 (0) | 2024.06.05 |
---|---|
TIL - 2024/06/04 (0) | 2024.06.04 |
TIL - 2024/05/31 (0) | 2024.05.31 |
TIL - 2024/05/30 (0) | 2024.05.30 |
TIL - 2024/05/29 (2) | 2024.05.29 |