project 1 은 엔티티 하나만을 이용했지만
project2는 여러개의(회원, 게시판, 댓글 세개의 엔티티를 만들 예정이다) 엔티티를 이용하고 묶어주고 화면에 뿌려줄것이다.
일대일(1:1), 일대다(1:N) , 다대일(N:1) 다대다(M:N)의 관계를 이용해서 데이터가 서로 간에 어떻게 구성되 있는지 표현한다.
pk, fk를 어떻게 설정하는지 주의한다.
테이블 간의 관계는 특정한pk가 다른곳에서 몇번fk로 사용 되었는지가 중요하다.
데이터 베이스 관계를 해석할때는 항상 pk쪽에서 해석한다.
pk를 기준을 잡고 만든다
-회원이 있어야 게시글이 있다.
-게시글이 있어야 댓글이 있다.
a는 pk / b는 fk 라 한다.(a가있어야 b가있다) ( 1:N관계)
fk를 기준으로 해석하면
-게시물은 회원과 다대일(N:1)관계이다
-댓글은 게시물과 다대일(N:1)관계이다.
객체지향보다는 관계형 데이터베이스 모댈링을 위주로 해서 구성하는것이 편리하다.
1.데이터베이스 구조를 보면 member쪽의 email(pk)을 board에서는 fk로 참조하는 구조이다.(1:N)
2.jpa에서는 관계고민시 fk쪽을 먼저 해석해 본다.
3.fk쪽을 먼저 해석해보면 N:1관계가 되므로 이는 곧 @ManytoOne를 의미한다.
@ManytoOne는 데이터베이스상에서 외래키의 관계로 연결된 엔티티클래스에 설정한다. Board 클래스는 작성자가 Member 엔티티를 의미한다.
※ Reposiotory도 각각 엔티티마다 하나씩 추가해준다.
위처럼 특정한 엔티티를 조회할떄 연관관계를 가진 모든 엔티티를 같이 로딩하는것을 Eager loading 일반적으로는 즉시로딩 이라 한다.
JPA에서는 연관관계의 데이터를 어떻게 가져올 것인가를 fetch 라 한다.
즉시로딩은 불필요한 조인까지 처리해야 한다. 그와 반대되는 개념인 lazyLoading가 잇다.
lazyLoading시에 (board.getWriter() FK를 불러/(PK 쪽)member 엔티티를 불러오는) 에서 문제가 발생한다. 이것은 member테이블을 로딩해야 하는데 이미 데이터베이스 연결이 끝난 상태이기 떄문이다. 이를 막기위해 @Transactional 처리를 해줘야 한다.
★ FK를 가져오면 PK 엔티티까지 가져온다(조인 o)(FK를 교집합으로)
★LazyLoading 을 사용하고 FK를 가져오면 PK엔티티 가져온다(따로따로)(조인X)(@Transactional 필요)
이 애노테이션은 해당 클래스의 모든 멤버변수를 출력한다. Board 객체의 @ToString() 을 하면 wirther 변수로 선언된 member 객체 역시 출력해야한다. Member을 출력 하기위해서는 member 객체의 toString()이 호출되어야 하고 이떄 데이터베이스 연길이 필요하게 된다.
이러한 문제로 @ToString()을 할떄는 exclude를 같이 써준다.exclude를는 해당 속성값으로 지정된 변수는 @ToString 에서 제외하기 떄문에 지연 로딩을 할때는 반드시 지정해 주는것이 좋다.
가장 좋은 방법은 지연로딩을 기본으로 사용하고 상황에 맞게 필요한 방법을 찾는다.