ORM(Object Relational Mapping) : 객체지향 패러다임을 관계형 데이터베이스에 보존하는 기술
관계형 데이터 베이스를 다루는 입장에서 클래스는 아니지만 새로운 테이블에 칼럼을 정의하고 칼럼에 맞는 데이터 타입을 지정해서 데이터를 보관한다는 틀을 만든다는 의미에서 클래스와 상당히 유사하다는 점을 기반
즉, ORM은 '객체지향'과 '관계형' 사이의 변환 기법을 의미
JPA(Java Persistence API) : ORM을 Java 언어에 맞게 사용하는 '스펙'
위의 JPA의 정의에 따라 ORM이 좀 더 상위 개념이 되고, JPA는 Java라는 언어에 국한된 개념으로 볼 수 있다. JPA는 단순한 스펙이기 때문에 해당 스펙을 구현하는 구현체마다 회사의 이름이나 프레임워크의 이름이 다르게 된다. 여러 프레임워크중 가장 유명한 것이 'Hibernate'이다.
Hibernate : JPA중 가장 유명한 프레임워크
위의 내용에 따라 스프링에서 DB까지나타내게 된다면,
Spring Data JPA <-> Hibernate <-> JDBC <-> DB 순이 된다.
Spring Data JPA가 개발에 필요한 것
- JPA를 통해서 관리하게 되는 객체를 위한 엔티티 클래스
- 엔티티 객체들을 처리하는 기능을 가진 Repository
예제)
Main > java > org.zerock.ex2 밑에 entitiy 패키지를 만들어 준 후, Memo 클래스를 정의한다
여기서 Memo 클래스는 엔티티 클래스로 마치 데이터베이스의 테이블과 같은 구조를 작성한다.
@Entity
- Spring Data JPA에서 반드시 추가해야 하는 어노테이션
- 클래스가 엔티티를 위한 클래스임을 알림
- 해당 클래스의 인스턴스들이 JPA로 관리되는 엔티티 객체라는 것을 의미
@Table
- DB상에서 엔티티 클래스를 어떠한 테이블로 생성할 것인지에 대한 정보를 담기 위한 어노테이션
- 예를들어 Table(name="t_memo")와 같이 지정할 경우 테이블의 이름이 't_memo'로 지정됨
@Id 와 @GeneratedValue
- Entity가 붙은 클래스는 PK에 해당하는 특정 필드를 @Id로 지정해야만 함
- @Id가 사용자가 입력하는 값이 없을 경우 , 자동으로 생성되는 번호를 사용하기 위해 @GeneratedValue를 사용
- @GeneratedValue(strategy = GenerationType.IDENTITY) 는 PK를 자동으로 생성하고자 할 때 사용
@Column
- 추가적인 필드(칼럼)이 필요한 경우 사용하는 어노테이션
@Getter @Builder @AllArgsConstructor @NoArgsConstructor
- Lombok의 @Getter를 이용해 Getter 메서드를 생성하고 @Builder를 이용해 객체를 생성
- @Builder 사용을 위해 @AllArgsConstructor 와 @NoArgsConstructor 같이 추가 ( 추가 안할시 컴파일 에러 )
JpaRepository 인터페이스
- JPA의 구현체인 Hibernate를 이용하기 위한 여러 API를 제공
- 예를 들어 CRUD 작업이나 페이징, 정렬 등의 처리
- Spring Data JPA는 이를 상속하는 인터페이스를 선언하는 것만으로도 모든 처리가 끝남
- 사용시 <엔티티 타입 정보와 @Id의 타입>을 지정하게 됨 ex) JpaRepository<Memo, Long> // Memo 클래스 타입
JpaRepository 상속 후 CRUD 처리
- insert 작업 : save( 엔티티 객체 )
- select 작업 : findByld( 키 타입 )
- update 작업 : save( 엔티티 객체 )
- delete 작업 : deleteByld( 키 타입 ) , delete( 엔티티 객체 )
- insert와 update는 동일하게 save()를 사용하나 메모리상에서 객체를 비교하고 없다면 insert, 존재한다면 update를 동작시키는 방식
Insert)
100개의 새로운 Memo 객체를 생성하고 MemoRepository를 이용하여 이를 insert하는 메서드 구현
Select)
findByld() 의 경우 java.util 패키지의 Optional 타입으로 반환되기 때문에 한번 더 결과가 존재하는지 체크하는 형태로 작성
Update)
수정 작업은 등록 작업과 동일하게 save()를 이용하여 처리
내부적으로 해당 엔티티의 @Id값이 일치하는지 확인하여 insert 혹은 update 작업을 처리
Delete)
삭제하려는 번호(mno)의 엔티티 객체가 있는지 확인하고, 이를 삭제
'코드로 배우는 스프링부트 웹 프로젝트' 카테고리의 다른 글
Springboot) 자동으로 처리되는 날짜/시간 설정 , JPA객체의 범위 (0) | 2021.12.02 |
---|---|
Springboot)Thymeleaf 의 사용법 (0) | 2021.11.26 |
Springboot) MVC패턴 (0) | 2021.11.26 |
Springboot) 쿼리 메서드와 @Query (0) | 2021.11.25 |
Springboot) 페이징(Pageable)/정렬(sort) 처리 (0) | 2021.11.25 |