Skip to content

kimtaejun97/Hackathon-Hocket

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

37 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🖥 목표달성 앱 (해커톤)

💡프로젝트설명

  • 사용자에게 다양한 카테고리를 기반으로 하켓을 추천해줍니다.
  • 무작정 하켓을 추천해주는 것이 아닌 사용자의 지역을 기반으로 관심분야에 맞는 하켓을 추천해 줍니다.
  • 다른 사용자의 하켓 중 관심있는 하켓은 공유해 자신의 하켓으로 만들 수 있습니다.
  • 해당 하켓을 달성하기 위해 노력한 과정을 사진으로 남깁니다.
  • 여태까지 본인이 이룬 하켓들을 다시 볼 수 있습니다.

- 담당 역할: 백엔드

- 기간 : 기획 포함 약 2주.

🛠 스택


  • JPA

  • Spring Boot

  • AWS S3

  • Cache

  • Heroku를 이용한 서버 배포.

  • AWS S3와 연동하여 이미지 저장.

  • 저장, 조회 등 REST API

  • Kakao SDK를 사용한 소셜 로그인.

    • 클라이언트에서 넘어온 토큰의 유효성 검증 및 유저 정보 요청.
  • EhCache를 사용한 로그인 정보 확인.

  • CacheEventListener 과 Slf4j로 캐시 로깅

📃 도메인


Account

    @Id @GeneratedValue
    private Long id;

    @Column(nullable = false)
    private String nickname;

    @Column(nullable = false, unique = true)
    private String email;

    private String gender;

    private String ageRange;

    @OneToMany(mappedBy = "account", cascade = CascadeType.REMOVE)
    private Set<LikeHeart> likeHearts = new HashSet<>();

Hocket

    @Id @GeneratedValue
    private Long id;

    @ManyToOne
    private Account account;

    @Column(nullable = false)
    private String title;

    private String thumbnailImage;

    private String description;

    private String hocketSpot;

    @Column(nullable = false)
    private boolean isPublic;

    @Column(nullable = false)
    private boolean isRequireDate;

    @Column(nullable = false)
    private boolean isAchieved;

    private LocalDateTime createdDateTime;

    private LocalDateTime startDateTime;

    private LocalDateTime endDateTime;

    private Integer perWeeks;

    @OneToMany
    private Set<Tag> tags = new HashSet<>();

    @OneToMany(mappedBy = "bucket", cascade = CascadeType.REMOVE)
    Set<LikeHeart> likeHearts = new HashSet<>();

likeHeart

    @Id @GeneratedValue
    private Long id;

    @ManyToOne
    private Account account;

    @ManyToOne
    private Hocket hocket;

Image

    @Id @GeneratedValue
    private Long id;

    @Column(nullable = false, length = 500, unique = true)
    private String url;

    @Colum(nullable = false)
    private LocalDateTime addDateTime;

    @ManyToOne
    private Hocket hocket;

Video

    @Id @GeneratedValue
    private Long id;

    @Column(nullable = false, length = 500, unique = true)
    private String url;

    @ManyToOne
    private Hocket hocket;

Category

    @Id @GeneratedValue
    private Long id;

    @Column(nullable = false, unique = true)
    private String title;

초기 데이터 home, challenge, hobby, learning, exercise, food, culture, travel, etc


📃 API

📌 로그인 : POST "/login"


[params : String]

  • String token;

[return : ResponseEntity]

  • 유효하지 않은 토큰 : ResponseEntity.badRequest()
  • 없는 계정 : ResponseEntity.notFound()
  • 이메일 비동의 : ResponseEntity.badRequest()
  • 성공 : ResponseEntity.ok()

📌 로그아웃: POST "/logout" [params : String]


  • String token

[return : ResponseEntity]

  • 성공 : ResponseEntity.ok()

📌 가입 : POST "/sign-up"


[params : String]

  • String token;
  • 이메일 동의, 이름 동의, 연령대 동의

[return : ResponseDto]

  • 성공 : ok()
  • 존재하는 이메일 : BadRequest
  • 연령대 동의가 안됨 : BadRequest
  • 닉네임 동의가 안됨 : BadRequest
  • 이메일 동의가 안됨 : BadRequest

📌 가입 여부 확인


[params : String]

  • String token;

[return : ResponseDto]

  • 가입 : ok
  • 미가입 : NodFound

📌 계정 정보 받기 : GET "/account/info/{token}"


[params : String]

  • String token;

[return : JSON]

  • 성공 :
    private Long id;
    private String nickname;
    private String email;
    private String name;
    private String gender;
    private Integer age;
    private String profileImage;
  • token에 해당하는 계정 없음 : NotFound

📌 Hocket 추가하기 : POST "/hacket/create"


[params : JSON]

    @NotBlank
    private String token;

    @NotBlank
    private String title;

    @NotBlank
    private boolean isPublic;

    @NotBlank
    private boolean isAchieved;

    @NotBlank
    private boolean isRequireDate;

    private LocalDateTime startDateTime;

    private LocalDateTime endDateTime;

    private Integer perWeeks;

    private MultipartFile thumbnailImage;

    private String description;

    private String hocketSpot;

    private Set<String> categoryTitles;

[return : ResponseEntity]

  • 성공 : ok()
  • 유효하지 않은 토큰,가입 되지 않은 회원: badRequest

📌 사용자의 간단한 하켓 정보 리스트 : GET "/hocket/simpleList"


[params : String]

  • String token

[return : JSON]

    @NotBlan
    Long id;

    @NotBlank
    private String title;

    @NotBlank
    private int numberOfHearts;

    private LocalDateTime startDateTime;

    private LocalDateTime endDateTime;

    private int perWeeks;
  • 날짜 지정 x 이면 DateTime == null , perWeeks ==0

📌 하켓 갤러리 이미지 리스트 : GET "/hocket/images"


[params : JSON]

  • @NotBlank String token;
  • @NotBlank String hocketId;

[return : List] *OrderByaddDateTimeDesc

  • ImageDto :
  • String url
  • LocalDateTime addDateTime
  • 토큰 유효하지 않거나, 요청 사용자와 하켓 생성자가 일치하지 않아도 null 반환.

📌 하켓에 이미지 추가 : POST "/hocket/addImage"


[params : JSON]

  • @NotBlank String token;
  • @NotBlank String hocketId;
  • @NotBlank MultipartFile image;

[return : ResponseEntity]

  • 유효하지 않은 토큰, 생성자와 일치하지 않음 : badRequest()
  • 성공 : ok()

📌 하켓 상세 정보 : GET "/hocket/details"


[params : String]

  • String hocketId;

[return : JSON]

    private String title;

    private String description;

    private String hocketSpot;

    private boolean isPublic;

    private boolean isRequireDate;

    private boolean isAchieved;

    private LocalDateTime createdDateTime;

    private LocalDateTime startDateTime;

    private LocalDateTime endDateTime;

    private int perWeeks;

    private int numberOfHearts;

    private List<String> categoryTitles = new ArrayList<>();

📌 위시 리스트에 하켓 추가 : POST "/likeHeart/add"


[params : JSON]

  • @NotBlank String token;
  • @NotBlank Long hocketId;

[return : ResponseEntity]

  • 토큰이 올바르지 않거나 계정 없음 : BadRequest()
  • 성공 : ok()

📌 카테고리 하켓 리스트 : GET "/hocket/category"


[params : String]

  • String category;

[return : List]

  • Dto
    private String title;

    private String thumbnailImage;

    private int numberOfHearts;

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Java 99.8%
  • HTML 0.2%