티스토리 뷰

객체의 인스턴스 저장소가 DB인 경우와 자바 컬렉션(list, set)인 경우 코드와 성능에서 크게 차이가 남 

 

저장소가 DB인 경우

애플리케이션은 객체 지향 언어(Java...)를 사용하지만 데이터는 관계형DB에 보관. 

애플리케이션과 데이터가 상호작용하기 위해선 객체를 SQL로 변환해 쿼리문을 DB에 전달 해야됨.

DB에 인스턴스를 보관하는 경우 애플리케이션 계층에서 객체답게 모델링 할수록 매핑 작업이 늘어남.

DB와 객체의 패러다임이 불일치!!

 

저장소가 자바 컬렉션인 경우

애플리케이션의 객체를 별도의 변환 없이 저장할 수 있음 

 

객체의 인스턴스 저장소가 DB인 경우와 자바 컬렉션(list, set)인 경우 코드와 성능에서 크게 차이가 남 

 

1. 상속

DB 테이블은 '상속 관계' 개념을 갖고있지 않음 

관계형 DB에선 '슈퍼타입 서브타입'으로 이 개념을 대체함 

대체할 만한 개념은 있지만 완전히 같은 것이 아니기에 유지보수와 구현이 복잡해짐 

 

1) DB 사용

예1) Album 인스턴스를 저장할 때

인스턴스를 분해해 ITEM, ALBUM 테이블에 각각 INSERT 해야함 

1. 인스턴스 분해

2.INSERT INTO ITEM....

3.INSERT INTO ALBUM

 

예2) Album 조회

1. 각각의 테이블에 따른 조인 sql 작성

2, 각각의 객체 생성

 

2) 자바 컬렉션에 인스턴스를 저장, 조회 한다면?

아래와 같이 간단한 코드를 작성하면 됨 

list,add(album);

Album album = list.get(albumId);

 

 

2. 연관관계

두 객체가 연관관계를 맺을 때

객체는 참조를 사용: member.getTeam()

테이블은 외래키(join)를 사용: JOIN ON M.TEAM_ID = T.TEAM_ID

 

1) 객체다운 모델링 VS 테이블에 맞춘 객체 모델링 

유지보수를 위해선 전자의 경우를 택해야 하지만 코드와 동작 방식이 더욱 복잡해짐 

 

- 객체를 등록하고 DB에 저장하는 경우

예1) class 구현 

객체다운 모델링                                                                                            테이블에 맞춘 객체 모델링          

 

예2) DB에 저장 

      객체다운 모델링                                                                                                 테이블에 맞춘 객체 모델링       

 

 

- 객체 모델링 조회 

예) 특정 member  조회 

Member를 조회하기 위해선 Member와 Team 모두 조회해야됨.

연관관계에 있는 객체를 조회하기 위해 JOIN 작업을 추가적으로 해야됨. 

 

 

2) 자바 컬렉션에 인스턴스를 저장, 조회 한다면?

list.add(member);

Member member = list.get(memberId);

Team team = member.getTeam();

 

 

3. 객체 그래프 탐색

객체는 자유롭게 그래프를 탐색할 수 있어야 함 

하지만! DB에 객체를 저장한다면 처음 실행하는 sql에 따라 탐색 범위가 제한되면서 엔티티 신뢰 문제가 발생함 

 

엔티티 신뢰 문제 

계층형 아키텍쳐(MVC패턴)는 다음 계층을 믿고 사용할 수 있어야 하는데 쿼리에 따라 탐색할 수 있는 범위가 달라지기에 요청을 보낸 계층(상위 계층)이 요청을 받은 계층(하위 계층)을 신뢰하지 못함. 따라서 개발자는 상위 계층의 코드에  하위 계층에서의 탐색 범위를 벗어난 접근이 있는지 확인해야됨 

 

예)

member.DAO.find 코드를 확인해야 Team, Order에 접근(탐색) 가능 여부를 알 수 있음.

service계층이(MemberService) repository 계층(memberDAO)을 신뢰하지 못함.

 

모든 객체를 미리 로딩하면 탐색 범위를 고려할 필요가 없지만 join으로 인해 성능이 낮아짐.

탐색 범위에 따라 메서드를 여러 개 구현하는 방법도 있지만 코드가 길어짐. 

 

 

4. 비교하기 

1) sql로 DB에 접근

memberDAO.getMember(): DB에서 인스턴스를 조회해 값이 세팅된 객체 인스턴스 생성 및 반환 

즉, 같은 쿼리문을 날리면 data는 같지만 다른 객체 인스턴스가 생성됨 

 

2) 자바 컬렉션으로 인스턴스에 접근

member1 == member2; // 두 인스턴스는 같음

 

 

결론

객체를 자바 컬렉션에 저장하듯이 DB에 저장할 순 없을까?

→ JPA(Java Persistence API) 등장 

'백엔드 > 스프링' 카테고리의 다른 글

JPA(3) - 영속성 컨텍스트  (0) 2024.04.24
JPA - (1) JPA 소개  (1) 2024.04.18
스프링부트 환경설정  (0) 2024.03.26
애플리케이션 제어  (0) 2023.08.17
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2026/04   »
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
글 보관함