당니의 개발자 스토리

객체와 테이블 매핑 본문

스프링/자바 ORM 표준 JPA 프로그래밍 - 기본편

객체와 테이블 매핑

clainy 2024. 5. 27. 19:23

객체와 테이블 매핑

이번 시간에는 엔티티 매핑에 대해서 알아보겠습니다.

JPA에서 제일 중요하게 봐야 되는 두 가지 중 하나는 영속성 컨텍스트나 어떤 JPA의 내부 동작 방식과 같은, JPA가 내부적으로 어떤 메커니즘으로 동작하는지 그런 메커니즘적인 측면이랑 실제 설계적인 측면, 그러니까 객체랑 관계형 데이터베이스를 어떻게 매핑을 해서 쓰는지, 이건 정적인 측면이죠.

이 매핑이 정말 중요하고, 이번 시간에는 entity mapping에 대해서 알아보겠습니다.

목차를 간단하게 말씀드리면 객체랑 테이블을 어떻게 매핑 하는지 설명드릴 거고, 그 다음에 데이터베이스 스키마를 자동 생성해주는 걸 알아보고요. 그 다음에 데이터베이스의 어떤 컬럼이랑 객체 필드 이걸 매핑 하는 거랑 pk, 기본 키를 어떻게 매핑 하는지, 그리고 마지막에는 실전 예제라고 해서 제가 이 예제를 쭉 이어갈 거에요. 그래서 강의마다 점점 커가는 예제인거죠.

제일 먼저, 엔티티 매핑을 소개를 해드릴게요.

사실 JPA에서 매핑하는 게 그렇게 어렵진 않아요. 그러니까 제일 먼저 객체랑 테이블을 매핑을 하고, 그 다음에 필드랑 컬럼을 매핑해야 되겠죠?

그리고 기본 키인 PK를 어떻게 매핑하는지, 그 다음에 마지막으로 연관관계를 매핑해야 되는데요. 위에서부터 이 3개는 아실 것 같아요.

연관관계 매핑은 뭐냐면, 예를 들어서 Member랑 Team이 있는데, '이 회원이 어느 Team에 소속되어 있어' 이렇게 서로 관계가 있을 때 어떤 식으로 이 연관관계를 매핑해야 되냐, 보통 이제 관계형 DB 다 공부해보셨겠지만 일대다, 다대일, 다대다 이런 관계들 있ㅈ죠.

관계형 DB에서 일대다로 되어있거나 다대일로 되어있을 때 JPA에서는 이걸 어떻게 매핑해야 되나 하는 내용입니다.

그래서 이번 시간에는 객체와 테이블, 필드와 컬럼, 기본 키 매핑 이 3가지를 알아볼 거고요. 연관관계 매핑은 다음 장에서 알아볼 예정입니다.

자 이제 먼저 객체와 테이블 매핑입니다.

이제 클래스랑 테이블을 먼저 매핑을 해야 되겠죠. 근데 JPA에서는 먼저 @Entity가 중요합니다. 이 @Entity가 붙은 클래스는 이제 JPA가 관리하는 엔티티에요. 이 @Entity가 붙지 않으면 JPA랑 전혀 관계없는, 그냥 내가 마음대로 쓰고 싶은 클래스라고 보시면 됩니다.

그래서 JPA를 사용해서, 테이블과 매핑할 클래스는 @Entity가 필수입니다.

그런데 몇 가지 주의점이 있는데요. 기본 생성자는 꼭 있어야 됩니다. Public이나 Protected의 기본 생성자가 있어야 되고 이제 이게 JPA 스펙상 이렇게하라고 규정이 되어 있습니다.

왜냐하면 JPA 처럼 구현해서 쓰는 어떤 라이브러리들이 뭔가 막 동적으로 뭘 하거나 리플렉션이나 이런 다양한 기술들을 써서 객체를 뭐 proxying하고 이런 것들이 있는데, 그런 것들을 하려면 기본 생성자가 필요하기 때문에 그래요. 그래서 스펙상 그렇다 라고 알아두시면 되고요.

그 다음에 final 클래스나 enum, interface, inner 클래스는 @Entity를 사용하면 안됩니다. @Entity를 붙여서 매핑할 수가 없어요.

그 다음에 내가 db 에 저장하고 싶은 필드에는 final을 사용하면 안됩니다.

@Entity를 코드로 보면서 볼게요.

이렇게 써야되구요. 그러면 아 이건 이제 jpa가 관리하는 객체고, 이 @Entity가 붙은 클래스를 데이터베이스 테이블과 매핑을 해서 쓴다고 보시면 됩니다.

그리고 이 @Entity에는 name이라는 속성이 있는데요. 사실 이건 이제 별로 중요하지는 않아요.

그냥 name 이라는 속성으로 지정할 수 있는데, 기본 값이 뭐냐면 지금 현재 내 클래스의 이름과 동일한 이름을 사용합니다. 그래서 일반적으로 이걸 쓸 이유는 없구요. 예를 들어서 다른 패키지에 같은 이름의 클래스가 있는데 그게 또 jpa로 매핑이 돼있는 경우에는, 두 클래스 중에 하나는 뭐 다른 이름을 써 줘야 되겠죠.

그러니까 jpa 가 내부적으로 그냥 구분하는 이름이라고 보시면 됩니다. 그냥 기본 값을 써야 돼요. 안 그러면 이제 너무 헷갈립니다.

그럼 만약에 이번에는 '테이블을 다른 이름을 매핑하고 싶어' 라고 할 수 있잖아요.

예를 들어서 dba가 "어 우리는 Member라고 쓰시면 안돼요. 예를 들어서 MBR이라고 쓰셔야 돼요. 축약으로 써야돼요" 하는 게 회사의 규정이면,

이렇게 하시면 됩니다. 그래서 실제 insert 쿼리 같은게 어떻게 나가냐면 insert into mbr 로 나가게 됩니다. 조회도 마찬가지고, 한번 돌려볼게요.

JpaMain 실행하면,

여기 보시면 실행된 쿼리가 from 절이 MBR 이라고 되어있죠. 이런 것처럼 매핑을 할 때 테이블 명을 바꾸고 싶으면 이걸로 하시면 되구요. 그 외에 이제 뭐 카탈로그, 스키마 등등 몇 가지를 쓸 수가 있습니다.

DB마다 좀 다르긴 한데 뭐 스키마를 구분할 수도 있고, 어떤 데이터베이스는 카탈로그라는 게 있죠.

그래서 이제 이런 것들을 하고 싶으면,

이렇게 해서 적어 두시면 됩니다. 그 다음에 뭐 unique 제약 조건들을 넣을 수도 있는데 이거는 뒤에서 자세히 설명드릴게요.

'스프링 > 자바 ORM 표준 JPA 프로그래밍 - 기본편' 카테고리의 다른 글

기본 키 매핑  (0) 2024.06.08
데이터베이스 스키마 자동 생성  (0) 2024.05.27
정리  (0) 2024.05.26
준영속 상태  (0) 2024.05.26
플러시  (0) 2024.05.26