Study in Bootcamp/Pre-Project

[Pre-Project] Day 6 : 연관관계 매핑

Bhinney 2022. 10. 28. 00:53

프로젝트를 하는 과정에 있어서 기록하는 것이다.

잘못된 부분이나 수정이 필요한 부분은 꾸준히 수정할 예정이다.

오늘은 사실 매핑에 조금 헷갈리고 어려워서 설명하고, 이해하고 하는데 시간을 많이 쏟았다.


✅ 연관관계 패핑

  • 각 엔티티 테이블 간의 참조를 위해 매핑을 하였다.
  • 테이블과 테이블 사이의 관계성을 생각하는게 어려웠다.
    • User : Question = 1 : N
    • User : Answer = 1 : N
    • User : QuestionVote = 1 : N
    • User : AnswerVote = 1 : N
    • Question : Answer = 1 : N
    • Question : QuestionVote = 1 : 1
      • 1 : N 으로 보고 재 매핑하기로 했다.
      • 하나의 질문의 여러 추천이 되는데 참조가 필요한 부분이 있기 때문?
    • Answer : AnswerVote = 1 : 1 
      • 1 : N 으로 보고 재 매핑하기로 했다.
      • 하나의 질문의 여러 추천이 되는데 참조가 필요한 부분이 있기 때문?
  • 그리고 해당 매핑을 할 때 방식이 헷갈려서 정리해두었다.
  • 다대다는 가운데의 조인 테이블을 만들어 각각 일대다로 매핑한다!
/*
* 1 : N 혹은 N : 1 의 매핑의 경우
* 예시는 User : Question  = 1 : N
*/

@Entity(name = "USERS")
public class User {
	...
    @OneToMany(mappedBy = "users")
    private List<Question> questionList = new ArrayList<>();
    
    ...
    // 연관관계 편의 메서드
    public void addQuestion(Question question) {
    	questionList.add(question);
        
        if (question.getUser() != this) {
        	question.setUser(this);
            }
	}
}

public class Question {
	...
    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user;
    
    ...
    // 연관관계 편의 메서드
    public void setUser(User user) {
    	this.user = user;
    }
}

🚨 아래의 내용은 수정해서 현재 필요 없으나 일대일 매핑을 기억하기 위해 삭제하지 않으려고 한다.

/*
* 1 : 1의 경우
* 예시는 Question : QuestionVote = 1 : 1
*/

public class Question {
	...
    @OneToOne(mappedBy = "question", cascade = {CascadeType.PERSIST, CascadeType.REMOVE})
    private QuestionVote questionVote;
    
    ...
    // 연관관계 편의 메서드
    public void setQuestionVote(QusetionVote questionVote) {
    	this.questionVote = questionVote;
        
        if (questionVote.getQuestion() != this) {
        	questionVote.setQuestion(this);
        }
    }
}

public class QuestionVote {
	...
    @OneToOne
    @JoinColumn(name = "question_id")
    private Question question;
    
    ...
    // 연관관계 편의 메서드
    public void setQuestion(Question question) {
    	this.question = question;
        
        if (question.getQuestionVote() != this) {
        	question.setQuestionVote(this);
        }
    }
}

🔥 해야할 것

: 끝나면 취소선으로 표시

1️⃣ User CRUD 구현

  • UserController 구현
  • UserService 구현
  • UserDTO 구현
  • UserRepository 구현
  • UserMapper 구현

2️⃣ Spring Security 공부 및 로그인 로그아웃 기능

  • 인증 된 사용자가 질문을 올리는 방법
  • OAuth2 여러 개 사용하는 방법
  • 로그인 기능 구현 공부
  • 로그인 로그아웃 기능 구현 -> 주말까지 이용해서 해내볼 것!