Wisdom기록보관소
Spring Boot JPA 사용하기 - Entity ! 본문
이전에는 단순 연동하는 부분만 적어놔서 실제 사용하기에는 다른 어노테이션이나 Method생성에 많이 부족한 부분이 많았다. 이제는 활용할수 있을만큼의 조큼 더 들어가보자.
아래는 https://www.objectdb.com/api/java/jpa
JPA API Reference (JavaDoc) - Persistence, EntityManager, EntityTransaction, Query, etc.
This reference contains the API documentation (similar to JavaDoc) of the Java Persistence API (JPA) 2.0. The content is derived from the original JPA documentation (in the EclipseLink JPA 2 RI) with some additions and notes. The four most basic JPA types
www.objectdb.com
의 내용을 정리한 것입니다.
@Entity
엔티티라고 지정해주는 어노테이션... 조금더 쉼게 이해하자면 테이블을 나타내는 모델 객체와 비슷하다고 이해하고 있습니다. 클래스에 위에 붙여서 사용하지요.
속성
name - 규정하지 않으면 기본 클래스 이름이고 쿼리에서 엔티티를 나타네는데 사용. ( 이라고 나와있는데 테이블명과 다른건지 확인 필요.)
@Table
name - DB에 생성될 table 이름! ( 없을시 위의 Entity의 name 값을 기본값으로 사용한다.
@Id - table의 primary key 설정
@Column - 컬럼의 스키마 설정.
- name - 컬럼명 설정 ( default 값은 변수명이다. java클래스 변수명과 DB Table 컬럼명이 다를때! 사용)
- nullable - Null 가능 여부
- length - 컬럼 데이터 크기
- insertable - 자동으로 생성되는 생성자에서 제외 여부 ( false 시에 제외됨 )... (으로 추축)
- updateable - 위와 비슷하게 update시에 제외 여부
@GenrateValue - 기본 키값을 생성하는 방법을 지정!
- strategy
GeneratedType 값들
-TABLE : 키 생성 전용테이블을 만들어 데이터베이스의 시퀸스처럼 사용하는 ... 거라고함...
같은 생성자는 같은 테이블을 공유하여 만드는 그런것인듯?
-IDENTITY : 기본 키 생성을 데이터 베이스에 위임! ( auto_increment 같은 기능을 사용때!)
_AUTO : DB에 따라 키 생성자를 자동으로 생성. ( Oracle의 경우 시퀀스를 자동으로 생성해주네요 )
-SEQUENCE : 데이터 베이스 시퀀스를 이용하여 생성. ( Oracle DB 같은)
이떄는 generator 파라미터에 시퀸스 명을 넣어준다.
@Transient : 비지속적으로 생성. DB에는 없고 조회시에만 만들어 오는 거 같음.
@Enumerated : Java의 열거형을 사용할때 사용하여 타입을 지정해줄때 사용.
@EmbeddedId : 복합키로 Id 정의시에 사용. ( 아직 잘모름 )
연관관계 맵핑
가장 헷갈려 했던 부분이다. 매팽시에 선언하는 이름이 어떤걸 따라가야하는건지... 이름이 중복되고 해서 ..( 그냥 잘 못따라한건가....)
예제를 통해 가즈아~!
User : 사용자 Entity
Rental : 책대여 기록하는 Entity
한명의 사용자가 여러 책을 빌려 여러기록이 남는다. -> 1:N ( 일대다 관계 )
@Entity(name = "library_user")
@Table(name = "library_user")
@Data
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(name = "userName")
private String userName;
private String password;
private String rating;
private String phone;
private String address;
private String email;
//mappedby에는 ForignKey를 가지고 있는 Entity에 맴버변수의 변수명을 넣아한다~!!!!!! 너무 해맴
@OneToMany(mappedBy = "user",cascade = CascadeType.ALL)
private List<Rental> rentalsList;
}
주석에 설명처럼 mappedBy속성에는 참조된 컬럼명이 아니라 Java클래스의 변수명을 넣어주어야한다.
DB에는 library_user라는 테이블 명으로 만들어지고 rental 관현 컬럼은 없다.
Cascade는 해당 데이터를 삭제시 연관되어있는 데이터도 같이 삭제하는 여부를 설정하는 부분으로 알고 있다.
하지만 아직 넣는 옵션에 관해서는 잘 모름..
@Entity(name = "library_rental")
@Table(name = "library_rental")
@Data
public class Rental{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
/*
Join 할 외래키로 등록이 된다. 여기서는 타입이 User이지만 다른 설정이 없으면 User의 ID를 외래키로 사용한다.
그리고 JoinColume의 name속성은 table의 컬럼명이다. 이것도 무지하게 해맴...
*/
@ManyToOne
@JoinColumn(name = "user_id")
private User user;
@ManyToOne
@JoinColumn(name = "book_id")
private Book book;
@Column(columnDefinition = "datetime" , name="rental_date")
private String rentalDate;
@Column(columnDefinition = "datetime" , name="return_date")
private String returnDate;
}
역시나 여기도 주석에 설명했듯 설정이 없으면 @id가 붙은 값으로 외래키를 설정하고 @JoinColumn은 컬럼명을 지정해주는 역활을 하고 있다. referenceColumnName으로 참조죄는 컬럼명을 지정해줄 있을 것으로 보임.
아마 속성값들로 다양한 설정이 있겠지만 지금은 생략~!
@OneToMany, @ManyToOne 을 붙여서 일대다 양방향을 만들어 주었다. 여기서 한쪽을 제거 하면 단방향이 되는데 @OneToMany 만 사용 시에는 참조되는 테이블을 하나 더 생성해서 관리하는것을 보인다.(사용해보지 않음)
위와 같이해서 DDL?로 생성시에 DB를 확인해보면 Rental( db 테이블명 lilibrary_rental )쪽에 user_id 컬럼이 외래키로 설정되어 생성된다. SQL로 JOIN그대로 실행되고 잘 되었다.
Repository는 아직 안만들었지만 단순 인터페이스에 JpaRepository만 상속하면 사용할수 있다. 조금만 쉬었다가.
DML을 사용하는 거시기를 해보자...
'Study! > SpringBoot' 카테고리의 다른 글
SpringBoot Logging을 하자!! (0) | 2021.03.15 |
---|---|
Oauth2를 이해하고 적용해보자! (0) | 2021.03.15 |
Spring Boot . Spring Security 사용하기 (0) | 2020.07.30 |
Spring Boot JPA 사용하기 (0) | 2020.07.29 |
Spring Boot Mybatis연동하기 (0) | 2020.07.27 |