2023.07.10.월.TIL

heeh·2023년 7월 10일

TIL

목록 보기
39/82
post-thumbnail

2023.07.10

페어프로그래밍

알고리즘

Spring 숙련

  • 2-11
  • User는 여러개의 Food를 주문 할 수 있다
    @OneToMany(mappedBy = "user")
    // One : User, Many : 상대
    // mppedBy : 외래키 주인 정하기
    
    private List<Food> foodList = new ArrayList<>();
    • 데이터베이스 테이블에 직접적으로 저장되는 것이 아님
    • N : 1 → Java Collection을 표시
    • 객체에서 관계를 표시하기 위한 하나의 방법
  • 애노테이선을 달고 상대 Entity Type을 필드로 가져와야 관계 맺어짐
    • Food(N) : User(1) 양방향
    • User
      @OneToMany(mappedBy = "user")
          private List<Food> foodList = new ArrayList<>();
    • Food
      @ManyToOne
          @JoinColumn(name = "user_id")
          private User user;
  • Entity Type의 List를 만들고 영속성(Persist)하고 싶은 비영속상태의 Entity 클래스 객체들을 만든 다음 add로 List에 넣어줌
    List<User> userList = new ArrayList<>();
            User user1 = new User();
            user1.setName("Robbie");
            userList.add(user1);
    
            User user2 = new User();
            user2.setName("Robbert");
            userList.add(user2);
            userRepository.saveAll(userList);
    • saveAll로 한 번에 여러개를 저장 할 수 있음!
  • @ManyToOne(fetch = FetchType.*LAZY*) : 지연 로딩
    → default를 덮어씌움
  • 지연 로딩도 영속성 컨텍스트의 기능 중 하나!
  • 지연 로딩이 된 Entity의 정보를 조회하려고 할 때 반드시 영속성 컨텍스트가 존재해야 함
    • Spring Container 환경에서는 트랜잭션이 적용되어 있어야 한다라는 의미
  • 조회 할 때 트랜잭션 필수 X
  • 지연 로딩 된 정보(Entity) 조회 할 때 트랜잭션(영속성 컨텍스트) 필수!
  • JPA : 간단한 방법으로 영속성 전이에 persist 옵션 제공
    • Cascade의 persist

      • SQL, Delete 연관된 데이터 삭제할 수 없어서 오류
        → Foreign Key를 Drop하고 새로 Alter 하면서 Foreign Key 설정할 때 뒤에 on delete Cascade 옵션을 추가한 다음 delete를 하니까 연관된 데이터 삭제 성공
    • on delete Cascade (영속성 전이) 같은 기능을 수행할 수 있도록 JPA가 기능 제공

      @OneToMany(mappedBy = "user", cascade = CascadeType.PERSIST)
  • 영속성 전이?
    • 영속 상태의 Entity에서 수행되는 작업들이 연관된 Entity까지 전파되는 상황
  • 탈퇴
    • Cascade.REMOVE
    • 중복으로 넣을 때는 중괄호!
      @OneToMany(mappedBy = "user", cascade = {CascadeType.PERSIST, CascadeType.REMOVE})
  • orphanRemoval
    @OneToMany(mappedBy = "user", cascade = CascadeType.PERSIST, orphanRemoval = true)
    • false가 default
    • Cascade.REMOVE 옵션과 마찬가지로 해당 Entity 객체를 삭제하면 연관된 Entity가 자동 삭제됨
      • REMOVE 추가 기능
      • Entity를 제거 했을 때 delete 해주는 기능뿐만 아니라 Cascade.REMOVE의 기능도 가능!
    • 주의할 점
      • orphanRemoval, Cascade.REMOVE 사용할 때 삭제하려고 하는 연관된 Entity를 다른 곳에서도 참조하고 있는지 꼭 확인!
        → A, B에서 참조되고 있던 C를 B를 삭제하면서 같이 삭제되면 A는 참조하고 있던 C가 사라졌기 때문에 문제가 발생할 수 있음
      • orphanRemoval : @ManyToOne에서 사용 불가
        → 해당 객체를 참조하고 있는 다른 객체들이 있을 수 있기 때문에 orphanRemoval를 속성으로 가지고 있지 않음
profile
공부하자개발하자으쌰으쌰

0개의 댓글