4. 과제1 - live-study의 대시 보드

2020. 12. 12. 12:31Java/live-study

과제 1. live-study 대시 보드를 만드는 코드를 작성하세요.

  • 깃헙 이슈 1번부터 18번까지 댓글을 순회하며 댓글을 남긴 사용자를 체크 할 것.
  • 참여율을 계산하세요. 총 18회에 중에 몇 %를 참여했는지 소숫점 두자리가지 보여줄 것.
  • Github 자바 라이브러리를 사용하면 편리합니다.
  • 깃헙 API를 익명으로 호출하는데 제한이 있기 때문에 본인의 깃헙 프로젝트에 이슈를 만들고 테스트를 하시면 더 자주 테스트할 수 있습니다.

 

실행 결과

 

ParticipationCalculator 코드

필드

// github의 정보들을 가져오기 위한 api
private final GitHub github;

// 누구의 repository이며 어떤 repository의 dash board임을 알려주기위한 필드들
private String repoAddress;
private String owner;
private String repositoryName;

// 참여율 계산에 필요한 이슈의 개수, 각 이슈 별 참여자 집합, 참여자 별 참여 횟수 필드
private int numberOfIssues;
private Set<String> participants = new HashSet<>();
private Map<String, Integer> numberOfParticipationByParticipant = new HashMap<>();

생성자

public ParticipationCalculator() throws IOException {
    github = new GitHubBuilder().fromPropertyFile().build();
}

Github의 객체는 한번의 초기화만 해도 된다고 생각하여 ParticipationCalculator 객체가 생성될 때 동시에 생성하게 했습니다.

run()

public void run() {
    Scanner scanner = new Scanner(System.in);
    System.out.println("스터디 repository 주소를 입력하세요. ex) whiteship/live-study");
    System.out.print("주소 입력: ");
    repoAddress = scanner.nextLine();

    setOwner(repoAddress);
    setRepositoryName(repoAddress);

    printParticipantRate();

}

run()메서드는 사용자가 참여율을 계산할 study repository를 입력받는 메소드입니다.

study repository를 입력 받고 owner 필드와 repositoryName필드를 초기화했습니다.

printParticipationRate()

private void printParticipationRate() {
    System.out.println(repositoryName+" dash board");
    numberOfParticipationByParticipant = calculateNumberOfParticipation();

    numberOfParticipationByParticipant.forEach(
        (participant, numberOfParticipation) -> {
            double rate = calculateRate(numberOfParticipation);
            System.out.println(participant+"의 참여율: " + String.format("%.2f", rate)+"%");
        });
}

printParticipationRate()는 repository의 issue 참여율을 출력하는 메서드입니다.

calculateNumberOfParticipation()메서드로 참여자 별 참여 횟수를 구한 뒤 calculateRate 메서드로 참여율을 구했습니다.

참여율은 String.format()으로 소숫점 두자리까지 출력하도록 했습니다.

calculateNumberOfParticipation()

private Map<String, Integer> calculateNumberOfParticipation() {
    List<GHIssue> issues = new ArrayList<>();
    try {
        issues = github.getRepository(repoAddress).getIssues(GHIssueState.ALL);
        numberOfIssues = issues.size();
    } catch(IOException e) {
        e.printStackTrace();
    }

    issues.forEach(issue -> {
        participants = getParticipants(issue);
        participants.forEach(participant -> {
            Integer numberOfParticipation = numberOfParticipationByParticipant.getOrDefault(participant, 0)+1;
            numberOfParticipationByParticipant.put(participant, numberOfParticipation);
        });
    });

calculateNumberOfParticipation() 메서드는 참여율을 제공하는 메서드입니다.

이슈는 상태와 상관 없이 모두 불러왔으며 getParticipants(GHIssue issue)메서드로 각 이슈 별 참여자 집합을 구했습니다. 이 때 참여율 계산에 필요한 이슈 개수를 초기화시켰습니다.

참여자 집합을 순회하며 numberOfParticipationByParticipant에 있는참여자의 참여 횟수를 증가시켰습니다.

getParticipants(GHIssue issue)

private Set<String> getParticipants(GHIssue issue) {
    String issueAuthor = "";
    try {
        issueAuthor = issue.getUser().getLogin();

    } catch(IOException e) {
        e.printStackTrace();
    }
    if(!issueAuthor.equals(owner)) return new HashSet<>();

    List<GHIssueComment> comments = new ArrayList<>();
    try {
        comments = issue.getComments();
    } catch(IOException e) {
        e.printStackTrace();
    }

    for(GHIssueComment comment : comments) {
        String participant = "";
        try {
            participant = comment.getUser().getLogin();
        } catch(IOException e) {
            e.printStackTrace();
        }
        if (!participant.equals(owner)) {
            participants.add(participant);
        }
    }
    return participants;
}

getParticipants(GHIssue issue)는 각 이슈 별 참여자 집합을 제공하는 메서드입니다.

이슈의 댓글들을 구하기 전에 이슈를 포스트한 사람이 repository이 주인인지를 확인하여 그렇지 않은 경우 빈 집합을 돌려주도록 했습니다.

이슈의 댓글들을 순회하면서도 repository의 주인은 집합에 포함되지않도록 했습니다.

calculateRate(Integer numberOfParticipants)

private double calculateRate(Integer numberOfParticipants) {
    return numberOfParticipants*1.0 / numberOfIssues * 100;
}

calculateRate(Integer numberOfParticipants)은 참여율을 제공하는 메서드입니다. 파라미터로 참여자의 참여횟수가 필요합니다.

'Java > live-study' 카테고리의 다른 글

4. 제어문에 대해 알아보자  (0) 2020.12.12