[Spring boot] Annotation 정리2(Entity 관계)

박준환·2022년 4월 3일
0

Web_Project(grow_site)

목록 보기
7/10

Annotation

  • @Entity

    • @Entity가 붙은 클래스는 JPA가 관리하는 클래스로, 해당 클래스를 엔티티라고 한다.

    • JPA를 사용해서 테이블과 매핑할 클래스는 반드시 @Entity 를 붙여야 한다.

    • 예를들어 member 클래스에 @Entity가 붙으면 member라는 테이블에 매핑이 되는것임.

  • @Id

    • primary key에 매핑되도록 하는 어노테이션
  • @GeneratedValue

    • strategy = GenerationType.IDENTITY 옵션은 기본키 생성을 데이터베이스에게 위임하는 방식으로 id값을 따로 할당하지 않아도 데이터베이스가 자동으로 AUTO_INCREMENT를 하여 기본키를 생성해준다.
  • @JoinColumn

    • foreign key를 매핑할 때 사용하는 어노테이션
  • @Enumerated(EnumType.STRING)

    • Enum 클래스에 선언된 상수의 이름을 String 클래스 타입으로 변환하여 DB에 넣어줌

Entity에서 자주 나오는 옵션및 용어 정리

  • JPA

    • ORM : Object-relational mapping (객체 관계 매핑)으로 객체는 객체대로 설계하고, 관계형 데이터베이스는 관계형 데이터베이스대로 설계한다. => 객체지향 프로그래밍언어에 관계형 데이터베이스에 매핑해주는거
    • 현재 자바 진영의 ORM 기술 표준으로, 인터페이스의 모음이다
    • 개발자가 JPA를 사용하면, JPA 내부에서 JDBC API를 사용하여 SQL을 호출하여 DB와 통신한다.
    • ORM을 위해 자바에서 만든 API
  • Fetch Type

    • JPA 가 하나의 Entity 를 조회할 때, 연관관계에 있는 객체들을 어떻게 가져올 것이냐를 나타내는 설정값

    • fetch = FetchType.LAZY

      • 연관 관계에 있는 Entity를 가져오지 않고, getter 로 접근할 때 가져온다.
      • 지연로딩이라고 하며 엔티티 내에 연관관계를 참조할때 해당 연관관계에 해당하는 것이 사용되는 시점에만 연관된 엔티티(member)의 데이터를 조회하는거임, 실무에서는 주로 지연로딩만 사용함
    • fetch = FetchType.Eager

      • 연관 관계에 있는 Entity 들 모두 가져오는 옵션.
  • Cascade

    • Entity의 상태 변화를 전파시키는 옵션이다.
    • Parent - child 관계에 있는 도메인에 적용할 수 있다.
    • cascade = CascadeType.REMOVE
      • 부모 엔티티가 삭제되면 자식 엔티티도 삭제되도록 하는 옵션.
  • Mapped by
    • 연결할 테이블명을 설정할 때 사용

구현한 게시판에서의 Entity 관계

Member

  • 연관된 Entity
    • Article
      • 각 회원은 게시물을 작성했을수도 있고 작성하지 않을 수도 있다. 즉 각 회원은 0개 이상의 게시물을 갖음.
      • member 입장에선 여러개의 article을 갖으므로 @OneToMany사용, 이 때 Article을 member와 연결시켜주고 member가 사라지면 member와 연결된 article도 사려져야 하므로 cascade = CascadeType.REMOVE 옵션을 줌.

Article

  • 연관된 Entity
    • Member
      • 게시물 여러개가 회원 하나에 매핑되므로 @ManyToOne을 사용함. 이때 게시물이 하나 사라져도 이에 연결된 member는 사라질 필요가 없으므로 cascade = CascadeType.REMOVE 옵션을 주지 않음.
      • Article 테이블에 @JoinColumn을 이용해 member를 연결해 member의 id를 column으로 넣어줌

    • Board
      • 여러개의 게시물은 하나의 게시판에 매핑되므로 @ManyToOne을 사용함. 이때 게시물이 사라져도 연결된 borad는 사라질 필요가 없으므로 cascade = CascadeType.REMOVE 옵션을 주지 않음.
      • Article 테이블에 @JoinColumn을 이용해 board를 연결해 board의 id를column으로 넣어줌

    • File
      • 게시물 하나에는 여러개의 파일을 업로드할 수 있으므로 @OneToMany를 사용, 이때 게시물 하나가 사라지면 이에 매핑된 0개 이상의 파일도 사라져야 하므로 cascade = CascadeType.REMOVE 옵션을 줌.

Board

  • 연관된 Entity
    • Member
      • 하나의 게시판을 생성한 사람은 관리자(회원) 1명 이므로 @OneToOne을 사용함.
      • 이때 게시판이 사라져도 연결된 member는 사라질 필요가 없으므로 cascade = CascadeType.REMOVE 옵션을 주지 않음.
      • Board 테이블에 @JoinColumn을 이용해 member를 연결해 member의 id를 column으로 넣어줌
      • board 입장에서는 member와 @OneToOne을 사용하였는데 member에서 board에 대해 @OneToOne을 사용하지 않은 이유는 board에 대한 정보를 조회할 때 이 board를 만든 사람의 id가 필요하지만 member에 대한 정보를 조회할 때에는 이 member가 어떤 게시판을 만들었는 지에 대한 정보는 필요가 없기 때문임.

    • Article
      • 게시판 하나에 0개 이상의 게시물들이 연결되어 있으므로 @OneToMany사용
      • 이때 게시판이 사라지면 해당 게시판의 게시물들도 사라져야 하므로 cascade = CascadeType.REMOVE 옵션을 사용함

File

  • 연관된 Entity
    • Article
      • 여러개의 파일을 게시물에 업로드 할 수 있으므로 @ManyToOne을 사용함
      • 어떤 게시물에 파일이 업로드 되어 있는지 알 수 있게 @JoinColumn을 통해 article_id를 File 테이블에 column으로 넣어줌

0개의 댓글