부트캠프/코트스테이츠 백엔드 코스

32~34

태태코 2023. 4. 30. 12:39
반응형

오늘은 JPA Spring boot의 핵심기능에 대해서 정리해 보고자 한다.

기존 JDBC Spring JDBC등 Spring의 Repository역활을 하는 데이터베이스 기술들이 있지만, 요즘의 대세는 JPA기술이라고 한다.

즉 JPA는 ORM기술로 데이터베이스로 연동할때 객체를 중심으로 연동하는 기술이다. 즉 클래스를 테이블로 인식하고 연동하는 기술이다.

 

JPA의 P는 영속성을 뜻하는데 이것은 entitymanger을 통해서 확인할 수 있다.

 

ORM은 객체(Object)와 데이터베이스 테이블의 매핑을 통해 엔티티 클래스 객체 안에 포함된 정보를 테이블에 저장하는 기술입니다.

JPA에서는 테이블과 매핑되는 엔티티 객체 정보를 영속성 컨텍스트(Persistence Context)라는 곳에 보관해서 애플리케이션 내에서 오래 지속되도록 합니다.

그리고 이렇게 보관된 엔티티 정보는 데이터베이스 테이블에 데이터를 저장, 수정, 조회, 삭제하는 데 사용됩니다.

 

Persistence Context에는 1차캐시와 쓰기 지연 SQL저장소가 있다.

 

원하는 클래스를 만들고 @Entity라는 어너테이션을 붙이면 JPA기술로 인식하고 테이블로 인식하게 해준다.

하지만 @ID라는 어너테이션을 통해서 기본키를 지정해줘야 에러가 나지 않고, 기본키를 생성하는 여러가지 생성 방식이 있는데 후에 언급하겠다.

 

 em.persist(member);

이러한 코드를 통해서 member란 객체를 1차 캐시에 저장하게되고, 이에 관련된 sql문을 쓰기 지연 저장소에 저장을 해놓는다.

 tx.begin();
tx.commit();

commit명령을 하게되면 캐시에는 member라는 객체가 남아있지만 쓰기 지연 저장소에서 있는 sql 쿼리문은 사라지게 된다. 

이것이 영속성 컨텍스트의 개념이다 다양한 테스트 예제로 확인이 가능하다.

 

이제 기본 메핑에 대해 정리해보겠다

@Entity() 이렇게 아무것도 안적었을 때는 class의 이름이 테이블 명이되고

@Entity(name = "~~")를 적을경우 name이 데이터베이스의 테이블명으로 매칭된다. 더 나아가 @Table(name="")을 통해 아예 테이블 이름을 지정해 줄 수 있지만, 부가 적인 요소이다.

 

@Entity와는 @Id가 붙어서 언급되어있어야하고, Id는

 @GeneratedValue(strategy = GenerationType.SEQUENCE)

이런식으로 기본키를 생성하는 방식이고,

 @GeneratedValue(strategy = GenerationType.IDENTITY) 

등 여러가지 전략이있다.

 

@Column(length = 13, nullable = false, unique = true)

이것은 테이블 안에있는 튜플들을 관리하는 것이고 테이블의 속성값을 나타내는 것이다. 

String일 경우 varchar2와 연결되고 length는 길이를 나타내고 null유무, 값의 유일성, 업데이트 가능성 등이 속성으로 들어 갈 수 있다.

 

이제 클래스관의 관계에 대해서 말해볼건데.

ManyToOne OnetoOne OneToMany등 테이블 간의 관계를 나타내는 것을 java코드에서도 명시해 줄 수 있다.

 

@OneToMany(mappedBy = "member")

mappedBy는 외래키가 되는 클래스를 지정해준다. 여기서는 다른 클래스에 memberId가 외래키로 가기 때문에 이렇게 설정해준다.

 

@ManyToOne   // (1)
    @JoinColumn(name = "MEMBER_ID")  // (2)

memberId를 가지는 클래스는 이렇게 선언을 해준다.

 

보통 OneToMany는 양방향을 정해줄 때만 쓰고 일방적으로 연결하지는 않는다고 한다.

 

@OneToOne도 이러한 방식으로 매칭을 해주면 된다.

 

1:N N:N 1:1을 테이블로 매칭하는 방법을 알아보았다. 이렇게 연결했을 경우 실제로 Repository에서 select를 했을 경우 연관 된 테이블이 join명령어를 쓴 것 처럼 묶여서 나오게된다. 여기서 DTO를 새롭게 만들지 않았거나 @DATA라는 어너테이션을 Entity에서 언급했을 경우 무한 역참조가 생기게 되고 그것은 또 다른 어너테이션으로 끊어주어야한다. 이상~

반응형

'부트캠프 > 코트스테이츠 백엔드 코스' 카테고리의 다른 글

37(테스팅과 API document작성)  (0) 2023.05.05
35일차 회고  (0) 2023.05.01
30~31  (0) 2023.04.27
28~30회고  (0) 2023.04.16
24~27차 회고  (1) 2023.04.16