일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 타입 변환 string
- 문자열 대문자
- 배열
- 문자열 분리 공백
- 문자열 소문자
- 배열 요소추가
- Spring Security
- 문자열 요소
- aop
- 배열 길이
- 문자열 추가
- JPQL
- 배열 크기순
- list 최대 최소
- Postman
- N+1
- JPA
- ? 연산자
- 배열 리턴
- @Transactional
- 배열 정렬
- 문자열 알파벳
- 매개변수 배열
- 문자열 숫자로
- 숫자를 문자로
- mappedby
- pageable
- 문자열 숫자
- 토큰 자동입력
- 문자 숫자로 변환
- Today
- Total
D.DevLog
JPA 본문
JPA : Java의 ORM 기술 표준 (인터페이스)
- 대표적인 구현체로 Hibernate를 주로 사용
ORM(Object-Relational Mapping) : 객체와 관계형 DB를 자동으로 매핑하여 패러다임 불일치 문제를 해결
[ 사용법 ]
저장 코드
jpa.persist(tutor);
저장 JPA
insert into person ..., insert into tutor ...
조회 코드
Tutor tutor = jpa.find(Tutor.class, tutorId);
조회 JPA
select * from tutor t join company c on t.company_id = c.id
// 생성
jpa.persist(tutor);
// 조회
Tutor tutor = jpa.find(Tutor.class, tutorId)
// 수정
tutor.setName("수정할 이름");
// 삭제
jpa.remove(tutor);
엔티티
생명주기
1. 비영속(new/transient)
-영속성 컨텍스트가 모르는 새로운 상태
-데이터베이스와 전혀 관련이 없는 객체
2. 영속 (managed) .persist()
- 영속성 컨텍스트에 저장되고 관리되고 있는 상태
- 데이터베이스와 동기화 되는 상태
3. 준영속 (detached) .detach()/.clear()/.close()
- 영속성 컨텍스트에 저장되었다가 분리되어 더 이상 기억하지 않는 상태
4. 삭제 (removed) .remove(객체)
- 영속성 컨텍스트에 의해 삭제로 표시된 상태
- 트랜잭션이 끝나면 데이터베이스에서 제거
@Entity JPA를 사용하여 객체를 테이블과 매핑할 때 사용 (필수)
@Table (name="a") 속성 : name- 엔티티와 매핑할 테이블 이름 지정, catalog-데이터베이스 카탈로그 매핑, schema-데이터베이스 스키마 매핑, uniqueConstraints-DDL 생성시 유니크 제약조건 설정
<기본 키>
@Id
< hibernate.hbm2ddl.auto 자동 생성 속성 >
- application.properties 파일에 hibernate.hbm2ddl.auto=create 추가
(속성 종류)
create - 기존 테이블 삭제(DROP) 후 다시 생성
create-drop - DROP 후 CREATE 하고 종료 시점에 테이블을 삭제 (테스트 시 사용)
update - 변경된 사항만 DDL에 반영
validate - 엔티티와 테이블이 정상적으로 매핑 되었는지 확인. 실패시 예외 발생
none - 속성을 사용하지 않음
< 속성 >
@Column - DB 컬럼 매핑에 사용
name : 객체 필드와 매핑할 테이블의 컬럼 이름, 기본값 객체 필드 이름
unique : 유니크, 기본값 false
nullable : 필수 여부, 기본값 true
length : 길이
columnDefinition : DDL 생성시 데이터베이스 컬럼 정보를 직접 설정 가능
insertable : 설정된 컬럼의 insert 가능 여부, 기본값 true
updateable : 설정된 컬럼의 update 가능 여부, 기본값 true
@Table
uniqueConstraints : 유니크, 이름 직접 설정 가능
@Temporal - 날짜 타입
value :
DATE (TemporalType.DATE) / TIME(TemporalType.TIME) / TIMESTAMP(TemporalType.TIMESTAMP)
2025-01-01 / 12:00:00 / 2025-01-01 12:00:00
cf) MySQL에서 TIMESTAMP는 DATETIME
@Enumerated - enum 타입
value : enum 순서 저장(EnumType.ORDINAL) / enum 이름 저장(EnumType.STRING), 기본값 EnumType.ORDINAL
but, 실제로 사용하진 않음
@Transient - DB 컬럼과 매핑하지 않을 때 사용
@Lob - tinytext
<엔티티 간의 관계>
단방향 1:N
N쪽에 @ManyToOne 넣고 @JoinColumn(name = "조인할 컬럼명") 하고
private 클래스 클래스명;
@ManyToOne
@JoinColumn(name = "member_id")
private Member member;
양방향 연관관계의 주인
mappedBy는 JPA 양방향 연관관계 설정 시 사용되는 속성으로 두 엔티티 간의 관계에서 연관관게계의 주인이 아닌 쪽에 선언. 이를 통해 외래 키 관리 책임을 주인 엔티티에 두고 매핑이 중복되지 않도록 함
SimpleJpaRepository
Spring Data JPA의 기본 Repository 구현체
- JpaRepository 인터페이스의 기본 메서드들을 실제로 수행하는 클래스
- 사용 방법
Repository를 인터페이스로 선언 후,
JpaRepository<"@Entity 클래스", "@Id 데이터 타입"> 상속
public interface MemberRepository extends JpaRepository<Member, Long> {
}
- 내부 동작
Spring이 실행되면서 JpaRepository 인터페이스를 상속받은 인터페이스가 있다면, 해당 인터페이스의 정보를 토대로 SimpleJpaRepository를 생성하고 Bean으로 등록
인터페이스의 구현 클래스를 직접 만들지 않아도 JpaRepository의 기능 사용 가능
개발자가 직접 SimpleJpaRespository를 사용하거나 참조할 필요는 없음
- 주요 메서드
.save() : 대상 Entity를 DB 테이블에 저장
.findAll() : Entity에 해당하는 테이블의 모든 데이터를 조회
.delete() : 대상 Entity를 데이터베이스에서 삭제
Spring Data JPA Auditing
엔티티의 생성 및 수정 시간을 자동으로 관리해주는 기능
@EnableJpaAuditing - JPA Auditing 기능 활성화
@MappedSuperClass - 해당 어노테이션이 선언된 클래스를 상속받는 Entity에 공통 매핑 정보 제공
@EntityListeners(AutiditingEntityListener.class) - Entity를 DB에 적용하기 전, 커스텀 콜백을 요청할 수 있는 어노테이션
@CreateDate - 생성 시점의 날짜 자동으로 기록
@LastModifiedDate - 수정 시점의 날짜 자동으로 기록
@Temporal - 날짜 타입을 세부적으로 지원 (DATE, TIME, TIMESTAMP)
@CreatedBy - Entity 생성자의 정보를 자동으로 저장 (생성하는 주체 지정위해 AuditorAware<T>를 지정해야 함)
@LastModifiedBy - 마지막 수정자의 정보를 자동으로 저장 (생성하는 주체 지정위해 AuditorAware를 지정해야 함)
'Backend > Spring Framework' 카테고리의 다른 글
JPARepository 쿼리 기능, JPQL (0) | 2025.06.26 |
---|---|
Raw JPA 연관관계, 속성 (0) | 2025.06.26 |
H2 데이터베이스 생성 및 설치 (0) | 2025.06.24 |
Spring boot 프로젝트 세팅 (의존성) (0) | 2025.06.23 |
Spring Annotation (@Slf4j, @Controller, @RestController) (0) | 2025.05.08 |