๊ด€๋ฆฌ ๋ฉ”๋‰ด

๐Ÿ’ป๐Ÿ’ญ๐ŸŽง๐ŸŒ

[์›น ๊ฐœ๋ฐœ ํ”„๋กœ์ ํŠธ] 1. DB ์„ค๊ณ„ ๋ฐ domain ์ฝ”๋“œ ์ž‘์„ฑ ๋ณธ๋ฌธ

์›น ๊ฐœ๋ฐœ ํ”„๋กœ์ ํŠธ

[์›น ๊ฐœ๋ฐœ ํ”„๋กœ์ ํŠธ] 1. DB ์„ค๊ณ„ ๋ฐ domain ์ฝ”๋“œ ์ž‘์„ฑ

adorableco 2024. 1. 3. 00:09
๋ฐ˜์‘ํ˜•

ํ”„๋กœ์ ํŠธ ๊ฐ„๋žต ์†Œ๊ฐœ : ํ•จ๊ป˜ ์šด๋™ ๊ฒฝ๊ธฐ๋ฅผ ํ•  ์ธ์›์„ ๋ชจ์ง‘ํ•˜๋Š” ์„œ๋น„์Šค

 

๋จผ์ € ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ˆ˜์—…์—์„œ ๋ฐฐ์› ๋˜ ๋‚ด์šฉ๋“ค์„ ๋‹ค์‹œ ๋ณต๊ธฐ์‹œ์ผœ ERD ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค.

์ˆœํ™˜๊ตฌ์กฐ๊ฐ€ ๋˜๋Š”๊ฑด ์ข‹์ง€ ์•Š๋‹ค๊ณ  ํ•˜๋Š”๋ฐ.. ์•„๋ฌด๋ฆฌ ์ƒ๊ฐํ•ด๋„ ๋‹ค๋ฅธ ๋ฐฉ์•ˆ์ด ๋– ์˜ค๋ฅด์ง€ ์•Š์•˜๋‹ค.

ERD ๋งŒ ๋ดค์„ ๋•Œ USER๊ฐ€ POST์™€ MATCH ๋‘ ์—”ํ‹ฐํ‹ฐ ๋ชจ๋‘์™€ ๊ด€๊ณ„๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ด ์ด์ƒํ•ด๋ณด์ด๋Š”๋ฐ POST ๋ฅผ ๋“ฑ๋กํ•œ USER ์˜ ๊ฒฝ์šฐ์—๋Š” POST -> MATCH ์™€ ๊ฐ™์ด MATCH ์—”ํ‹ฐํ‹ฐ๋กœ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ๋‹จ์ˆœํžˆ ๋“ฑ๋ก๋œ ๋ชจ์ง‘๊ธ€์„ ํ†ตํ•ด MATCH ์— ์ฐธ๊ฐ€ ์‹ ์ฒญ์„ ํ•œ ๊ฒฝ์šฐ์—๋Š” PARTICIPATION -> MATCH ์„ ํ†ตํ•ด ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ• ๋ฟ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ทธ๋Ÿผ ์•„์˜ˆ MATCH๋ฅผ ์—†์• ..? ๊ธฐ์—๋Š” MATCH ์—”ํ‹ฐํ‹ฐ ์ž์ฒด๊ฐ€ ๊ฐ–๋Š” ํ•„๋“œ๋“ค์ด ๋งŽ์•˜๊ธฐ์— ๊ทธ๋ƒฅ ๋”ฐ๋กœ ๋บ๋‹ค.

 


๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ ์ฐจ๋ก€๋กœ domain ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์˜€๋‹ค.

 

1. User.java

๋”๋ณด๊ธฐ
@Getter
@Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
@Table(name = "users")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="User_id",updatable = false)
    private Long userId;

    @Column(name="Name", nullable = false)
    private String name;

    @Column(name="Email")
    private String email;

    @Column(name="Sex")
    private char gender;

    @Column(name = "Age")
    private String age;

    @Column(name="Sex_visible")
    @ColumnDefault("1")
    private boolean genderVisible;

    @Column(name="Age_visible")
    @ColumnDefault("1")
    private boolean ageVisible;

    @Column(name = "winningRate")
    private float winningRate;

    @Column(name = "Late_rate")
    private float lateRate;

    @Builder
    public User(Long userId, String name, String email,
                char gender, String age, boolean genderVisible,
                boolean ageVisible, float winningRate, float lateRate) {
        this.userId = userId;
        this.name = name;
        this.email = email;
        this.gender = gender;
        this.age = age;
        this.genderVisible = genderVisible;
        this.ageVisible = ageVisible;
        this.winningRate = winningRate;
        this.lateRate = lateRate;
    }


}

2. Post.java

๋”๋ณด๊ธฐ
@Getter
@Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
@Table(name = "posts")
public class Post extends BaseEntity{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "Post_id", updatable = false)
    private Long postId;


    @ManyToOne
    @JoinColumn(name = "User_id")
    @CreatedBy
    private User user;

    @OneToOne
    @JoinColumn(name = "Tag_id")
    private Tag tag;

    @OneToOne
    @JoinColumn(name = "Match_id")
    private Match match;

    @Column(name = "Title", nullable = false)
    private String title;

    @Column(name = "Content", nullable = false)
    private String content;

    @Builder

    public Post(Long postId, User user, Tag tag, Match match, String title, String content) {
        this.postId = postId;
        this.user = user;
        this.tag = tag;
        this.match = match;
        this.title = title;
        this.content = content;
    }
}

3. Tag.java

๋”๋ณด๊ธฐ
@Getter
@Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
@Table(name = "tags")
public class Tag {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "Tag_id",updatable = false)
    private Long tagId;

    @ManyToOne
    @JoinColumn(name="Post_id")
    private Post post;

    @Column(name = "Sex")
    private String genderType;

    @Column(name = "Level")
    private String levelType;

    @Column(name = "Age")
    private String ageType;

    @Builder
    public Tag(Long tagId, Post post, String genderType, String levelType, String ageType) {
        this.tagId = tagId;
        this.post = post;
        this.genderType = genderType;
        this.levelType = levelType;
        this.ageType = ageType;
    }
}

4. Match.java

๋”๋ณด๊ธฐ
@Getter
@Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
@Table(name = "matches")
public class Match {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "Match_id",updatable = false)
    private Long matchId;

    @ManyToOne
    @JoinColumn(name = "Post_id")
    private Post post;

    @ManyToOne
    @JoinColumn(name = "User_id")
    private User user;

    @Column(name = "Category",nullable = false)
    private String category;

    @Column(name = "Current_head_cnt",nullable = false)
    private int currentHeadCnt;

    @Column(name = "Head_cnt",nullable = false)
    private int headCnt;

    @Column(name = "Place", nullable = false)
    private String place;

    @Column(name = "Match_date",nullable = false)
    private Timestamp matchDate;

    @Column(name = "Attendance_count",nullable = false)
    private int attendanceCnt;

    @Builder
    public Match(Long matchId, Post post, User user,
                 String category, int currentHeadCnt, int headCnt,
                 String place, Timestamp matchDate, int attendanceCnt) {
        this.matchId = matchId;
        this.post = post;
        this.user = user;
        this.category = category;
        this.currentHeadCnt = currentHeadCnt;
        this.headCnt = headCnt;
        this.place = place;
        this.matchDate = matchDate;
        this.attendanceCnt = attendanceCnt;
    }
}

5.Participation.java

๋”๋ณด๊ธฐ
@Getter
@Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
@Table(name = "participations")
public class Participation{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "Participation_id",updatable = false)
    private Long participationId;

    @ManyToOne
    @JoinColumn(name = "User_id")
    private User user;

    @ManyToOne
    @JoinColumn(name = "Match_id")
    private Match match;

    @Column(name = "Status", nullable = false)
    @ColumnDefault("wait")
    private String status;

    @Column(name = "Attendance", nullable = false)
    @ColumnDefault("0")
    private boolean attendance;

    @Column(name = "Iswin", nullable = false)
    @ColumnDefault("0")
    private boolean isWin;

    @Builder
    public Participation(Long participationId, User user, Match match,
                         String status, boolean attendance, boolean isWin){
        this.participationId = participationId;
        this.user = user;
        this.match = match;
        this.status = status;
        this.attendance = attendance;
        this.isWin = isWin;
    }
}

 

6.BaseEntity

โžก๏ธ ์ž๋™ ์ƒ์„ฑ/์ˆ˜์ • ๋‚ ์งœ๋ฅผ ์ƒ์†๋ฐ›๊ธฐ ์œ„ํ•ด ๋งŒ๋“  ํด๋ž˜์Šค

๋”๋ณด๊ธฐ
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseEntity {

    @Column(name = "Created_date", nullable = false)
    @CreatedDate
    @DateTimeFormat(pattern = "yyyy-MM-dd/HH:mm:ss")
    private Timestamp createdDate;

    @Column(name = "Modified_date", nullable = false)
    @LastModifiedDate
    private Timestamp modifiedDate;

}

๊ทผ๋ฐ ์‚ฌ์‹ค @ManytoOne, @ManytoMany ๋“ฑ์ด ์ •ํ™•ํžˆ ์–ด๋–ป๊ฒŒ ์ด์šฉ๋˜๋Š”์ง€ ์•„์ง ๋ชจ๋ฅด๊ณ  ์›๋ž˜ ๋””๋น„ ๊ด€๊ณ„์—์„œ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š”๋Œ€๋กœ ๋น„์Šทํ•˜๊ฒ ์ง€.. ํ•˜๊ณ  ์ ์šฉํ•ด๋†จ๋‹ค. ์•„๋งˆ ๋‹ค์‹œ ๊ณต๋ถ€ํ•ด์„œ ์žฌ์ ์šฉ์„ ํ•ด์•ผํ•  ๊ฒƒ ๊ฐ™๋‹ค.

 


์ด์ œ ์„œ๋น„์Šค ์—ญํ• ์ธ PostService.java ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  โ‘  ๋ชจ์ง‘๊ธ€ ์ƒ์„ธ ์กฐํšŒ โ‘ก ๋ชจ์ง‘๊ธ€ ์ „์ฒด ์กฐํšŒ๋ฅผ ๊ตฌํ˜„ํ•ด ๋ณธ๋‹ค.

    @GetMapping("/api/post/{id}")
    public ResponseEntity<PostResponse> findPostById(@PathVariable Long id) {
        Optional<Post> post = postService.findById(id);

        return ResponseEntity.ok()
                .body(new PostResponse(post,post.getTag(),post.getMatch(),post.getUser()));
    }
@GetMapping("/api/post/{id}")
    public ResponseEntity<PostResponse> findPostById(@PathVariable Long id) {
        Optional<Post> byId = postService.findById(id);
        Post post = byId.orElse(null);

        return ResponseEntity.ok()
                .body(new PostResponse(post,post.getTag(),post.getMatch(),post.getUser()));
    }

๋ชจ์ง‘๊ธ€ ๋ชฉ๋ก ์กฐํšŒ

 

๋ชจ์ง‘๊ธ€ ์ƒ์„ธ ์กฐํšŒ

 

 

๋ชจ๋‘ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•จ์„ ํ™•์ธํ–ˆ๋‹ค!

๊ทธ๋Ÿฐ๋ฐ ์ผ๋‹จ mockdata๋กœ ์ƒ์„ฑ,์ˆ˜์ • ๋‚ ์งœ๋ฅผ ์ž„์˜๋กœ ์ฃผ์ž…ํ–ˆ์œผ๋ฏ€๋กœ ์ถ”ํ›„์— ์ž๋™์ƒ์„ฑ์„ ํ™•์ธํ•ด์•ผํ•˜๊ณ ,

์ง€๊ธˆ ์ œ์ผ ๊ถ๊ธˆํ•œ๊ฑด post dto ์ƒ์„ฑ ์‹œ์— ๋“ฑ๋กํ•œ user์˜ ์ •๋ณด๋Š” id๋งŒ ๋„ฃ์–ด๋†“์œผ๋ฉด ๋˜๋Š”๊ฑด์ง€, ์•„๋‹ˆ๋ฉด user ๊ฐ์ฒด ์ž์ฒด๋ฅผ ๋„ฃ์–ด์•ผํ•˜๋Š”๊ฑด์ง€..

๊ทธ๋ฆฌ๊ณ  ์ „์ž๋Œ€๋กœ id๋งŒ ๋„ฃ์–ด๋†“์„ ๊ฒฝ์šฐ ๋‚˜์ค‘์— ํ•ด๋‹น post์™€ ์—ฐ๊ด€์ด ์žˆ๋Š” ๊ทธ์™ธ์˜ user ์ •๋ณด๋Š” ์–ด๋–ป๊ฒŒ ๋ถˆ๋Ÿฌ์˜ค๋Š”์ง€์ด๋‹ค.

๋ฐ˜์‘ํ˜•