연관관계가 필요한 이유

2023. 6. 22. 12:28·💻 Dev/DB&JPA

'연관관계 매핑' 섹션에서는 JPA를 공부하면서 다대일(ManyToOne), 일대다(OneToMany) 이런 단어들을 계속 듣게 될 텐데, 이 부분의 기초적인 내용과 JPA에서 연관관계란 어떤 건지 배울 수 있었다.

 

 

연관관계가 필요한 이유

먼저 학습을 위해 필요한 용어에는 3가지가 있다.

  • 방향(Direction): 단방향, 양방향
  • 다중성(Multiplicity): 다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:M)
  • 연관관계의 주인(Owner): 객체 양방향 연관관계를 관리하는 주인이 필요

여기서 다중성도 중요하지만 연관관계의 주인이 꽤나 중요한 개념이다. 

나도 포스팅하면서 다시 복기해야겠다..

 

예제 시나리오

  • 회원과 팀이 있다.
  • 회원은 하나의 팀에만 소속될 수 있다.
  • 회원과 팀은 다대일 관계다.

먼저 객체를 테이블에 맞추어 모델링을 하면 아래와 같다.

 

 

회원과 팀은 TEAM_ID라는 외래키로 연결되어 있다.

이 구조로 객체를 만들어보면 아래와 같다.

@Entity
public class Member {

     @Id @GeneratedValue
     private Long id;

     @Column(name = "USERNAME")
     private String name;

     @Column(name = "TEAM_ID")
     private Long teamId;
}

@Entity
public class Team {

     @Id @GeneratedValue
     private Long id;

     private String name;
}

이 구조로 member1의 소속 팀을 조회한다면 아래와 같다.

 

1. 팀을 저장한다.

2. 회원을 저장한다. 이때 둘의 연결고리인 teamId를 member에 set 해서 회원을 저장한다.

3. em.find로 member를 조회한다.

4. 구조상 team을 바로 꺼낼 수 없기에 이 member의 teamId를 꺼내서 team을 조회한다.

//팀 저장
Team team = new Team();
team.setName("TeamA");
em.persist(team);

//회원 저장
Member member = new Member();
member.setName("member1");
member.setTeamId(team.getId()); //외래키를 직접 사용
em.persist(member);

//회원의 소속 팀을 조회할 때
Member findMember = em.find(Member.class,member.getId());
Long findTeamId = findMember.getTeamId();
Team findTeam = em.find(Team.class, findTeamId);

객체는 참조를 사용해서 연관된 객체를 찾는다.

외래 키를 사용하는 거랑 참조랑은 다르다.

이렇게 객체를 테이블에 맞추어 데이터 중심으로 모델링하면 협력 관계를 만들 수 없다.

 

 

 

 

 

[참고] 인프런 - 김영한 님의 자바 ORM 표준 JPA 프로그래밍-기본편 강좌를 보고 공부한 내용을 바탕으로 작성했습니다.

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런

www.inflearn.com

 

 

저작자표시 비영리 (새창열림)

'💻 Dev > DB&JPA' 카테고리의 다른 글

변경감지와 병합  (0) 2024.01.06
[PostgreSQL] 공통 코드 테이블로 REPLACE 지옥 탈출하기  (0) 2023.09.24
단방향, 양방향 연관관계 매핑  (0) 2023.06.23
엔티티 매핑  (0) 2023.06.17
영속성 컨텍스트  (0) 2023.06.16
'💻 Dev/DB&JPA' 카테고리의 다른 글
  • [PostgreSQL] 공통 코드 테이블로 REPLACE 지옥 탈출하기
  • 단방향, 양방향 연관관계 매핑
  • 엔티티 매핑
  • 영속성 컨텍스트
현주먹
현주먹
대구 불주먹 출신 현주먹의 개발.log
  • 현주먹
    현주먹의 개발로그
    현주먹
  • 전체
    오늘
    어제
    • 전체글 (176)
      • 👶🏻 CS (15)
        • Operating System (7)
        • DB (5)
        • Data Structure (2)
        • Software Engineering (1)
      • 💻 Dev (54)
        • Java & OOP (24)
        • Spring (4)
        • DB&JPA (6)
        • Test Code (1)
        • JSP & Servlet (13)
        • Etc (6)
      • 💡 Algorithm (25)
        • 인프런 (9)
        • 백준 (16)
      • 🛠 DevOps & Tool (11)
        • Linux (4)
        • AWS (1)
        • Git (2)
        • Etc (4)
      • 📝 끄적끄적 (71)
        • 후기 및 회고 (10)
        • TDD, 클린 코드 with Java 17기 (3)
        • F-Lab (23)
        • 🖥️ 자바의 정석 (11)
        • 📖 Clean Code (3)
        • 항해99 코테 스터디 (11)
        • 📖 가상 면접 사례로 배우는 대규모 시스템 설계 .. (9)
  • 블로그 메뉴

    • 🐈‍⬛ GitHub
    • TIL repository
  • 인기 글

  • 최근 글

  • 최근 댓글

  • 태그

    jsp
    티스토리챌린지
    개구리책
    2025스프링캠프
    f-lab 후기
    백준
    C
    데브클럽
    코딩테스트준비
    오라클
    ==와 equals()
    코테스터디
    JPA
    인프런 특정문자뒤집기
    TDD 클린 코드 with Java
    항해99
    자바의신절판
    에프랩
    NextSTEP
    개발자멘토링
    자바의정석
    개발자취업
    99클럽
    til
    객체지향
    F-Lab
    오블완
    jsp 2.3 웹 프로그래밍: 기초부터 중급까지
    로또 미션
    에프랩 후기
  • hELLO· Designed By정상우.v4.10.2
현주먹
연관관계가 필요한 이유
상단으로

티스토리툴바