본문 바로가기
Study in Bootcamp/Pre-Project

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

by Bhinney 2022. 10. 28.

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

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

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


✅ 연관관계 패핑

  • 각 엔티티 테이블 간의 참조를 위해 매핑을 하였다.
  • 테이블과 테이블 사이의 관계성을 생각하는게 어려웠다.
    • 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 여러 개 사용하는 방법
  • 로그인 기능 구현 공부
  • 로그인 로그아웃 기능 구현 -> 주말까지 이용해서 해내볼 것!

댓글