반응형
이번 편에서는 JPA 라이브러리에서 사용하는 어노테이션에 대해 설명할 것이다. JPA에서는 어노테이션이 대부분의 작업을 수행하기 때문에 꼭 각 어노테이션이 무슨 역할을 하는지 기억해두는 것이 좋다.
ORM.DB 자동화 프레임웍
@Entity | 테이블 클래스를 정의. 지정된 VO 클래스와 동일한 이름의 테이블이 자동으로 생성되고, 이 클래스의 멤버변수와 동일한 이름과 타입의 컬럼이 생성 |
@Table(name="테이블명") | VO 클래스 이름과 다르게 테이블을 생성하고자 할때, name 속성에서 사용할 테이블 이름을 작성한다. |
@Id | primary key 지정 |
@Column(name="컬럼명",nullable=true/false) | 컬럼의 이름과 속성을 설정하는 주석 |
@Transient | 컬럼에 제외하는 변수 표시. |
@PrePersist | insert 문이 실행되기 전에 실행할 메서드를 지정. ex) public void beforeCreate(){ w_date = new Date(); //현재 날짜 객체 생성 } //위와 같은 경우(sysdate)에 사용. |
* 테이블 컬럼 =/= Vo(DTO)
VO에는 추가하고 싶지만 테이블 컬럼에는 추가하고 싶지 않을 때 사용하는 방법 두가지는 아래와 같다.
1. @Transient
선택한 멤버변수는 컬럼에서 제외하겠다는 의미이다. 테이블에 추가하기 싫은 변수에 Transient 를 붙인다. Transient 어노테이션이 붙은 멤버변수는 멤버변수에는 있지만 테이블 컬럼에서는 생성되지 않는다.
2. DTO, VO로 구별해주기
JPA 에서는 테이블의 컬럼과 실제 사용하는 VO를 분리하여 작성하는 것이 좋다고 저번 포스팅에서 이야기했었다. 테이블 컬럼과 Vo의 구별을 위해 따로 사용할수도 있다.
@Entity
@Table
@Id
@Column
@Transient
@PrePersist
조인
테이블에서 사용하는 조인관계를 연결할때 사용하는 어노테이션이다. 조인을 연결하는 컬럼(현재 컬럼):조인될 컬럼이다.
@ManyToOne | 다:일 | Board 테이블에서 writer이 여러번 사용될 수 있다. |
@OneToOne | 일:일 | |
@OneToMany | 일:다 | member 테이블에서 멤버 한명이 글 여러개를 작성할 수 있다. |
@ManyToMany | 다:다 | |
@JoinColumn(name="컬럼명", nullable=true/false) | foreign key를 설정 | 조인할 entity 타입으로 선언한다. - name 은 컬럼명과 동일하게 작성한다. name은 우리쪽 누가 상대방 쪽 pk랑 조인할지 말한다. - private Mymember writer; (Mymember 테이블의 primary key 와 연결한다) |
@OnDelete = OnDeleteAction.CASCADE | on delete cacscade |
@ManyToOne //조인의 연관 방법
@JoinColumn(nullable=false) //fk설정
private MyMember writer; //MyMember : entity -> foreign key 연결
자동 할당 & 시퀀스
자동할당과 시퀀스를 만들 때 사용하는 어노테이션이다. 오라클과 SQL에서 사용하는 방법이 다르니 확인해야한다.
자동 할당 | @GeneratedValue | mysql | @GeneratedValue(strategy = GenerationType.IDENTITY) |
oracle | @GeneratedValue(strategy=GenerationType.SEQUENCE, generator-"seq_myproduct") | ||
GenerationType.IDENTITY(auto_increment) GenerationType.SEQUENCE(시퀀스로 할당) => 시퀀스로 값 할당하려면 먼저 시퀀스를 생성해야 함 | |||
값을 자동 생성해서 할당한다. | |||
시퀀스 생성 | @SequenceGenerator(name="seq_gen",sequenceName="seq_myproduct", allocationSize=1) | ||
- sequenceName(사용할 시퀀스 이름) | |||
- allocationSize(캐쉬에 담을 값의 개수) / 캐쉬: 자주 사용하는 값을 담아놓는 메모리의 일종, 캐쉬의 성능은 히트 수에 따라 결정 |
@Id
@SequenceGenerator(name="seq_gen", sequenceName="seq_memo", allocationSize=1)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="seq_memo")
private int num;
private String title;
private String content;
DAO 인터페이스
DAO는 인터페이스로 만든다. 아래 사진과 같이 JpaRepository 를 extends (상속) 받아 쓴다. 이 인터페이스의 구현은 jpa 프레임웍이 자동으로 생성한다. JpaRepository는 db 처리 메서드가 정의 되어 있다.
자동으로 지원해주는 api | save | insert, update 실행 메서드.Entity 타입의 객체를 파람으로 받고 방금 쓰기한 한 줄을 Entity 타입으로 반환한다. 파라메터 Entity의 pk값이 db에 없으면 insert를 실행, 있으면 update를 실행한다. - update 로 실행되면 모든 컬럼을 수정한다. 바꾸지 않는 값도 기존 값을 꼭 넣어줘야한다. |
findAll | 파람이 없다.전체 검색한 결과를 Entity타입을 List로 반환 | |
findById(PK).orElse(null) | pk기준으로 검색. 한줄 검색되거나 검색 안됨. 검색 안되면 예외가 발생한다. 검색된게 없으면 반환할 객체를 파라메터에 넣어줌 | |
deleteById | pk 기준 한줄 삭제 | |
DAO 필요함, pk 이외의 값으로 검색 |
findBy 컬럼명(컬럼타입) | 컬럼 기준 검색. 한줄 검색 이면 Entity를 여러줄 검색이면 ArrayList<Entity> 를 반환타입으로 지정 |
findBy컬럼명Like(컬럼타입) | like 패턴 검색 | |
findBy컬럼1And컬럼2(컬럼1타입 값1, 컬럼2타입 값2) | where 컬럼1 ==값1 and 컬럼2 ==값2 | |
findBy컬럼1Or컬럼2(컬럼1타입 값1, 컬럼2타입 값2) | where 컬럼1 ==값1 or 컬럼2 ==값2 | |
findBy컬럼LessThan(컬럼 타입 값) | where 컬럼 < 값 | |
findBy컬럼GreaterThan(컬럼 타입 값) | where 컬럼 < 값 | |
findBy컬럼Between(값1, 값2) | where 컬럼 between 값1 and 값2 | |
findBy컬럼1 OdrderBy 컬럼2 Asc/Desc(컬럼1타입 값1, 컬럼2타입 값2) | where 컬럼 1 ==값1 order by 컬럼2 desc | |
조인 컬럼으로 검색 | ArrayList findByWriter(Mymember writer); | //파라메터 타입은 컬럼 타입과 동일해야함 |
ArrayList<Data> findByTitleLike(String title);
ArrayList<Data> findByWriter(String writer);
반응형