inblog logo
|
LifeLog, DevLog
    JPA

    JPA의 연관 관계에 관하여

    KYJTHEYJ's avatar
    KYJTHEYJ
    Jan 07, 2026
    JPA의 연관 관계에 관하여
    Contents
    JPA의 연관 관계단방향 관계양방향 관계양방향 관계라는게 있긴 한건가?

    JPA의 연관 관계

    엔티티 간의 관계로 크게 단방향, 양방향 관계 두가지가 있다

    관계의 방향과 더불어 주인 이라는 개념이 중요한데
    여기서 주인은 실제 데이터를 보유하고 있는 측을 말한다

    단방향 관계

    예시를 들어 이제 어떤 도서관들과 도서관이 보유한 책들이 있다고 하자
    책은 자신이 어디 도서관에 속해 있는지 알고 있다

    용어적으로 설명하면 도서관의 식별 키인 기본키의 정보를 알고 있는 것인데
    책은 도서관의 키를 외래키로 갖고 있어야 한다

    도서관 안에 책이 있는 것이니 여기선 책이 주인이다

    주인 측에 ManyToOne과 JoinColumn을 통해 연관 관계를 표시한다

    @Getter
    @Entity
    @Table(name = "librarys")
    public class Library {
    	// librarys 의 키들
    }
    
    @Getter
    @Entity
    @Table(name = "books")
    public class Book {
    	// books 의 키들
    
    	@ManyToOne(fetch = FetchType.LAZY)
    	@JoinColumn(name = "library_id")
    	private Library library;
    }

    도서관으로는 책이 속해있는지는 알 수 없지만
    책으로는 자신이 어디 도서관에 속한 책인지 알 수 있다 (외래키를 통해)

    이렇게 한 쪽 객체에서만 다른 쪽 객체를 참조할 수 있는 관계를 단방향 관계라고 한다


    양방향 관계

    도서관에 만약 검색 시스템이 들어와서 만약 책의 정보를 알 수 있고
    책은 여전히 어디 도서관에 속한지 알 수 있게 되었다면, 이는 양방향 관계다
    (양 쪽이 서로의 객체를 참조할 수 있는 관계)

    @Getter
    @Entity
    @Table(name = "librarys")
    public class Library {
    	// librarys 의 키들
    	
    	@OneToMany(mappedBy = "book")
    	List<Book> books = new ArrayList<>();
    }
    
    @Getter
    @Entity
    @Table(name = "books")
    public class Book {
    	// books 의 키들
    
    	@ManyToOne(fetch = FetchType.LAZY)
    	@JoinColumn(name = "library_id")
    	private Library library;
    }

    이러한 경우엔 Book이 외래키를 통해 Library의 정보를 알 수 있고
    Library 는 내부의 books 필드로 Book의 정보를 알수 있다

    코드적으로 말을 하면
    book.getLibrary() 도 가능 하고 Library는 library.getBooks() 로 서로
    참조가 가능해진다는 말이다

    양방향은 원하지 않는 조회를 이뤄낼 수 있으니 주의해야한다
    즉, 사용에 있어서 설계를 잘 해야 한다는 것이다


    양방향 관계라는게 있긴 한건가?

    DB 상으로는 DB의 1정규화 위반이다, 원자값을 지녀야한다
    애초에 양방향이라는 건 존재할 수가 없다
    어떻게 레코드 하나에서 컬럼의 값이 리스트형식이 될 수 있을까?

    이게 우리가 아는 위에서 명시한 book 테이블의 구조 일 것이다

    • book 테이블

    id

    library_id

    name

    1

    1

    적과 흑

    2

    1

    카라마조프가의 형제들

    근데 양방향 관계를 그려보면 library 는 아래와 같을 것이다

    • library 테이블

    id

    name

    book

    1

    높은산깊은골적막한도서관

    {id:1, name:적과 흑}

    2

    눈내린도서관

    {id:1, name:카라마조프가의 형제들}

    즉, 실제 DB엔 없는 관계다
    DB 상의 개념과 사용하는 것 자체가 다르니 구분지어서 생각해야 한다는 것이다

    Share article
    Contents
    JPA의 연관 관계단방향 관계양방향 관계양방향 관계라는게 있긴 한건가?

    LifeLog, DevLog - https://github.com/KYJTHEYJ

    RSS·Powered by Inblog