hayu's 개발 일지

[TIL]240320 엔티티(Entity) 연관관계 매핑(1) 본문

프레임워크/spring

[TIL]240320 엔티티(Entity) 연관관계 매핑(1)

hayu00 2024. 3. 20. 21:40

엔티티(Entity) 란?

  • 데이터 베이스(DB)의 테이블을 나타내는 클래스이다. 이 클래스는 JPA(Java Persistence API)를 사용하여 데이터 베이스에 저장되고 관리된다.

엔티티(Entity) 연관관계

  • 관계형 데이터 베이스는 테이블 간 Foreign Key(외래키)로 연관관계를 맺고 JOIN을 통해 테이블을 조회한다.

연관관계에서는 생각해야할 부분이 몇 가지 존재한다.

  • 방향: 단방향, 양방향이 있다. 한쪽만 참조하면 단방향, 서로 참조하면 양방향이라고 한다.
  • 다중성: 일대일, 일대다, 다대일, 다대다
  • 연관관계의 주인: 양방향으로 연관관계를 만들려면 연관관계의 주인을 정해야 한다.

앙방향 연관관계의 규칙

  • 연관 관계를 갖는 두 객체 중 하나를 연관 관계의 주인으로 지정한다.
  • 연관 관계의 주인만 외래키를 관리한다.(삽입, 수정, 삭제)
  • 주인이 아닌 쪽은 읽기만 가능하다.
  • 주인은 mappedBy 속성을 사용하지 않는다.
  • 주인이 아닌 쪽은 mappedBy 속성을 사용하여 주인을 지정한다.

일대일(1:1) 단방향 연관관계

  • 일대일 관계는 양쪽이 서로 하나의 관계만 가지는 관계이다.
  • 일대일 관계에서는 외래키가 어디에 있든 상관없다.

연관관계 주인을 Member로 한 1:1 단방향 관계 코드

 @Entity
    public class Shop {
        @Id
        @GeneratedValue
        private Long id;
        private String name;
    }

    @Entity
    public class Member {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
        private String memberName;

        @OneToOne
        @JoinColumn(name = "SHOP_ID")
        private Shop shop;
    }

@GeneratedValue(strategy = GenerationType.IDENTITY)

  • 데이터 베이스애 새로운 레코드를 추가할 때 자동으로 기본키가 생성되며 이 기본 키는 데이터 베이스에서 관리한다. 즉, JPA가 엔티티의 기본키를 데이터 베이스에서 생성 및 관리하도록 지정한다.→ id값을 null로 하면 DB가 알아서 Auto_Increment

@joinColumn

  • 외래키를 정의하는 에너테이션이다.(외래키를 매핑한다.)
  • 해당 이름을 가지는 FK(외래키) 컬럼이 생성된다.

연관관계 주인을 Shop으로 한 1:1 단방향 관계 코드

 @Entity
    public class Member {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
        private String memberName;
    }

    @Entity
    public class Shop {
        @Id
        @GeneratedValue
        private Long id;
        private String name;

        @OneToOne
        @JoinColumn(name = "MEMBER_ID")
        private Member member;
    }

일대일(1:1) 양방향 관계

  • 일대일 양방향 관계도 다대일 양방향 관계와 비슷하다.

shop을 연관관계 주인으로 한 코드 / member를 연관관계 주인으로 할 때는 mappedBy, @joinColumn 의 위치를 바꿔주면 된다.

@Entity
    public class Member {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
        private String memberName;

        @OneToOne(mappedBy = "member")
        private Shop shop;
    }

    @Entity
    public class Shop {
        @Id
        @GeneratedValue
        private Long id;
        private String name;

        @OneToOne
        @JoinColumn(name = "MEMBER_ID")
        private Member member;
    }

다대일(N:1) 단방향 관계

  • 다대일 단방향 관계 매핑이다.

member 테이블이 주인이다. member객체를 찾아서 member가 속한 team까지 연관관계로 인해 데이터를 가져온다. team 엔티티에서는 member를 참조할 수 없다.

    @Entity
    public class Member {
        @Id
        @GeneratedValue
        private Long id;
        private String memberName;
        @ManyToOne
        @JoinColumn(name="TEAM_ID")
        private Team team;
    }

    @Entity
    public class Team {
        @Id
        @GeneratedValue
        private Long id;
        private String teamName;
    }

@ManyToOne: N:1 관계를 표현하는 에너테이션이다. @ManyToOne 이 붙은 엔티티가 N이고 반대 엔티티가 1일 때 붙인다.

@JoinColumn: 외래키를 정의하는 에너테이션이다.

다대일(N:1) 양방향 관계

  • 양방향은 엄연히 말하자면 서로 다른 단방향 관계가 2개가 되는 것이다.

member가 연관관계의 주인이다.

    @Entity
    public class Team {
        @Id
        @GeneratedValue
        private Long id;
        private String teamName;
        @OneToMany(mappedBy = "team") //양방향 매핑일 때 사용
        private List<Member> members = new ArrayList<>();
    }

    @Entity
    public class Member {
        @Id
        @GeneratedValue
        private Long id;
        private String memberName;
        @ManyToOne
        @JoinColumn(name="TEAM_ID")//name에는 반대쪽 매핑의 필드 이름값을 넣는다.
        private Team team;
    }

mappedBy: 양방향 매핑일 때 사용한다. mappedBy가 없는 엔티티가 연관관계의 주인이다.

연관관계 주인 방향에서 데이터를 입력하면 연관관계 주인이 아닌 team에 member 데이터를 넣지 않아도 데이터 베이스에 정상적으로 들어간다. 연관관계 주인이 아닌 곳에만 데이터를 넣었을 때는 데이터가 정상적으로 들어가지 않는다.

 

참고 자료

https://cjw-awdsd.tistory.com/47

- https://velog.io/@daydream/Spring-JPA-Entity-%EC%97%B0%EA%B4%80-%EA%B4%80%EA%B3%84-%EB%A7%A4%ED%95%91

- https://colabear754.tistory.com/142

- https://velog.io/@zenon8485/2.-%EC%97%94%ED%8B%B0%ED%8B%B0-%EB%A7%A4%ED%95%91-%EC%97%B0%EA%B4%80%EA%B4%80%EA%B3%84-%EB%A7%A4%ED%95%91

 

'프레임워크 > spring' 카테고리의 다른 글

[TIL]240326 Dto의 toEntity  (0) 2024.03.26
[TIL]240321 엔티티(Entity) 연관관계 매핑(2)  (0) 2024.03.21
[TIL]240319 Entity & DTO  (0) 2024.03.19
[TIL]240316 트러블 슈팅: 아이디 값 null  (0) 2024.03.16
[TIL]240314 Swagger  (1) 2024.03.14