diff --git a/src/main/java/com/example/FixLog/FixLogApplication.java b/src/main/java/com/example/fixlog/FixLogApplication.java similarity index 90% rename from src/main/java/com/example/FixLog/FixLogApplication.java rename to src/main/java/com/example/fixlog/FixLogApplication.java index e8c3276..5f2e48b 100644 --- a/src/main/java/com/example/FixLog/FixLogApplication.java +++ b/src/main/java/com/example/fixlog/FixLogApplication.java @@ -1,4 +1,4 @@ -package com.example.FixLog; +package com.example.fixlog; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/src/main/java/com/example/fixlog/domain/bookmark/Bookmark.java b/src/main/java/com/example/fixlog/domain/bookmark/Bookmark.java new file mode 100644 index 0000000..13a6a50 --- /dev/null +++ b/src/main/java/com/example/fixlog/domain/bookmark/Bookmark.java @@ -0,0 +1,29 @@ +package com.example.fixlog.domain.bookmark; + +import com.example.fixlog.domain.member.Member; +import com.example.fixlog.domain.post.Post; + +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Bookmark { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name="bookmarkId") + private Long id; + + @ManyToOne + @JoinColumn(name = "userId") + private Member member; + + @ManyToOne + @JoinColumn(name = "postId") + private Post post; +} diff --git a/src/main/java/com/example/fixlog/domain/bookmark/BookmarkTag.java b/src/main/java/com/example/fixlog/domain/bookmark/BookmarkTag.java new file mode 100644 index 0000000..fe8f59a --- /dev/null +++ b/src/main/java/com/example/fixlog/domain/bookmark/BookmarkTag.java @@ -0,0 +1,26 @@ +package com.example.fixlog.domain.bookmark; + +import com.example.fixlog.domain.tag.Tag; +import com.example.fixlog.domain.tag.TagCategory; +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class BookmarkTag { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "bookmarkTagId",nullable = false) + private Long id; + + @Column(length = 20, nullable = false) + private String tagName; + + @Enumerated(EnumType.STRING) + private TagCategory tagCategory; +} diff --git a/src/main/java/com/example/fixlog/domain/bookmark/BookmarkTagMap.java b/src/main/java/com/example/fixlog/domain/bookmark/BookmarkTagMap.java new file mode 100644 index 0000000..5064ea0 --- /dev/null +++ b/src/main/java/com/example/fixlog/domain/bookmark/BookmarkTagMap.java @@ -0,0 +1,26 @@ +package com.example.fixlog.domain.bookmark; + +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class BookmarkTagMap { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "mapId", nullable = false) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "bookmarkId", nullable = false) + private Bookmark bookmark; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "bookmarkTagId", nullable = false) + private BookmarkTag bookmarkTag; +} \ No newline at end of file diff --git a/src/main/java/com/example/fixlog/domain/follow/Follow.java b/src/main/java/com/example/fixlog/domain/follow/Follow.java new file mode 100644 index 0000000..dcbe508 --- /dev/null +++ b/src/main/java/com/example/fixlog/domain/follow/Follow.java @@ -0,0 +1,26 @@ +package com.example.fixlog.domain.follow; + +import com.example.fixlog.domain.member.Member; +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Follow { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "followId") + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "followerId", nullable = false) + private Member follower; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "followingId", nullable = false) + private Member following; +} diff --git a/src/main/java/com/example/fixlog/domain/fork/Fork.java b/src/main/java/com/example/fixlog/domain/fork/Fork.java new file mode 100644 index 0000000..aa0f43b --- /dev/null +++ b/src/main/java/com/example/fixlog/domain/fork/Fork.java @@ -0,0 +1,31 @@ +package com.example.fixlog.domain.fork; + +import com.example.fixlog.domain.member.Member; +import com.example.fixlog.domain.post.Post; +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Fork { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "forkId") + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "userId", nullable = false) + private Member member; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "postId", nullable = false) + private Post originalPost; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "forkPostId", nullable = false) + private Post forkedPost; +} diff --git a/src/main/java/com/example/fixlog/domain/like/PostLike.java b/src/main/java/com/example/fixlog/domain/like/PostLike.java new file mode 100644 index 0000000..c2cf664 --- /dev/null +++ b/src/main/java/com/example/fixlog/domain/like/PostLike.java @@ -0,0 +1,27 @@ +package com.example.fixlog.domain.like; + +import com.example.fixlog.domain.member.Member; +import com.example.fixlog.domain.post.Post; +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class PostLike { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "likeId", nullable = false) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "userId", nullable = false) + private Member member; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "postId", nullable = false) + private Post post; +} diff --git a/src/main/java/com/example/fixlog/domain/member/Member.java b/src/main/java/com/example/fixlog/domain/member/Member.java new file mode 100644 index 0000000..8b09553 --- /dev/null +++ b/src/main/java/com/example/fixlog/domain/member/Member.java @@ -0,0 +1,63 @@ +package com.example.fixlog.domain.member; + +import com.example.fixlog.domain.post.Post; +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@EntityListeners(AuditingEntityListener.class) +public class Member { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "userId") + private Long id; + + @Column(nullable = false) + private String email; + + @Column(nullable = false) + private String password; + + @Column(nullable = false) + private String nickname; + + @Column(nullable = false) + private Boolean isDeleted = false; + + @Enumerated(EnumType.STRING) + @Column(nullable = false) + private SocialType socialType = SocialType.EMAIL; + + @CreatedDate + private LocalDateTime createdAt; + + @LastModifiedDate + private LocalDateTime updatedAt; + + @OneToMany(mappedBy = "member", cascade = CascadeType.ALL, orphanRemoval = true) + private List posts = new ArrayList<>(); + + // Member 객체를 정적 팩토리 방식으로 생성하는 메서드 + // Creates a Member object using a static factory method + public static Member of(String email, String password, String nickname, SocialType socialType) { + Member member = new Member(); + member.email = email; + member.password = password; + member.nickname = nickname; + member.socialType = socialType; + member.isDeleted = false; + return member; + } +} \ No newline at end of file diff --git a/src/main/java/com/example/fixlog/domain/member/SocialType.java b/src/main/java/com/example/fixlog/domain/member/SocialType.java new file mode 100644 index 0000000..74eaae8 --- /dev/null +++ b/src/main/java/com/example/fixlog/domain/member/SocialType.java @@ -0,0 +1,6 @@ +package com.example.fixlog.domain.member; + +public enum SocialType { + EMAIL, + GITHUB +} diff --git a/src/main/java/com/example/fixlog/domain/post/Post.java b/src/main/java/com/example/fixlog/domain/post/Post.java new file mode 100644 index 0000000..0ec0501 --- /dev/null +++ b/src/main/java/com/example/fixlog/domain/post/Post.java @@ -0,0 +1,38 @@ +package com.example.fixlog.domain.post; + +import com.example.fixlog.domain.member.Member; +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Post { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "postId", nullable = false) + private Long id; + + @Column(length = 20, nullable = false) + private String title; + + @Column(columnDefinition = "TEXT", nullable = false) + private String content; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "userId", nullable = false) + private Member member; + + private LocalDateTime createdAt; + private LocalDateTime updatedAt; + + @OneToMany(mappedBy = "post", cascade = CascadeType.ALL, orphanRemoval = true) + private List postImages = new ArrayList<>(); +} \ No newline at end of file diff --git a/src/main/java/com/example/fixlog/domain/post/PostImage.java b/src/main/java/com/example/fixlog/domain/post/PostImage.java new file mode 100644 index 0000000..3c982b0 --- /dev/null +++ b/src/main/java/com/example/fixlog/domain/post/PostImage.java @@ -0,0 +1,24 @@ +package com.example.fixlog.domain.post; + +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class PostImage { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "postImageId",nullable = false) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "postId", nullable = false) + private Post post; + + @Column(columnDefinition = "TEXT", nullable = false) + private String postImageUrl; +} diff --git a/src/main/java/com/example/fixlog/domain/post/PostTag.java b/src/main/java/com/example/fixlog/domain/post/PostTag.java new file mode 100644 index 0000000..b3dc0ec --- /dev/null +++ b/src/main/java/com/example/fixlog/domain/post/PostTag.java @@ -0,0 +1,26 @@ +package com.example.fixlog.domain.post; + +import com.example.fixlog.domain.tag.Tag; +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class PostTag { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "postTagId",nullable = false) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "postId", nullable = false) + private Post post; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "tagId", nullable = false) + private Tag tag; +} diff --git a/src/main/java/com/example/fixlog/domain/tag/Tag.java b/src/main/java/com/example/fixlog/domain/tag/Tag.java new file mode 100644 index 0000000..f48360a --- /dev/null +++ b/src/main/java/com/example/fixlog/domain/tag/Tag.java @@ -0,0 +1,23 @@ +package com.example.fixlog.domain.tag; + +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Tag { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "tagId",nullable = false) + private Long id; + + @Enumerated(EnumType.STRING) + private TagCategory tagCategory; + + @Column(length = 20, nullable = false) + private String tag_name; +} \ No newline at end of file diff --git a/src/main/java/com/example/fixlog/domain/tag/TagCategory.java b/src/main/java/com/example/fixlog/domain/tag/TagCategory.java new file mode 100644 index 0000000..ba9964d --- /dev/null +++ b/src/main/java/com/example/fixlog/domain/tag/TagCategory.java @@ -0,0 +1,7 @@ +package com.example.fixlog.domain.tag; + +public enum TagCategory { + STYLE, + CONCEPT, + ETC +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 80e40c5..378e722 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1 +1,15 @@ -spring.application.name=FixLog +spring.application.name=fixlog + +# DB setting +spring.h2.console.enabled=true +spring.h2.console.path=/h2-console + +# DataBase Info +spring.datasource.url=jdbc:h2:tcp://localhost/~/fixlog +spring.datasource.driver-class-name=org.h2.Driver +spring.datasource.username=sa +spring.datasource.password= + +spring.jpa.show-sql=true +spring.jpa.hibernate.ddl-auto=update +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect \ No newline at end of file diff --git a/src/test/java/com/example/FixLog/FixLogApplicationTests.java b/src/test/java/com/example/fixlog/FixLogApplicationTests.java similarity index 86% rename from src/test/java/com/example/FixLog/FixLogApplicationTests.java rename to src/test/java/com/example/fixlog/FixLogApplicationTests.java index b25417c..09e177c 100644 --- a/src/test/java/com/example/FixLog/FixLogApplicationTests.java +++ b/src/test/java/com/example/fixlog/FixLogApplicationTests.java @@ -1,4 +1,4 @@ -package com.example.FixLog; +package com.example.fixlog; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest;