Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
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
Archives
Today
Total
관리 메뉴

Wisdom기록보관소

Spring Boot JPA 사용하기 - Entity ! 본문

Study!/SpringBoot

Spring Boot JPA 사용하기 - Entity !

DisCat 2020. 8. 6. 16:50

이전에는 단순 연동하는 부분만 적어놔서 실제 사용하기에는 다른 어노테이션이나 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