Project2 ( project1확장)

Shaun·2021년 8월 10일
0

project

목록 보기
7/9

project 1 은 엔티티 하나만을 이용했지만

project2는 여러개의(회원, 게시판, 댓글 세개의 엔티티를 만들 예정이다) 엔티티를 이용하고 묶어주고 화면에 뿌려줄것이다.

관계형 데이터베이스 설계

  • 일대일(1:1), 일대다(1:N) , 다대일(N:1) 다대다(M:N)의 관계를 이용해서 데이터가 서로 간에 어떻게 구성되 있는지 표현한다.

  • pk, fk를 어떻게 설정하는지 주의한다.

  • 테이블 간의 관계는 특정한pk가 다른곳에서 몇번fk로 사용 되었는지가 중요하다.

  • 데이터 베이스 관계를 해석할때는 항상 pk쪽에서 해석한다.

pk로 설계,fk로 연관관계 해석

  • pk를 기준을 잡고 만든다
    -회원이 있어야 게시글이 있다.
    -게시글이 있어야 댓글이 있다.

  • a는 pk / b는 fk 라 한다.(a가있어야 b가있다) ( 1:N관계)

  • fk를 기준으로 해석하면
    -게시물회원과 다대일(N:1)관계이다
    -댓글게시물과 다대일(N:1)관계이다.

객체지향보다는 관계형 데이터베이스 모댈링을 위주로 해서 구성하는것이 편리하다.

@ManytoOne


1.데이터베이스 구조를 보면 member쪽의 email(pk)을 board에서는 fk로 참조하는 구조이다.(1:N)

2.jpa에서는 관계고민시 fk쪽을 먼저 해석해 본다.

3.fk쪽을 먼저 해석해보면 N:1관계가 되므로 이는 곧 @ManytoOne를 의미한다.
@ManytoOne는 데이터베이스상에서 외래키의 관계로 연결된 엔티티클래스에 설정한다. Board 클래스는 작성자가 Member 엔티티를 의미한다.

※ Reposiotory도 각각 엔티티마다 하나씩 추가해준다.

ManyToOne과 Eager/Lazy loading

  • 엔티티 클래스들이 데이터베이스상에서는 두개 혹은 두개 이상의 테이블로 생성되기때문에 연관관계를 맺고 있다는 것은 데이터베이스 입장으로 보면 조인이 필요하다.
  • 실제로 @ManyToOne의 경우 FK쪽의 엔티티를 가져올때 PK쪽의 엔티티도 같이 가져온다. (=실제로 Left outer join 처리가 된다)

fetch는 Lazyloading을 권장

  • 위처럼 특정한 엔티티를 조회할떄 연관관계를 가진 모든 엔티티를 같이 로딩하는것을 Eager loading 일반적으로는 즉시로딩 이라 한다.

  • JPA에서는 연관관계의 데이터를 어떻게 가져올 것인가를 fetch 라 한다.

  • 즉시로딩은 불필요한 조인까지 처리해야 한다. 그와 반대되는 개념인 lazyLoading가 잇다.

  • lazyLoading시에 (board.getWriter() FK를 불러/(PK 쪽)member 엔티티를 불러오는) 에서 문제가 발생한다. 이것은 member테이블을 로딩해야 하는데 이미 데이터베이스 연결이 끝난 상태이기 떄문이다. 이를 막기위해 @Transactional 처리를 해줘야 한다.

★ FK를 가져오면 PK 엔티티까지 가져온다(조인 o)(FK를 교집합으로)

★LazyLoading 을 사용하고 FK를 가져오면 PK엔티티 가져온다(따로따로)(조인X)(@Transactional 필요)

@ToString()

이 애노테이션은 해당 클래스의 모든 멤버변수를 출력한다. Board 객체의 @ToString() 을 하면 wirther 변수로 선언된 member 객체 역시 출력해야한다. Member을 출력 하기위해서는 member 객체의 toString()이 호출되어야 하고 이떄 데이터베이스 연길이 필요하게 된다.

이러한 문제로 @ToString()을 할떄는 exclude를 같이 써준다.exclude를는 해당 속성값으로 지정된 변수는 @ToString 에서 제외하기 떄문에 지연 로딩을 할때는 반드시 지정해 주는것이 좋다.

가장 좋은 방법은 지연로딩을 기본으로 사용하고 상황에 맞게 필요한 방법을 찾는다.

profile
호주쉐프에서 개발자까지..

0개의 댓글

관련 채용 정보