Skip to content
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-32][BE][산토리 & 포키] IssueTracker 5차 PR #237

Open
wants to merge 54 commits into
base: team-32
Choose a base branch
from

Conversation

Seokho-Ham
Copy link

@Seokho-Ham Seokho-Ham commented Jun 29, 2022

안녕하세요 피터! 5번째 pr 제출합니다~

이번 PR에서 진행한 사항

  • �Github Actions를 이용한 자동 배포
  • oauth 로그인 추상화
  • 이슈 도메인 생성, 수정, 삭제 api 구현
  • 마일스톤 crud api 구현

질문드릴 점

  1. IssueService 를 비롯한 다양한 Service에서 findxxx()와 같은 Optional 처리를 한 다음 엔티티를 찾아오는 메서드가 중복됩니다.
    이런 중복되는 코드들을 효과적으로 관리할 방법이 있을까요? 별도의 조회용 메서드만 모아놓은 서비스를 주입받는 방법도 있을 것 같긴한데
    적절한 방법일지 궁금합니다.

seyoung755 and others added 24 commits June 28, 2022 12:41
- 해당 이슈 id들을 리스트로 받습니다.
- issues에 빈 리스트로 초기화
- progressRate 소수점 3째자리까지 반환하도록 변경
@Seokho-Ham Seokho-Ham added the review-BE Improvements or additions to documentation label Jun 29, 2022
Copy link

@yeonnseok yeonnseok left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IssueService 를 비롯한 다양한 Service에서 findxxx()와 같은 Optional 처리를 한 다음 엔티티를 찾아오는 메서드가 중복됩니다.
이런 중복되는 코드들을 효과적으로 관리할 방법이 있을까요? 별도의 조회용 메서드만 모아놓은 서비스를 주입받는 방법도 있을 것 같긴한데
적절한 방법일지 궁금합니다.

서비스레이어에서 여러 서비스간에 엔티티 조회시 중복되는 로직이 있다면 엔티티를 기준으로 adapter Layer를 하나더 만드셔도 괜찮습니다.
예를 들어 Reader Layer를 만들어서 IssueReader 빈을 만들고 해당 클래스에 findIssue를 구현한뒤 다른 서비스에서 이 reader를 주입받아 사용하면 중복코드를 줄일 수 있겠죠?

Comment on lines +19 to +20
@Column(columnDefinition = "BOOLEAN", nullable = false)
private boolean isDeleted;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

soft delete도 적용하시는군요!

Comment on lines +10 to +25
public class GithubProperty {

private final String clientId;
private final String clientSecret;
private final String redirectUrl;
private final String accessTokenUrl;
private final String resourceUrl;

public GithubProperty(String clientId, String clientSecret, String redirectUrl, String accessTokenUrl, String resourceUrl) {
this.clientId = clientId;
this.clientSecret = clientSecret;
this.redirectUrl = redirectUrl;
this.accessTokenUrl = accessTokenUrl;
this.resourceUrl = resourceUrl;
}
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

abstract_class로 빼보는건 어떨까요?

Comment on lines +54 to +57
@Bean
public EnumMap<LoginType, OAuthProvider> oAuthProviderEnumMap(List<OAuthProvider> oAuthProviders) {
return new EnumMap<>(oAuthProviders.stream()
.collect(Collectors.toMap(OAuthProvider::getOAuthType, u -> u)));

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

꼭 EnumMap으로 만들필요가 있을까요? enummap이 가져다주는 어떤 장점이 있는지 고려해보시면 좋을 것 같습니다 ㅎㅎ

Comment on lines +12 to +13
@Query("select distinct m from Milestone m join fetch m.issues where m.isDeleted=false")
List<Milestone> findAll();

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

soft-delete를 사용하면 모든 쿼리에 is_deleted = false인 조건을 추가해줘야하는 불편함이 생깁니다.
테이블에 인덱스를 설정해줘야하는 것도 필요하겠죠?
현재는 deleted된 리소스를 조회할 필요성은 보이지 않기에 엔티티에 @where 어노테이션을 사용하면 default로 isDeleted 조건을 추가할 수 있습니다.!

}

@GetMapping("/count")
@Operation(summary = "마일스톤 개수 조회하기", description = "현재 마일스톤의 개수를 출력합니다.")
public MilestoneCountDto getCount() {
return null;
return milestoneService.count();

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

마일스톤의 카운트만 따로 조회하는 API가 꼭 필요할까요?
목록조회와 같은 화면에서 사용되는 API라면 목록의 갯수를 카운트로 활용하는 방법이 불필요한 호출을 줄이는 방법이 될 수 있을 것 같네요.

Comment on lines +31 to +42
public MilestonesResponseDto findAll() {

return new MilestonesResponseDto(milestoneRepository.findAll()
.stream()
.map(milestone ->
new MilestoneResponseDto(
milestone.getName(),
milestone.getDueDate(),
milestone.getDescription(),
milestone.getInformation())
).collect(Collectors.toList()));
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

마일스톤 하나를 detail 조회하는 API는 불필요할까요?

Comment on lines +43 to +51
if (issueSaveRequestDto.getAssignees() != null) {
List<IssueAssignee> issueAssignees = createIssueAssignees(issueSaveRequestDto.getAssignees(), issue);
issue.updateAssignees(issueAssignees);
}

if (issueSaveRequestDto.getLabelNames() != null) {
List<IssueLabel> labels = createIssueLabels(issueSaveRequestDto.getLabelNames(), issue);
issue.updateLabels(labels);
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

request로 assignee와 label의 id값을 받을 수 있지 않을까요?

Comment on lines +69 to +79
List<IssueLabel> labels = createIssueLabels(issueLabelEditRequestDto.getLabelNames(), issue);

issue.updateLabels(labels);
}

@Transactional
public void editMilestone(long issueId, IssueMilestoneEditRequestDto issueMilestoneEditRequestDto) {
Issue issue = findIssue(issueId);

Milestone milestone = findMilestone(issueMilestoneEditRequestDto.getMilestoneName());

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

label과 milestone의 이름으로 찾기보다 id로 받을 수 있다면 id 찾는게 좋지 않을까요?

Comment on lines +22 to +24
protected void changeDeleted(boolean isDeleted) {
this.isDeleted = isDeleted;
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

다시 복구 시킬 케이스도 고려하신걸까요?

}

@Operation(summary = "이슈의 제목을 편집하기", description = "기존 이슈의 제목을 편집합니다.")
@PutMapping("/title/{id}")
public IssueDetailDto editTitle(@PathVariable(value = "id") long issueId, @RequestBody IssueTitleEditRequestDto issueTitleEditRequestDto) {
return null;
public ResponseEntity<Void> editTitle(@Auth Long userId,

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저번에 리뷰드린바와 같이 @Auth를 통해 ArgumentResolver실행시 userId를 통해 User를 조회해서 넘겨준다면,
추후 추가적인 user조회 로직의 중복을 피할 수 있지 않을까요?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
review-BE Improvements or additions to documentation
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants