상세 컨텐츠

본문 제목

11/22

카테고리 없음

by 화2팅 2023. 11. 22. 23:27

본문

이번주는 너무 피곤하다... 

 

팀과제진행중에 JPA로 N:M 연관관계 코드 처음짜본거랑 알고리즘 문제 하나 오래걸렸던거를 기록용으로 올리려고한다.

 

 

 

1. 중간테이블을 이용한 N:M  Entity 연관관계 설정

다음 그림과 같이 

 

리뷰와 해시태그는 N:M으로 매핑돼있을때 이 둘을 N:M으로 매핑하는 방법에 대해서 기록해보겠다.

 

Review Entity

@Getter
@Entity
@Table(name = "review")
@NoArgsConstructor(access = AccessLevel.PROTECTED)

public class Review extends BaseEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long Id;

    @Column(nullable = false)
    @Length(max = 50)
    private String title;

    @Column(nullable = false)
    @Length(max = 1000)
    private String content;

    @Column(nullable = false)
    private Float ratingScore;

    @Column(nullable = false)
    @Length(max = 100)
    private String movieName;

    @OneToMany(mappedBy = "review")
    private List<ReviewHashtag> reviewHashtagList = new ArrayList<>();

    @Builder
    public Review(String title, String content, Float ratingScore, String movieName) {
        this.title = title;
        this.content = content;
        this.ratingScore = ratingScore;
        this.movieName = movieName;
    }

    public void update(String title, String content, Float ratingScore) {
        this.title = title;
        this.content = content;
        this.ratingScore = ratingScore;
    }

    public void addReviewHashtag(ReviewHashtag reviewHashtag) {
        this.reviewHashtagList.add(reviewHashtag);
        reviewHashtag.setReview(this);
    }
}

 

 

Hashtag Entity

 

@Getter
@Entity
@Table(name="hashtag")
@NoArgsConstructor(access = AccessLevel.PROTECTED)

public class Hashtag {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)

    private Long id;

    @Column(nullable = false, length = 15)
    private String name;

    @OneToMany(mappedBy = "hashtag")
    private List<ReviewHashtag> reviewHashtagList = new ArrayList<>();

    public Hashtag (String name) {
        this.name = name;
    }

    public void addReviewHashtag(ReviewHashtag reviewHashtag) {
        this.reviewHashtagList.add(reviewHashtag);
        reviewHashtag.setHashtag(this);
    }

}

 

중간 테이블로 사용될 ReviewHashtag Entity

 

package sparta.ifour.movietalk.domain.reviews.entity;


import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Table(name = "review_hashtag")

public class ReviewHashtag {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "review_id", nullable = false)
    private Review review;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "hashtag_id", nullable = false)
    private Hashtag hashtag;

    public ReviewHashtag(Review review, Hashtag hashtag) {
        this.review = review;
        this.hashtag = hashtag;
    }

    public void setReview(Review review) {
        this.review = review;
    }

    public void setHashtag(Hashtag hashtag) {
        this.hashtag = hashtag;
    }
}

 

 

2. 달리기 경주 풀이

import java.util.HashMap;
        import java.util.Map;

class Solution {
    public String[] solution(String[] players, String[] callings) {

        String[] answer = new String[players.length];


        Map<String, Integer> map = new HashMap<>();

        for (int i = 0; i < players.length; i++) {
            map.put(players[i], i);
        }

        for (String s : callings) {
            Integer rank = map.get(s);

            if (rank == 0) {
                continue;
            }
            map.put(s, rank - 1);

            String before = players[rank - 1];

            players[rank] = before;
            players[rank-1] = s;

            map.put(before, rank);

        }



        return players;
    }

}

 

이 문제의 가장 중요한 요소는 순서기록용으로 HashMap 타입을 사용하는것이다. 

 

그리고 또 하나 풀때 가장 생각이 막혀있던 부분은 players배열의 순서를 바꿔줘야하는 부분이다. 

 

처음엔 HashMap에 순서를 기록만해놨다가 players배열의 순서를 안바꿔놔서 꽤 시간이 많이 걸렸다.