목차

    연관관계 매핑

    객체와 테이블 연관관계 차이를 이해

    객체의 참조와 테이블의 외래 키 매핑

    용어 이해

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

    연관관계가 필요한 이유

    객체지향 설계의 목표는 자율적인 객체들의 협력 공동체를 만드는 것이다.

    예제 시나리오

    • 회원과 팀이 있다.
    • 회원은 하나의 팀에만 소속될 수 있다.
    • 회원과 팀은 다대일 관계이다. (회원은 여러명이고, 팀은 1개이다.)

    객체를 테이블에 맞추어 모델링

    (연관관계가 없는 객체)

    Member는 N이며 TEAM은 1이다.

    @Entity
    public class Member {
    	@Id
    	@Column(name = "MEMBER_ID")
    	private String id;
    	private String username;
    	
    	//연관관계 매핑
    	@ManyToOne
    	@JoinColumn(name="TEAM_ID")
    	private Team team;
    	
    	//연관관계 설정
    	public void setTeam(Team team) {
    		this.team = team;
    	}
    	//Getter, Setter ...
    }
    @Entity
    public class Team {
    	@Id
    	@Column (name = "TEAM_ID")
    	private String id;
    	
    	private String name;
    	//Getter, Setter ...
    }
    Team team = new Team();
    team.setName("TeamA");
    em.persist(team);
    
    //Member
    Member member = new Member();
    member.setUsername("member1");
    member.setTeamId(team.getId()); //여기서 이상함
    em.persist(member);
    
    //문제가 많은 find하기
    Member findMember = em.find(Member.class, member.getId());
    Long findTeamId = findMember.getTeamId();
    Team findTeam = em.find(Team.class, findTeamId);

    위의 코드에서 문제점은 findMember를 memberId로 조회하고 그 조회한 내용 중에 TeamId를 가져와서 Team을 또 조회한다.

    Join으로 협력관계가 있는게 아닌 Select를 두 번 하는 꼴

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

    객체 지향 모델링

    위의 모델링과 다른 점은 TeamId가 아닌 Team을 모델링 했다는 점이다.

    @Entity
    public class Member {
    	@Id
    	@Column(name = "MEMBER_ID")
    	private String id;
    	private String username;
    	
    	//연관관계 매핑
    	@ManyToOne
    	@JoinColumn(name="TEAM_ID")
    	private Team team; //가장 중요
    	
    	//연관관계 설정
    	public void setTeam(Team team) {
    		this.team = team;
    	}
    	//Getter, Setter ...
    }

    @ManyToOne

    Member 입장 에서 N이고 Team이 1이기 때문에 ManyToOne이다. 

    Team team = new Team();
    team.setName("TeamA");
    em.persist(team);
    
    //Member
    Member member = new Member();
    member.setUsername("member1");
    //member.setTeamId(team.getId()); //여기서 이상함
    member.setTeam(team);
    em.persist(member);
    
    //문제가 많은 find하기
    Member findMember = em.find(Member.class, member.getId());
    //Long findTeamId = findMember.getTeamId();
    //Team findTeam = em.find(Team.class, findTeamId);
    Team findTeam = findMember.getTeam();

    위의 findMember는 select 문이 join문으로 알아서 해준다.

    'Back-end > JPA' 카테고리의 다른 글

    도메인 분석 설계 (N:N 뿌시기)  (0) 2022.11.19
    객체지향 쿼리 언어1 - 기본 문법  (0) 2022.09.24
    엔티티 매핑  (0) 2022.08.06
    [JPA] JPA 영속성 컨텍스트  (0) 2022.05.05
    [JPA] Batch Insert  (0) 2022.05.05

    + Recent posts