공부 시작 시각 인증
수강 인증 사진
학습 인증샷
커뮤니티 피드 유즈 케이스
유저 메인 서비스 FLOW
- 유저 생성
- 유저는 id 를 통해 구분이 되어야 함
- 이름, 프로필 이미지를 입력 받으면 저장되어야 함
- 단, 이름은 빈 값이 입력되면 안됨
- 팔로우 기능:
- 사용자는 다른 이용자를 팔로우 할 수 있음
- 팔로우 취소 할 수 있음
- 자기 자신을 팔로우 할 수 없음
- 프로필 노출:
- 사용자 프로필을 누르면 다음과 같은 정보들이 노출 됨
- 이름, 유저 프로필, 팔로잉 숫자, 팔로워 숫자
- 팔로잉 팔로우 유저 리스트
- 이름, 프로필
- 단, 팔로잉, 팔로우 숫자를 클릭 했을 때에 각 유저 리스트가 노출됨
- 사용자 프로필을 누르면 다음과 같은 정보들이 노출 됨
피드 서비스 메인 FLOW
- 게시물 작성:
- 사용자가 텍스트를 입력하고
- 사용자가 공개 대상 (예: 모두 공개, 팔로워 전용)을 선택합니다.
- 사용자가 게시물을 제출합니다.
- 단, 게시물의 글자수는 5글자 이상 500자 이하여야 합니다.
- 댓글 작성:
- 시용자기 텍스트를 입력하고
- 사용자가 댓글을 제출합니다.
- 단, 댓글의 글자수는 100자 이하여야 합니다.
- 게시물 상호작용:
- 사용자는 '좋아요' 버튼을 눌러 게시물을 좋아할 수 있습니다.
- 본인 게시글은 본인이 좋아요를 누를 수 없습니다.
- 사용자는 댓글 섹션에 메시지를 입력하여 게시물에 댓글을 달 수 있습니다.
- 좋아요 개수를 누르면 좋아요를 누른 인원들을 볼 수 있음
- 댓글 개수를 누르면 댓글 리스트가 보일 수 있음
- 글 수정 버튼을 누르면 글을 수정할 수 있음
- 본인이 작성한 글이 아니면 수정 할 수 없음
- 수정이 된 여부와 수정된 시간을 같이 저장해야 함
- 댓글 수정 버튼을 누르면 댓글을 수정 할 수 있음
- 본인이 작성한 댓글이 아니면 수정 할 수 없음
- 수정이 된 여부와 수정된 시간을 같이 저장해야 함
- 사용자는 '좋아요' 버튼을 눌러 게시물을 좋아할 수 있습니다.
- 피드 보기:
- 사용자는 팔로우 한 사람이 작성한 글을 시간 순서대로 볼 수 있습니다.
- 사용자는 피드를 스크롤하여 콘텐츠를 봅니다.
- 게시글은 다음과 같은 정보를 제공합니다.
- 글 내용, 작성자 이름, 작성자 프로필, 좋아요 개수, 댓글 개수, 수정 여부 , 발행 일자 (수정 시간), 나의 좋아요 여부
- 댓글 리스트:
- 댓글 리스트에는 다음과 같은 정보들이 노출되어야 함
- 작성자 이름, 작성자 프로필, 댓글 내용, 좋아요 개수, 수정 여부, 발행 일자 (수정 시간), 나의 좋아요 여부
- 댓글에 좋아요를 누를 수 있음
- 댓글 리스트에는 다음과 같은 정보들이 노출되어야 함
User.java
package org.fastcampus.domain;
import java.util.Objects;
class User {
private final Long id;
private final UserInfo info;
private final UserRelationCounter followingCount;
private final UserRelationCounter followerCount;
public User(Long id, UserInfo userInfo) {
this.id = id;
this.info = userInfo;
this.followingCount = new UserRelationCounter();
this.followerCount = new UserRelationCounter();
}
public void follow(User targetUser) {
if (targetUser.equals(this)) {
throw new IllegalArgumentException();
}
followingCount.increase();
targetUser.increaseFollowerCount();
}
public void unfollow(User targetUser) {
if (targetUser.equals(this)) {
throw new IllegalArgumentException();
}
followingCount.decrease();
targetUser.decreaseFollowerCount();
}
private void increaseFollowerCount() {
followerCount.increase();
}
private void decreaseFollowerCount() {
followerCount.decrease();
}
@Override
public boolean equals(Object o) {
if (o == null || getClass() != o.getClass()) {
return false;
}
User user = (User) o;
return Objects.equals(id, user.id);
}
@Override
public int hashCode() {
return Objects.hashCode(id);
}
}
UserInfo.java
package org.fastcampus.domain;
class UserInfo {
private final String name;
private final String profileImageUrl;
public UserInfo(String name, String profileImageUrl) {
if (name == null || name.isEmpty()) {
throw new IllegalArgumentException();
}
this.name = name;
this.profileImageUrl = profileImageUrl;
}
}
UserRelationCounter.java
package org.fastcampus.domain;
public class UserRelationCounter {
private int count;
public UserRelationCounter() {
this.count = 0;
}
public void increase() {
this.count++;
}
public void decrease() {
if (count <= 0) {
return;
}
this.count--;
}
}