▶ JPA : Java Persistence API
(1) ORM 프레임워크 (Object Relational Mapping) : 객체는 객체대로, 관계형 데이터베이스는 관계형 데이터베이스대로 설계
(2) 특징
1) DAO와 Database Table 의 강한 의존성 문제 해결
2) Model(자바 클래스)을 작성하면 자동으로 Table 생성
3) SQL 문장을 이용하지 않고 메소드를 호출하면 자동으로 SQL 문장 실행
(3) 장점 : 생산성 향상, 유지보수, 특정 벤더(DB)에 종속직이지 않음.
(4) Dialect
1) 각각의 데이터베이스가 제공하는 SQL 문법과 함수는 조금씩 다름
ex) MySQL → VARCHAR, INT, LIMIT, ... Oracle → VARCHAR2, NUMBER, ROWNUM, ...
2) 데이터베이스의 종류에 따라서 문법에 맞는 SQL 실행
(5) Table 생성 옵션
(6) Mapping Annotation
1) @Entity
- JPA 가 관리할 객체
- @Id 를 사용하여 데이터베이스 Primary Key와 매핑할 필드를 반드시 지정해야된다.
2) @Id
- 개발자가 Key 를 직접 생성(@Id)
- 데이터베이스가 자동으로 생성( @Id + @GeneratedValue)
(@GeneratedValue : 데이터 입력시 자동으로 순번을 생성(필수 X))
3) @Table
- Entity 와 매핑할 테이블
- 생략 시 Entity 이름을 테이블 이름으로 사용
4) @Column
- 컬럼과 관련된 속성 지정
- name, nullable, length 속성을 자주 사용
- 생략시 기본 자료형 = not null, 참조 자료형 = nullable 로 지정되며 변수명과 동일한 컬럼을 생성
(CamleCase 적용시 UnderScore 로 변경)
5) @Enumerated : 열거형 데이터
- EnumType.ORDINAL : 순서 (0, 1, 2, ...)
- EnumType.STRING : 이름 (SUN, MON, ...)
6) @Temporal : 날짜 데이터
- TemporalType.DATE : 2012-03-25
- TemporalType.TIME : 11:00:00
- TemporalType.TIMESTAMP : 2012-03-25 11:00:00
7) @Lob : 대용량 데이터 (Large Object)
- CLOB : String, char[], java.sql.CLOB
- BLOB : byte[], java.sql.BLOB
8) @Transient : 매핑되지 않는 데이터
- DB에 저장하거나 조회가 필요없는 데이터(Springboot 에서 변수를 생성하지만 데이터 속성으로 넣지 않을 것들)
ex) 비밀번호 확인, 가입 시 약관에 동의
ex) 회원가입 로직에서 비밀번호 확인 에 들어갈 데이터를 정의할 변수
9) @ModelAttribute : HTTP Body 내용과 HTTP 파라미터의 값들을 Getter, Setter, 생성자를 통해 주입하기 위해 사용
=> Primary Key 가 동일하고 다른 속성값들을 변경 후 입력하면 데이터 값이 수정된다.
▶ 연관관계
- 방향 : 단방향, 양방향
- 다중성 : 일대일(1:1), 일대다(1:n),다대다,(m:n)
- 연관관계의 주인 : 양방향일때 주인을 지정
- @JoinColumn : 외래키 지정 (생략 시 기본 설정에 의해 컬럼명 생성 =>"필드명 + 참조하는 테이블의 컬럼명"
- @ManyToOne (다대일) : 단방향
- @ManyToOne <-> @OnetoMany (다대일) - (일대다) : 양방향