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

Seminar1 심화 과제 #4

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
Open

Seminar1 심화 과제 #4

wants to merge 3 commits into from

Conversation

Yeonnies
Copy link
Collaborator

@Yeonnies Yeonnies commented Oct 11, 2024

고민과정 - 삭제된 일기 복구 기능 추가 ⭐️⭐️

크게 두 가지로 고민했습니다.
첫 번째는 데이터베이스를 하나 더 만들어 임시 저장소 처럼 사용하는 방법입니다. 삭제가 되더라도 다른 파일에는 저장되어 있어 불러올 수 있도록 하는 방법입니다.
두 번째는 실제로 삭제가 되지는 않았지만 삭제가 된 것처럼 보이게 하는 방법입니다. 문득 컴퓨터에서 파일 관리를 할 때 휴지통에서 삭제된 파일을 복구하는 것이 생각나, 이 원리에 대해 조사해보았습니다.

윈도우 운영체제에서는 파일을 삭제할 경우 해당 파일의 메타 정보만 삭제하고 실제 데이터는 남아 있다. 따라서 실제 데이터가 남아 있으므로 파일을 복구할 수 있다.

첫 번째 방법은 많이 번거로울 것 같아 두 번째 방법으로 구현해보았습니다. 두 번째 방법은 데이터가 계속 축적되기 때문에 불필요한 데이터가 남아있을 수도 있다는 단점이 있으나, 저장하는 데이터가 큰 용량이 아니기 때문에 성능에 있어 별 영향이 가지 않을 것으로 판단하였습니다.

구현내용 - 삭제된 일기 복구 기능 추가 ⭐️⭐️

[Diary]

다이어리 클래스에 private boolean isDeleted = false; 를 추가하여 삭제 여부를 관리할 수 있도록 하였습니다.
또한, 아래와 같은 isDeleted의 getter와 setter를 추가하였습니다.

public boolean isDeleted() {
        return isDeleted;
    }
public void setDeleted(boolean deleted) {
        this.isDeleted = deleted;
    }

[DiaryRepository]

private final Map<Long, Diary> storage = new ConcurrentHashMap<>();처럼 String을 Diary로 변경하였습니다.(isDeleted에 접근하기 위해)
이부분을 그대로 String 타입으로 두고 수정해보려 했으나.. 잘 되지 않아 결국 다른 함수들까지 다 바꿔주었습니다.
save와 update 메서드에서는 setDeleted(false) 를 해주고, delete는 setDeleted(true) 를 해주었습니다.
findAll 메서드에서는

if (diary != null && !diary.isDeleted()) {
                diaryList.add(diary);
            }

다음과 같이 조건문을 추가해 isDeleted가 true인 diary는 보이지 않게 했습니다.
마지막으로

void restore(final long id) {
        Diary diary = storage.get(id);
        if (diary != null && diary.isDeleted()) {
            diary.setDeleted(false);
        }
    }

restore 메서드를 추가해 데이터를 복구하는 로직을 구현했습니다.

고민과정 - 일기 수정 일일 2회 제한 기능 추가 ⭐️⭐️

기획서의 질답을 보고 힌트를 얻었습니다. LocalDateTime 클래스의 메소드를 활용하여 다음날이 되면 초기화되도록 구현하려했습니다.

구현내용 - 일기 수정 일일 2회 제한 기능 추가 ⭐️⭐️

[Diary]

private int editCount = 0;
private LocalDateTime lastEditedDateTime;

위와 같이 코드를 추가해주고, 각각의 getter와 setter도 추가했습니다.

[DiaryRepository]

저는 이 부분에서 많이 시간을 할애했습니다. 아래와 같은 코드를 짰는데

void update(final long id, final String newBody) {
        Diary diary = storage.get(id);
        if (diary != null && !diary.isDeleted()) {
            LocalDateTime now = LocalDateTime.now();
            LocalDateTime lastEditedDateTime = diary.getLastEditedDateTime();

            if (!(lastEditedDateTime.toLocalDate().equals(now.toLocalDate()))) {
                diary.setEditCount(0);
                diary.setLastEditedDateTime(now);
            }

            if (diary.getEditCount() <2){
                diary.incrementEditCount();
                diary.setDeleted(false);
                diary = new Diary(id, newBody);
                storage.put(id, diary);
            } else {
                throw new Main.UI.InvalidInputException();
            }
        }
    }

예외가 처리되지 않아 무엇이 문제인지 한참을 찾다가 diary 부분에 new로 할당되고 있음을 깨달았습니다.
그래서 diary 클래스에 editCount를 넣지 않고 DiaryRepository에 updateCount를 넣어 다시 아래와 같은 조건문을 만들었습니다.

if (diary != null && !diary.isDeleted()) {
            LocalDateTime now = LocalDateTime.now();
            LocalDateTime lastEditedDateTime = diary.getLastEditedDateTime();

            if (!(lastEditedDateTime.toLocalDate().equals(now.toLocalDate()))) {
                updateCount = 0;
                diary.setLastEditedDateTime(now);
            }

            if (updateCount <2){
                updateCount++;
                diary.setDeleted(false);
                storage.replace(id, new Diary(id, newBody));
            } else {
                throw new Main.UI.InvalidInputException();
            }
        }

}

if (updateCount <2){
updateCount++;

Choose a reason for hiding this comment

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

updateCount 에 대한 동시처리 고민도 가지면 좋을것같습니다

Comment on lines +43 to +49
LocalDateTime now = LocalDateTime.now();
LocalDateTime lastEditedDateTime = diary.getLastEditedDateTime();

if (!(lastEditedDateTime.toLocalDate().equals(now.toLocalDate()))) {
updateCount = 0;
diary.setLastEditedDateTime(now);
}

Choose a reason for hiding this comment

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

해당 로직은 Repository 영역이라고 볼 수 있을까요?
Repository 의 역할은 단순히 데이터를 읽고 조회하는 역할이라고 생각이 들어요.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants