📖
Kyu9's Repo
  • Library of mameil
  • 이슈 경험
    • 20230220_트랜잭션
    • 20230306_캐싱이슈
    • 20230722_테스트코드에서 @Transactional
    • 20230807_deadlock
  • 인턴 스터디
    • Gradle
    • Stream, Optional, 람다식
    • JVM의 메모리 구조, Garbage Collector
    • RESTful API
    • Microservice Architecture
    • HTTP
    • 웹서버란 무엇인가
    • Git Branch
    • TDD
    • Redis을 이용한 캐시
    • Thymeleaf
    • 정리가 필요한 자료들
    • SpringBoot Management
    • 테스크 코드 분할
  • 동아리 스터디
    • 기본 SQL 공부
      • SQL의 기본 개념
      • SELECT 문장을 이용하여 원하는 데이터 출력하기
        • 집합 연산자 사용하기
        • where절에 비교 연산자를 사용해보기
        • SELECT_EX
        • 산술 연산자 사용해보기
      • 단일 행 함수 사용
        • lower/upper 함수 사용하기
        • length함수 사용하기
        • concat함수 사용
        • substr/mid/substring 함수 사용
        • instr함수 사용하기
        • lpad/rpad 함수 사용하기
        • trim/ltrim/rtrim 함수 사용하기
        • replace 함수 사용하기
        • round 함수 사용하기
        • truncate 함수 사용하기
        • mod함수 사용하기
        • ceil함수 사용하기
        • floor함수 사용하기
        • power 함수 사용하기
        • Date fn(날짜 함수)
        • 형 변환 함수
        • 일반함수란
    • a-ha 실습
    • 혼자서 만들어본 게시판
    • AWS 강의
  • 학교 나머지 공부 자료
    • 웹프레임워크(Spring)
      • Spring이란?
      • Webframework1-1
      • Webframework1-2
      • SpringBoot의 특징
      • SpringBoot 생성 방법
      • Spring Data JPA
      • SpringBoot Security
      • SpringBoot HATEOAS
  • 공부 자료들
  • WS 온라인 자바 스터디
    • Week1(JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가.)
    • Week2(자바 데이터 타입, 변수 그리고 배열)
    • Week3(연산자)
    • Week4(제어문)
    • Week5(클래스)
    • Week6(상속)
    • Week7(패키지)
    • Week8(인터페이스)
    • Week9(예외처리)
    • Week10(멀티쓰레드 프로그래밍)
    • Week11(Enum)
    • Week12(Annotation)
    • Week13(I/O)
    • Week14(Generic)
    • Week15(람다식)
  • 백준문제
    • 입출력과 사칙연산
      • We love kriii(10718)
      • 고양이(10171)
      • 개(10172)
      • A+B(1000)
      • A-B(1001)
      • AxB(10998)
      • A/B(1008)
      • 사칙연산(10869)
      • 나머지(10430)
      • 곱셈(2588)
    • for문
      • 구구단(2739)
      • A+B - 3(10950)
      • 합(8393)
      • 빠른 A+B(15552)
      • N 찍기(2741)
      • 기찍 N(2742)
      • A+B - 7(11021)
      • A+B - 8(11022)
      • 별 찍기 - 1(2438)
      • 별 찍기 - 2(2439)
      • X보다 작은 수(10871)
    • if문
      • 두 수 비교하기(1330)
      • 시험 성적(9498)
      • 윤년(2753)
      • 사분면 고르기(14681)
      • 알람 시계(2884)
      • 오븐 시계(2525)
      • 주사위 세개(2480)
      • 영수증(25304)
    • While문
      • A+B - 5(10952)
      • A+B - 4(10951)
      • 더하기 사이클(1110)
    • 1차원 배열
      • 최소, 최대(10818)
      • 최댓값(2562)
      • 숫자의 개수(2577)
      • 나머지(3052)
      • 평균(1546)
      • OX퀴즈(8958)
      • 평균은 넘겠지(4344)
    • 함수
      • 정수N개의 합(15596)
      • 셀프 넘버(4673)
      • 한수(1065)
    • 문자열
      • 아스키코드(11654)
      • 숫자의 합(11720)
      • 알파벳 찾기(10809)
      • 문자열 반복(2675)
      • 단어 공부(1157)
      • 단어의 개수(1152)
      • 상수(2908)
      • 다이얼(5622)
      • 크로아티아 알파벳(2941)
      • 그룹 단어 체커(1316)
    • 기본수학-1
      • 손익분기점(1712)
      • 벌집(2292)
      • 분수찾기(1193)
      • 달팽이는 올라가고 싶다(2869)
      • ACM 호텔(10250)
      • 부녀회장이 될테야(2775)
      • 설탕 배달(2839)
      • 큰 수 A+B(10757)
      • Fly me to the Alpha Centauri(1011)
    • 기본수학-2
      • 소수 찾기(1978)
      • 소수(2581)
      • 소인수분해(11653)
      • 소수 구하기(1929)
      • 베르트와 공존(4948)
    • 재귀
      • 하노이 탑 이동 순서(11729)
      • 피보나치 수 5(10870)
      • 별 찍기(2447)
    • 브루트 포스
      • 블랙잭(2798)
      • 분해합(2231)
      • 덩치(7568)
      • 체스판 다시 칠하기(1018)
      • 영화감독 슘(1436)
    • 집합과 맵
      • 숫자 카드(10815)
      • 문자열 집합(14425)
      • 숫자 카드2(10816)
      • 듣보잡(1764)
      • 대칭 차집합(1269)
      • 서로 다른 부분 문자열 갯수(11478)
    • 정렬
      • 수 정렬하기(2750)
      • 수 정렬하기 2(2751)
      • 수 정렬하기 3(10989)
      • 통계학(2108)
      • 소트인사이드(1427)
      • 좌표 정렬하기(11650)
      • 좌표 정렬하기2(11651)
      • 단어 정렬(1181)
      • 나이순 정렬(10814)
      • 커트라인(25305)
      • 좌표압축(18870)
    • 백트래킹
      • N과 M - 1(15649)
      • N과 M - 2(15650)
      • N과 M - 3(15651)
      • N과 M - 4(15652)
      • N-Queen(9663)
      • 스도쿠(2580)
      • 연산자 끼워넣기(14888)
      • 스타트와 링크(14889)
    • 이분 탐색
      • 수 찾기(1920)
    • 동적계획법
      • 피보나치 함수(1003)
      • 신나는 함수 실행(9184)
      • 01타일(1904)
      • 파도반 수열(9461)
      • RGB거리(1149)
      • 정수 삼각형(1932)
      • 계단 오르기(2579)
      • 1로 만들기(1463)
      • 쉬운 계단 수(10844)
      • 포도주 시식(2156)
      • 가장 긴 증가하는 부분 수열(11053)
      • 가장 긴 바이토닉 부분 수열(11504)
      • 전깃줄(2565)
      • LCS(9251)
      • 연속합(1912)
      • 평범한 배낭(12865)
      • 더하기(9095)
    • DFS와 BFS
      • 미로탐색(2178)
      • 바이러스(2606)
      • DFS와 BFS(1260)
      • 단지번호붙이기(2667)
      • 전쟁 - 전투(1303)
      • 숨바꼭질(1697)
      • 데스 나이트(16948)
      • 나이트의 이동(7562)
      • 녹색 옷 입은 애가 젤다지?(4485)
      • 음식물 피하기(1743)
      • A->B (16953)
      • 숨바꼭질 3(13549)
      • 숨바꼭질 2(12851)
    • 구현
      • 치즈(2636)
  • 프로그래머스 문제
    • SQL
      • Animal Table - Oracle
      • Animal Table - MySQL
      • Animal Table2 - Oracle
      • Animal Table 3,4 - Oracle
    • Lv1
      • 두 개 뽑아서 더하기
      • 제일 작은 수 제거하기
      • 문자열 내 p와 y의 개수
      • 예산
      • 자릿수 더하기
      • 두 정수 사이의 합
      • 같은 숫자는 싫어
      • 가운데 글자 가져오기
      • 수박수박수박수박수박수?
      • 나누어 떨어지는 숫자 배열
      • 2016년
      • 폰캣몬
      • 서울에서 김서방 찾기
      • 문자열을 정수로 바꾸기
      • 소수 만들기
      • 문자열 다루기 기본
      • 소수 찾기(에라토스테네스의 체)
      • 숫자 문자열과 영단어
      • 이상한 문자 만들기
      • 없는 숫자 더하기
      • 문자열 내림차순으로 배치하기
      • 문자열 내 마음대로 정렬하기
      • 약수의 개수와 덧셈
      • 콜라츠 추측
      • 자연수 뒤집어 배열로 만들기
      • 신규 아이디 추천
      • 비밀지도
      • 크레인 인형뽑기 게임
      • 실패율
      • 로또의 최고 순위와 최저 순위
      • 키패드 누르기
      • 정수 내림차순으로 배치하기
    • Lv2
      • 행렬의 곱셈
      • 영어 끝말잇기
      • 영어 끝말잇기
      • N개의 최소 공배수
      • 피보나치 수
      • 124 나라의 숫자
      • 짝지어 제거하기
      • 프린터
      • 다음 큰 숫자
      • 최댓값과 최솟값
      • 최소값 만들기
      • 숫자의 표현
      • JadenCase 문자열 만들기
      • 오픈채팅방
      • 영어 끝말잇기
      • 멀쩡한 사각형
      • 올바른 괄호
      • 위장
      • 기능개발
      • 더 맵게
      • 스킬트리
    • 완전탐색
      • 모의고사(Lv1)
      • 카펫(Lv2)
      • 소수 찾기(Lv2)
    • 정렬(Sorting)
      • K번째 수(Lv1)
      • 가장 큰 수(Lv2)
      • H-Index(Lv2)
    • 해시(Hash)
      • 완주하지 못한 선수(Lv1)
      • 전화번호 목록(Lv2)
    • 탐욕법(Greedy)
      • 체육복(Lv1)
      • 큰 수 만들기(Lv2)
      • 구명보트(Lv2)
    • 동적계획법(DP)
      • 정수 삼각형(Lv3)
    • 깊이/너비 우선 탐색(DFS/BFS)
      • 타겟 넘버(Lv2)
      • 네트워크(Lv3)
      • 단어 변환(Lv3)
  • 스프링부트 책
    • Day 1
    • Day 2
    • Day 3
    • Day 4
    • Day 5
    • Day 6
    • Day 7
    • Day 8
    • Day 9
    • Day 10
    • Day 11
    • Day 12
    • Day 13
    • Day 14
    • Day 15
    • Day 16
    • Day 17
  • JPA 책
    • 프로젝트 세팅 및 기본설정
    • 영속성 관리 개념
    • 엔티티 매핑
      • 실습 예제
    • 연관관계 매핑 기초
      • 실습 예제
    • 다양한 연관관계 매핑
      • 다대일, 일대다 관계
      • 일대일, 다대다 관계
      • 실습 예제
    • 고급 매핑
      • 상속 관계 매핑
      • @MappedSuperclass
      • 복합 키와 식별 관계 매핑
      • 조인 테이블
    • 프록시와 연관관계 관리
      • 프록시
      • 즉시 로딩과 지연 로딩
      • 영속성 전이, 고아 객체
    • 값 타입
      • 임베디드 타입
      • 값 타입과 불변 객체
      • 값 타입의 비교, 컬렉션
    • 객체지향 쿼리 언어
      • JPQL part1
      • JPQL part2
      • JPQL part3
      • QueryDSL
      • NativeSQL
      • 객체지향 쿼리 심화
    • 응용 애플리케이션
      • 엔티티 설정
    • 스프링 데이터 JPA
      • 공통 인터페이스
  • Kotlin In Action
    • 코틀린의 특징
    • 코틀린의 기초
    • 함수 정의와 호출
    • 클래스, 객체, 인터페이스
    • 람다 방식
    • 코틀린 타입 시스템
    • 연산자 오버로딩과 기타 관례
    • 고차함수
    • 제네릭스
    • 애노테이션과 리플렉션
    • 코루틴
  • Oracle
    • Oracle 기본
    • Oracle 심화
  • SQL_연습
    • Revising the Select Query
    • Basic Select
    • Advanced Select
    • Basic Select 2
  • SQL 첫걸음(책)
    • Day 1
    • Day 2
    • Day 3
    • Day 4
    • Day 5
    • Day 6
    • Day 7
    • Day 8
    • Day 9
    • Day 10
    • Day 11
    • Day 12
    • Day 13
    • Day 14
    • Day 15
    • Day 16
    • Day 17
    • Day 18
    • Day 19
    • Day 20
    • Day 21
    • Day 22
    • Day 23
    • Day 24
    • Day 25
    • Day 26
    • Day 27
    • Day 28
    • Day 29
    • Day 30
  • 더 자바 코드를 조작하는 다양한 방법
    • JVM 이해하기
    • 바이트코드 조작
    • 리플렉션
    • 다이나믹 프록시
    • 애노테이션 프로세서
  • 더 자바, 애플리케이션을 테스트하는 다양한 방법
    • JUnit5
    • Mockito
    • 도커와 테스트
    • 성능, 운영이슈, 아키텍처 테스트
  • 이펙티브 자바
    • item1 - 생성자 대신 정적 팩토리 메소드를 고려하라
    • item2 - 생성자에 매개변수가 많다면 빌더를 고려하라
    • item3 - 생성자나 열거타입으로 싱글턴임을 보증하라
    • item4 - 인스턴스화를 막기 위해선 private 생성자를 사용하라
    • item5 - 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라
    • item6 - 불필요한 객체 생성을 피하라
    • item7 - 다 쓴 객체 참조를 해제하라
    • item8 - finalizer와 cleaner 사용을 피하라
    • item9 - try-finally 보다 try-with-resources을 사용하라
    • item10 - equals는 일반 규약을 지켜 재정의하라
    • item11 - equals을 재정의하려면 hashCode도 재정의하라
    • item12 - toString을 항상 재정의하라
    • item13 - clone 재정의는 주의해서 진행하라
    • item14 - Comparable을 구현할지 고민하라
  • Elastic Search
    • 강의 Summary
    • Elastic Summary 개념 정리
    • Elastic Summary 적용 정리
  • 토비의 스프링 강의
    • 스프링부트 살펴보기
    • 독립 실행형 서블릿 애플리케이션
  • k8s
    • minikube 설치
    • jenkins 추가
  • Article
    • Choosing the Right MessageBroker
Powered by GitBook
On this page
  • 연관관계 매핑에서 중요한 키워드
  • 단방향 연관관계

Was this helpful?

  1. JPA 책

연관관계 매핑 기초

엔티티들은 다른 엔티티와 연관관계가 많이 이루어진다. 객체 같은 경우에는 참조라는 주소를 이용해서 다른 객체와 관계를 맺지만 테이블 같은 경우에는 외래 키를 사용해서 다른 테이블과 관계를 맺는다. 이처럼 객체와 테이블은 다르게 참조하고 있는데, 이렇게 객체의 연관관계랑 테이블의 연관관계를 연결? 동기화? 시키는 것이 매핑이라고 볼 수 있고 이것이 목표이다.

연관관계 매핑에서 중요한 키워드

  • 방향

    • 단방향, 양방향이 있다. 단방향은 한쪽만 참조하고 있는 경우를 의미하고 양방향은 양쪽 모두가 서로를 참조하는 관계이다.

    • 말 그대로의 관계들이고, 방향이라는 키워드는 사실 객체관계에만 존재하고 있으며, 테이블의 관계는 항상 양방향 관계로 이루어져 있다.

  • 다중성

    • 연관관계를 맺을 때, 사용 횟수?라고 하긴 좀 애매하지만 각 연관관계에서 한 번만 참조하느냐 여러번 참조하느냐를 보여준다.

    • 일대일, 다대일, 일대다, 다대다 이렇게 종류가 있다.

  • 연관관계의 주인

    • 양방향 관계 상황에서 연관관계의 주가 되는 엔티티를 연관관계의 주인이라고 부른다.

단방향 연관관계

일단은 다대일에 대해서 알아봐야한다.

진행을 위한 예시

  • 회원과 팀이 있다.

  • 회원은 하나의 팀에만 소속될 수 있다.

  • 회원과 팀은 다대일 관계이다.

구조는 이렇다.

Member
- id, username, Team

Team
- id, name
Member
- MEMEBER_ID, TEAM_ID, USERNAME

Team
- TEAM_ID, NAME

이 예시를 객체 연관관계와 테이블 연관관계부터 시작

  • 객체 연관관계

    • Member 객체는 member의 team 필드로 Team객체와 연관관계를 맺는다.

    • Member 객체와 Team 객체는 단방향 관계인데, Member 객체의 필드 Team을 통해서 Member에서는 Team에 대한 정보를 가지고 있어야 하지만, Team객체는 어떠한 Member를 가지고 있는지 저장하는 필드가 없기 때문에 단방향 관계라고 볼 수 있다.

  • 테이블 연관관계

    • TEAM_ID를 통해서 Member 객체와 Team 객체가 연결이 된다.

    • 위에서 말했듯이, 테이블 간의 방향은 양방향 관계이다.

    • 이렇게 서로 조인을 해줘야 한다

    SELECT * FROM MEMBER M
    JOIN TEAM T ON M.TEAM_ID = T.TEAM_ID
    
    SELECT * FROM TEAM T
    JOIN MEMBER M ON T.TEAM_ID = M.TEAM_ID
    • 그리고 조금 더 정확하게 보면 이건 양방향이라고 보기보다는 서로 다른 단방향이 이어져 있다고 볼 수 있다.

그러면 객체 연관관계와 테이블 연관관계를 정리해보자

객체는 참조를 통해서 연관관계를 이루고, 테이블은 외래 키를 통해서 연관관계를 이룬다

예를 들면 참조를 사용하는 객체는 get을 사용해서 값을 가져오지만 테이블은 조인을 사용해서 가져온다

객체의 참조는 단방향으로 볼 수 있지만 외래키를 사용하는 테이블의 연관관계를 양방향이라서 A JOIN B가 가능하면 B JOIN A 이렇게 사용할 수 있다.

순수한 객체 연관관계

객체 단위에서 사용하는 걸 보자

@Data
public class Member{
	private String id;
	private String username;

	private Team team;
}

@Data
public class Team{
	private String id;
	private String name;
}

이렇게 값들이 있다면 member에서 team을 연동해서 사용하는 방법은

Member mem = new Member();
Team team = mem.getTeam();

요렇게 사용하게 된다. 이렇게 객체를 참조해서 연관관계를 사용하는 것을 객체 그래프 탐색 이라고 한다

테이블 연관관계

SQL단위(데이터베이스) 에서 회원과 팀 관계를 형성하는 것을 확인해보자

CREATE TABLE MEMBER(
	MEMBER_ID VARCHAR(255) NOT NULL,
	TEAM_ID VARCHAR(255),
	USERNAME VARCHAR(255),
	PRIMARY KEY (MEMBER_ID)
);

CREATE TABLE TEAM(
	TEAM_ID VARCHAR(255) NOT NULL,
	NAME VARCHAR(255),
	PRIMARY KEY (TEAM_ID)
);

ALTER TABLE MEMBER ADD CONSTRAINT FK_MEMBER_TEAM 
FOREIGN KEY (TEAM_ID) REFERENCES TEAM

이렇게 member table을 생성하고, team table을 생성하고 foreign key의 등록을 통해서 연관관계를 맺어주는데 데이터 베이스에서는 이것을 조인이라고 부른다

객체 관계 매핑

자 이렇게 귀찮게 서로서로 해줘야하는 부분을 제외하고 한 번에 할 수 있는 방법이 있다

@Data
@Entity
public class Member {

    @Id
    @Column(name = "MEMBER_ID")
    private Long id;

    private String username;

    @ManyToOne
    @JoinColumn(name = "TEAM_ID")
    private Team team;

}
@Data
@Entity
public class Team {
    @Id
    @Column(name = "TEAM_ID")
    private String id;

    private String name;
}

이제 연관관계를 맺었는데 사용한 애노테이션은 @ManyToOne 그리고 @JoinColumn을 사용했다.

  • @ManyToOne : 이름 그대로 다대일 이라는 관계를 나타내는 매핑 정보이다. 회원과 팀은 다대일 관계이고, 연관관계를 매핑할 때 이렇게 다중성을 나타내는 애노테이션을 필수로 붙혀줘야 한다.

    • optional : false로 설정하면 연관된 엔티티가 항상 있어야 한다

    • fetch : fetch 전략을 설정요건 이후에 자세하게 다룬다

      • @ManyToOne = FetchType.EAGER

      • @OneToMany = FetchType.LAZY

    • cascade : 영속성 전이 기능을 사용 이후에 자세하게 다룸

    • targetEntity : 연관된 엔티티의 타입 정보를 설정(처음봄=거의안씀)

  • @JoinColumn : 조인 컬럼은 외래 키를 매핑할 때 사용한다. 여러가지 속성들도 있다

    • name : 이 속성은 매핑할 외래 키 이름을 지정해주는 단계이다. 생략가능하긴하다 - 기본값은 필드명_참조하는 테이블의 기본 키 컬럼명

    • referencedColumnName : 외래 키가 참조하는 대상 테이블의 컬럼명 - 참조하는 테이블의 기본키 컬럼명

    • foreignKey(DDL) : 외래 키 제약조건을 직접 지정할 수 있다. 이 속성은 테이블을 생성할 때만 사용

    • unique, nullable, insertable, updatable, columnDefinition, table 이 있는데 이런건 @Column 애노테이션과 같음

양방향 연관관계

기존의 단방향은 회원에서 팀으로만 접근하는 방식이였지만 반대로 팀에서도 회원에 접근할 수 있도록 팀 객체에 List형태로 Member들을 넣어주자 → 그럼 Team 객체에서 수정만 해주면 되겠지요?

package EntityMappingExample;

import lombok.Data;

import javax.persistence.*;
import java.util.List;

@Data
@Entity
public class Team {
    @Id
    @Column(name = "TEAM_ID")
    private String id;

    private String name;

    @OneToMany(mappedBy = "team")
    private List<Member> members;
}

양방향 관계를 위해서 List형태로 Member를 뭉텅이로해서 가지고 있다. 그리고 @OneToMany 애노테이션을 사용했고 mappedBy속성으로 반대쪽 매핑 필드 이름값으로 주었다

근데 왜 mappedBy 속성을 넣어줘야 하는 걸까?

객체에는 양방향 연관관계라는 것이 존재하지 않는다 단지 각자의 단방향을 서로 이어놨기 때문에 그렇게 보이는 것 뿐이다.

그러면 연관관계가 있는 테이블은 외래 키 하나로 두 테이블의 연관관계를 관리하는데, 여기서 서로 참조하는 것이 2가지씩 있는 상황인데, 그러면 두 객체의 연관관계 중 하나를 정해서 테이블의 외래키를 관리해야 하는데, 이것을 연관관계의 주인이라고 한다

그 연관관계의 주인만이 데이터 베이스 연관관계와 매핑되고 외래키를 관리한다(CRUD) 주인이 아닌 쪽은 단지 R만 가능하다 ⇒ 연관관계의 주인을 정한다 = 외래 키 관리자를 정한다

위의 예시로 보자면

-만약 Member 엔티티에 있는 Member.team을 주인으로 선택하면 자기 테이블에 있는 외래 키를 관리하면 됨

-하지만 Team에 있는 team.members를 주인으로 선택하게 되면 외부에 있는 테이블의 외래 키를 관리해야함

그러면 결과적으로 지금 Member 엔티티이 외래 키를 가지고 있음으로 Member.team이 주인이라고 볼 수 있음

양방향 관계에서 값을 넣어줄 때 주인이 아닌 방향에 값을 설정하지 않아도 외래 키 값이 정상적으로 적용

-반대로 주인이 아닌 곳에만 값을 넣어주게 된다면 정상적으로 값이 저장되지 않는 다는 점을 기억하자

-이게 DB적이 아니라 객체적으로 봐도 사실은 양쪽 방향에 모두 값을 입력해주는게 안전하다 - 걍 이렇게해

내용 정리

  1. 단방향 매핑만으로 테이블과 객체의 연관관계 매핑은 된거임

  2. 단방향을 양방향으로 만들어주면 반대 방향으로 객체 탐색 기능이 추가됨

  3. 양방향 연관관계를 매핑하려면 객체에서 양방향을 모두 관리해야함

  4. 연관관계의 주인은 외래 키의 위치에 따라서 정하는거다 - 비즈니스에 따른게 아님

Previous실습 예제Next실습 예제

Last updated 3 years ago

Was this helpful?