⭐️ JPA 매핑 전략

1️⃣ 일대일(@OneToOne)

  1. 단방향: 한 쪽 엔티티에서만 다른 엔티티를 참조하는 관계. @JoinColumn을 사용하여 외래 키를 관리하는 엔티티에서만 연관 관계를 설정한다.

  2. 양방향: 양쪽 엔티티 모두 서로를 참조하는 관계. 한 쪽은 @JoinColumn으로 외래 키를 관리하고, 반대쪽은 mappedBy 속성을 사용하여 연관 관계의 주인이 아님을 명시 → 자주 접근하는 테이블을 주 테이블로 설정할 것 ❗️

    → 해결책: DTO(Data Transfer Object) 변환 후 JSON 직렬화, Lombok의 @ToString.Exclude 사용

2️⃣ 일대다(@OneToMany) - 단방향

3️⃣ 양방향 (OneToMany - ManyToOne 양방향)

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

    @OneToMany(mappedBy = "team")  // (1) 연관관계의 주인이 아님 (읽기 전용)
    private List<Member> members = new ArrayList<>();
}

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

    @ManyToOne
    @JoinColumn(name = "team_id")  // (2) 외래 키를 직접 관리하는 주인!
    private Team team;
}

👉 추가적인 UPDATE 쿼리를 실행 해결

-- (1) 팀 저장
INSERT INTO Team (name) VALUES ('Team A');  -- ✅ 정상 동작

-- (2) 멤버 저장 (team_id를 함께 저장!)
INSERT INTO Member (name, team_id) VALUES ('Member 1', 1);  -- ✅ UPDATE 필요 없음!
INSERT INTO Member (name, team_id) VALUES ('Member 2', 1);  -- ✅ UPDATE 필요 없음!

INSERT 시에 team_id가 바로 저장됨. JPA가 불필요한 추가 UPDATE를 실행하지 않음.

4️⃣ 다대일(@ManyToOne)