-
Notifications
You must be signed in to change notification settings - Fork 70
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Team-21][BE][루이1세] 2주차 세번째 PR #215
base: team-21
Are you sure you want to change the base?
Conversation
[BE] 백엔드 배포
- 입력값 유효한 경우 커멘트, 매니저, 라벨, 마일스톤 저장 - 작성자 추후 추가 예정
- createDateTime, updateDateTime, status
[BE] 이슈 등록 기능 구현
- 연관관계 편의 메서드 및 샘플 회원 데이터 추가
feat : Issue 등록 기능 사용자 추가
[BE] 파일 업로드 기능 구현
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
안녕하세요, Sigrid Jin입니다.
몇 가지 리뷰한 사항을 남겨드렸으니 확인해주시면 감사하겠습니다. 마지막까지 화이팅입니다 💯
# 변수에 저장된 것을 컨테이너 실행시 이름을 app.jar파일로 변경하여 컨테이너에 저장 | ||
COPY ${JAR_FILE} app.jar | ||
|
||
# 빌드된 이미지가 run 될 때 실행할 명령어 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
정리가 꼼꼼해서 좋네요.
@@ -11,14 +14,12 @@ | |||
|
|||
@Entity | |||
@Table(name = "comments") | |||
@NoArgsConstructor(access = AccessLevel.PROTECTED) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
막아두신 것 좋네요.
@@ -33,9 +37,30 @@ public class Issue { | |||
private List<IssueManager> issueManagers = new ArrayList<>(); | |||
|
|||
private String title; | |||
private LocalDateTime createDateTime; | |||
private LocalDateTime createDateTime = LocalDateTime.now(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit
다른 팀에서 하셨던 이전 프로젝트 리뷰에서 다음의 링크에 나와있는 질문을 드린 적이 있습니다. 한 번 살펴보세요.
참고 할 만한 링크
this.issue = issue; | ||
issue.addIssueLabel(this); | ||
this.label = label; | ||
label.addIssueLabel(this); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
현재 하신 것이 딱히 나쁘지 않은 접근이긴 합니다만, issue
와 label
이 서로를 양방향으로 꼭 알아야 하나요? 한 쪽만 알게 구현하고, 다른 쪽에서 불러올 때는 DB에서 쿼리를 날려서 불러오도록 하면 어떨까요?
@@ -16,5 +20,11 @@ public class IssueManager { | |||
|
|||
@ManyToOne | |||
@JoinColumn | |||
private Member manger; | |||
private Member manager; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@Inheritance
라는 어노테이션에 대해서도 한 번 알아보세요. Manager를 상속하는 클래스가 되는 것이 자연스러운 접근인 것으로 보입니다.
private final MemberRepository memberRepository; | ||
private final LabelRepository labelRepository; | ||
private final IssueLabelRepository issueLabelRepository; | ||
private final MilestoneRepository milestoneRepository; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
어우, 너무 많은 Repository를 상속하고 있네요. 이 쯤 되면 DDD에 대해서도 고민할 법 합니다. 물론 저도 잘 모르지만요. 큰 도메인 안에서 서로 연관된 클래스를 서로 엮어 각각의 entrypoint를 만들고, 각각의 도메인끼리 관계를 맺도록 구현하는 것이 DDD입니다. 지금은 하나의 도메인(Issue)가 지나치게 비대해 여러 가지 다양한 도메인을 다루는 여러 Repository를 모두 사용하고 있지요. 너무 결합도가 높은 설계입니다.
private final MilestoneRepository milestoneRepository; | ||
|
||
@Transactional | ||
public void register(IssueSaveRequest issueSaveRequest, Long memberId) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
음.. 이 코드를 보고 무슨 생각이 드시나요? 지금 이 register
가 여러 가지 책임을 모두 수행하고 있어, 이 코드를 리팩토링해야 할 일이 있으면 아주 건들기 어렵지 않을까요?
도메인 모델이 비즈니스 객체를 들고 있도록 구현해야 합니다. 그 이유가 무엇일 지 아래 링크를 보고 자신만의 의견을 작성해주세요.
우리가 도메인이 비즈니스 로직의 주도권을 가지고 개발하는 것을 도메인 주도 설계(DDD) 라 합니다. 이렇게 해두면 서비스의 많은 로직이 엔티티로 이동하고, 서비스는 엔티티를 호출하는 정도의 얇은 비즈니스 로직을 가지게 되는데, 이렇게 구현하면 information expert pattern 를 지키면서 구현할 수 있습니다.
시간이 되실 때 클린코드 책도 한 번 읽어보세요.
|
||
private final AmazonS3Client amazonS3Client; | ||
|
||
@Value("${cloud.aws.s3.bucket}") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@Value
의 사용이 좋습니다.
import org.springframework.web.multipart.MultipartFile; | ||
|
||
@RequiredArgsConstructor | ||
@RequestMapping("/upload-files") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
파일 업로드라면 구체적으로 어떤 파일을 업로드할 지 리소스 중심으로 작명해주시면 좋겠습니다.
다음 링크를 참고해주세요.
Comment comment = new Comment(issue, issueSaveRequest.getContents()); | ||
commentRepository.save(comment); | ||
} | ||
if (!issueSaveRequest.getManagerIds().isEmpty()) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
if 문이 너무 많아지고 있는데요. 문제점이 있을까요? 만약 문제가 있다면, 어떻게 개선해야 할까요?
- Querydsl을 통해 이슈 오픈 및 클로즈 개수 구하기 - 입력한 필터에 따라 이슈리스트 Response
[BE] 필터검색 기능 구현
refactor: DTO 패키지 분리
Revert "refactor: DTO 패키지 분리"
refactor : DTO 패키지 구조변경
- findByIdOrThrow 메서드로 분리
[BE] 이슈 제목 편집 및 삭제 기능 구현
- 해당 어노테이션 사용시 LocalDateTime 반환시 배열로 출력되므로 제거
[BE]이슈 상태 변경
[BE] 코멘트 작성 기능 구현
[BE] 코멘트 편집 기능 구현
- 로그아웃 요청시 액세스토큰 재발급과 동일하게 검증
feat: 로그아웃 기능 구현
@@ -30,4 +30,9 @@ public Member(String socialId, String avatarImageUrl) { | |||
public void changeRefreshToken(String refreshToken) { | |||
this.refreshToken = refreshToken; | |||
} | |||
|
|||
public void deleteRefreshToken() { | |||
this.refreshToken = null; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
null
값을 직접 넣기 보다는 다른 방법이 있지 않을까요?
저라면 Null Object Pattern을 적용하든, 차라리 빈 문자열을 넣겠어요.
참고할 만한 링크
@@ -42,4 +42,10 @@ private Member findByIdOrThrow(Long id) { | |||
throw new MemberNotFoundException("해당 id를 가진 회원이 존재하지 않습니다."); | |||
}); | |||
} | |||
|
|||
@Transactional | |||
public void deleteRefreshToken(Long id) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
아무리 delete
라 하더라도 기본적인 응답값을 주는 것이 좋습니다.
여기서는 Member
를 리턴할 수 있겠네요.
- 요청 값 검증 로직 추가
[BE] 라벨 관련 기능 구현
[BE] 마일스톤 기능 구현
인사말
안녕하세요 시그리드! 루이 & 한세입니다 😄
이번에는 본격적으로 기능 구현을 들어갔습니다!
진행 사항
API 명세서
업데이트 된 API 명세서