티스토리 뷰

반응형

JPA란?

이 관계를 알아보기 위해 JPA를 쓰는 이유에 대해서 알아봐야합니다. JPA는 ORM 기술 중 하나로 hibernate를 기반으로 자바의 객체와 DB 테이블 간의 패러다임 불일치 문제를 해결해주는 기술입니다.

RDB와 Object는 엄연히 다른 존재이지만 이 불일치를 해결하기 위해 여태 많은 개발자들은 RDB 중심의 애플리케이션 개발을 주로 했습니다. 하지만 JPA가 나오면서 부터 이 불일치 문제를 해결하는 장점을 바탕으로 객체 중심의 개발이 이루어지기 시작했는데 이것이 바로 JPA의 장점이라 할 수 있습니다.

public class Member {
    private Long id;    

    private String email;   

    private String password;    

    private String name; 
}

이렇게 설계된 DB를 객체에 저장하려면 다음과 같은 SQL문이 필요하다.

INSERT INTO MEMBER(MEMBER\_ID, EMAIL, PASSWORD, NAME) VALUES(.....);

전혀 객체지향 스럽지 않습니다. SQL 문에 맞는 값을 작성하기 위해서 저 값들을 일일히 가져와야합니다. 하지만 JPA에서는?

entityManager 클래스의 persist(member); 로 좀 더 객체지향스럽게 저장할 수 있습니다.

뿐만 아니라 JPA는 Entity 클래스를 객체로써 볼 수 있게 됩니다. 설계할 때 내장 타입이나 상속구조도 JPA가 매핑을 해줌으로 좀 더 객체를 객체답게 사용할 수 있도록 해줍니다.

뿐만아니라 객체 기반으로 TypeSafe한 쿼리를 날리기 때문에 개발자의 실수를 사전에 방지할 수 있게 되는 큰 메리트가 존재합니다.

연관관계 매핑에 대한 문제점

하지만 연관관계는 다양한 문제를 야기한다. 연관관계 패러다임을 일치 시키기 위해 연관관계를 맺으면 다음과 같이 해줘야한다.

public class Member {
    private Long id;    

    private String email;   

    private String password;    

    private String name;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "board_id")
    private Board board;    
}

이와 같은 방식으로 매핑을 하였을 때 여기서는 비록 관리 포인트가 적어보이지만 연관관계가 좀 더 복잡해 진다면 달라질 수 있습니다.

대표적으로 N + 1 문제라던지 아니면 고아 객체 문제등 각종 관리포인트가 많아짐으로써 생기는 문제가 발생할 수 있습니다. 뿐만 아니라 객체를 저장해주기 위해서 select를 해와야 하는 경우도 생깁니다. (물론 getReferenceById를 통해 해결 가능합니다.) 그렇기 때문에 트레이드 오프를 통해서 이 문제를 해결하는 방식을 사용하는 방법이 있습니다.

public class Member {
    private Long id;    

    private String email;   

    private String password;    

    private String name;

    private Long boardId;  
}

이를 통해서 객체 그래프 탐색과 영속화의 장점은 사라졌지만 확실히 관리 포인트가 많이 준 것을 알 수 있습니다. 이젠 지연 즉시 로딩으로 인한 N + 1 또는 불필요한 Join 문제를 해결하였습니다. 또한 객체를 저장하지 않기 때문에 고아 객체같은 문제가 발생하지 않을 것입니다.

이 외에도 직관적이기 때문에 코드를 이해하는데 있어 훨씬 수월해 집니다.

MicroService로 가기 위한 전략

microServiceArchitecture에서는 도메인 단위로 모듈이 분리되어 서버가 여러 개 구축이 됩니다.

위 사진처럼 MicroService는 각각 다른 DB를 바라보고 있기 때문에 연관관계가 분리됩니다. 하지만 분리되어있는 서버끼리도 객체를 참조할 수 있는 경우가 생깁니다. 이 때 보통 feign client/webClient 를 이용하여 Id만으로 서로의 정보를 서버간 호출을 통해 정보를 가져오는데

scale out을 해야할 때 모놀리스한 구조에서 객체 참조를 통해 연관관계가 맺어져 있다면 scale out시 객체 참조 형식을 모두 변경해 줘야 합니다. 이는 하나의 feature단위로 볼 정도로 규모가 커집니다.

이러한 scale out에 대비하기 위해 실질적으론 연관관계를 제거하고 Id를 저장하는 방식의 일종의 트레이드 오프가 유지보수에 큰 이점을 가져올 수 있습니다.

Ref.

https://ooeunz.tistory.com/52

[[Tech] MSA(Microservice Architecture)란?

Monolithic Architecture MSA에 대해 이해하기 위해서는 먼저 그에 상반된 모놀리틱 아키텍처에 관해 이해할 필요가 있다. 모놀리틱 아키텍처란 전통적인 소프트웨어 아키텍처 스타일로써 하나의 서버

ooeunz.tistory.com](https://ooeunz.tistory.com/52)

https://mkil.tistory.com/526

[JPA 정의(Java Persistence API) / JPA 사용이유 / JPA 장단점

JPA (JAVA PERSISTENCE API) 란? 애플리케이션의 데이터를 객체지향 관점으로 바라보고 다룰 수 있게 해주는 자바 진영의 ORM 기술표준인 객체지향 기술 ORM(Object Relational Mapping) = 객체와 관계형 데이터베

mkil.tistory.com](https://mkil.tistory.com/526)

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함