내일배움캠프 Spring 26일차 TIL

Skadi·2024년 1월 29일
0

스프링 숙련

1. 1 대 1 관계

  • @OneToOne 애너테이션은 1 대 1 관계를 맺어주는 역할을 합니다.

  • 단방향 관계
    - 외래 키의 주인 정하기

    • Entity에서 외래 키의 주인은 일반적으로 N(다)의 관계인 Entity 이지만 1 대 1 관계에서는 외래 키의 주인을 직접 지정해야합니다.

    • 외래 키 주인만이 외래 키 를 등록, 수정, 삭제할 수 있으며, 주인이 아닌 쪽은 오직 외래 키를 읽기만 가능합니다.

    • 음식 Entity가 외래키의 주인인 경우

      • 음식
      • @Entity
        @Table(name = "food")
        public class Food {
          @Id
          @GeneratedValue(strategy = GenerationType.IDENTITY)
          private Long id;
          private String name;
          private double price;
          @OneToOne
          @JoinColumn(name = "user_id")
          private User user;

      - 고객

      • @Entity
        @Table(name = "users")
        public class User {
          @Id
          @GeneratedValue(strategy = GenerationType.IDENTITY)
          private Long id;
          private String name;
        }
    • 고객 Entity가 외래키의 주인인 경우

      • 음식
      • @Entity
        @Table(name = "food")
        public class Food {
          @Id
          @GeneratedValue(strategy = GenerationType.IDENTITY)
          private Long id;
          private String name;
          private double price;

      - 고객

      • @Entity
        @Table(name = "users")
        public class User {
          @Id
          @GeneratedValue(strategy = GenerationType.IDENTITY)
          private Long id;
          private String name;
          @OneToOne
          @JoinColumn(name = "food_id")
          private Food food;
        }
  • 양방향 관계
    - 양방향 관계에서 외래 키의 주인을 지정해 줄 때 mappedBy 옵션을 사용합니다.

    • mappedBy의 속성값은 외래 키의 주인인 상대 Entity의 필드명을 의미합니다.
  • 관계 설정 방법
    - 단방향이라면 외래 키의 주인만 상대 Entity 타입의 필드를 가지면서 @JoinColumn()을 활용하여 외래 키의 속성을 설정해주면됩니다.
    - 양방향이라면 외래 키의 주인은 상대 Entity 타입의 필드를 가지면서 @JoinColumn()을 활용하여 외래 키의 속성을 설정을 해줍니다.
    - 그리고 상대 Entity는 외래 키의 주인 Entity 타입의 필드를 가지면서 mappedBy 옵션을 사용하여 속성 값으로 외래키의 주인 Entity에 선언된 @JoinColumn()으로 설정되고 있는 필드명을 넣어주면 됩니다.

  • 음식 Entity가 외래 키의 주인인 경우!
    - 음식

     @Entity
     @Table(name = "food")
     public class Food {
       @Id
       @GeneratedValue(strategy = GenerationType.IDENTITY)
       private Long id;
       private String name;
       private double price;
       @OneToOne(mappedBy = "food")
       private User user;
     }

    - 고객

    @Entity
    @Table(name = "users")
    public class User {
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Long id;
     private String name;
     @OneToOne
     @JoinColumn(name = "food_id")
     private Food food;
    }
    

2. N : 1 관계

  • @ManyToOne : N 대 1 관계를 맺어주는 역할

  • 단방향 관계
    /- 음식

    ```java
       @Entity
       @Table(name = "food")
       public class Food {
         @Id
         @GeneratedValue(strategy = GenerationType.IDENTITY)
         private Long id;
         private String name;
         private double price;
         @ManyToOne
         @JoinColumn(name = "user_id")
         private User user;
       }
    
    ```

    /- 고객

    @Entity
    @Table(name = "users")
    public class User {
      @Id
      @GeneratedValue(strategy = GenerationType.IDENTITY)
      private Long id;
      private String name;
    }
  • 양방향 관계
    - 음식 Entity가 N의 관계로 외래 키의 주인
    /- 음식

        @Entity
        @Table(name = "food")
        public class Food {
          @Id
          @GeneratedValue(strategy = GenerationType.IDENTITY)
          private Long id;
          private String name;
          private double price;
          @ManyToOne
          @JoinColumn(name = "user_id")
          private User user;
        }

    /- 고객

    @Entity
     @Table(name = "users")
     public class User {
       @Id
       @GeneratedValue(strategy = GenerationType.IDENTITY)
       private Long id;
       private String name;
       @OneToMany(mappedBy = "user")
       private List<Food> foodList = new ArrayList<>();
     }

3. 1 : N 관계

  • @OneToMany : 1 대 N 관계를 맺어주는 역할

  • 단방향 관계
    - 1 : N에서 N 관계의 테이블이 외래 키를 가질 수 있기 때문에 외래 키는 N 관계인 users 테이블에 외래 키 컬럼을 만들어 추가하지만 외래 키의 주인인 음식 Entity를 통해 관리합니다.
    /- 음식

        @Entity
        @Table(name = "food")
        public class Food {
          @Id
          @GeneratedValue(strategy = GenerationType.IDENTITY)
          private Long id;
          private String name;
          private double price;
          @OneToMany
          @JoinColumn(name = "food_id") // users 테이블에 food_id 컬럼
          private List<User> userList = new ArrayList<>();
        }
    

    /- 고객

    @Entity
    @Table(name = "users")
    public class User {
      @Id
      @GeneratedValue(strategy = GenerationType.IDENTITY)
      private Long id;
      private String name;
    }
  • 양방향 관계
    - 1 대 N 관계에서는 일반적으로 양방향 관계가 존재하지 않습니다.
    - 1 대 N 관계에서 양방향 관계를 맺으려면 음식 Entity를 외래 키의 주인으로 정해주기 위해 고객 Entity에서 mappedBy 옵션을 사용해야 하지만 @ManyToOne 애너테이션은 mappedBy 속성을 제공하지 않습니다.

    @Entity
    @Table(name = "users")
    public class User {
      @Id
      @GeneratedValue(strategy = GenerationType.IDENTITY)
      private Long id;
      private String name;
      Spring Master - 4주차 47
      @ManyToOne
      @JoinColumn(name = "food_id", insertable = false, updatable = false)
      private Food food;
    }
    

4. N : M 관계

  • @ManyToMany : N 대 M 관계를 맺어주는 역할

  • 단방향 관계
    - N : M 관계를 풀어내기 위해 중간 테이블(orders)을 생성하여 사용합니다.
    /- 음식

        @Entity
        @Table(name = "food")
        public class Food {
          @Id
          @GeneratedValue(strategy = GenerationType.IDENTITY)
          private Long id;
          private String name;
          private double price;
          @ManyToMany
          @JoinTable(name = "orders", // 중간 테이블 생성
          joinColumns = @JoinColumn(name = "food_id"), // 현재 위치인 Food Entity 에서 중간 테이블로 조인할 컬럼 설정
          inverseJoinColumns = @JoinColumn(name = "user_id")) // 반대 위치인 User Entity 에서 중간 테이블로 조인할 컬럼 설정
          private List<User> userList = new ArrayList<>();
        }
    

    /- 고객

    @Entity
    @Table(name = "users")
    public class User {
      @Id
      @GeneratedValue(strategy = GenerationType.IDENTITY)
      private Long id;
      private String name;
    }
  • 양방향 관계
    /- 음식

      @Entity
      @Table(name = "food")
      public class Food {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
        private String name;
        private double price;
        @ManyToMany
        @JoinTable(name = "orders", // 중간 테이블 생성
        joinColumns = @JoinColumn(name = "food_id"), // 현재 위치인 Food Entity 에서 중간 테이블로 조인할 컬럼 설정
        inverseJoinColumns = @JoinColumn(name = "user_id")) // 반대 위치인 User Entity 에서 중간 테이블로 조인할 컬럼 설정
        private List<User> userList = new ArrayList<>();
    }

    /- 고객

    @Entity
    @Table(name = "users")
    public class User {
      @Id
      @GeneratedValue(strategy = GenerationType.IDENTITY)
      private Long id;
      private String name;
      @ManyToMany(mappedBy = "userList")
      private List<Food> foodList = new ArrayList<>();
    }

0개의 댓글