프로젝트를 진행하던 도중
지금까지 공부해왔던 Spring이 아닌
Spring boot를 사용하게 되었다
그 과정에서 사용해오던 mybatis와는 다른 방식의 JPA를 공부해 사용해보기로 했다
JPA란?
JPA(Java Persistence API)
- Java 진영에서 ORM(Object-Relational Mapping) 기술 표준으로 사용하는 인터페이스 모음
- 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스
- 인터페이스 이기 때문에 Hibernate, OpenJPA 등이 JPA를 구현함
라고 다른 사람들이 정의 해 놓은 자료를 가져와 보았다
그렇다면 생소한 단어인 ORM이란 무엇일까??
ORM이란?
ORM(Object-Relational Mapping)
우리가 일반 적으로 알고 있는 애플리케이션 Class와 RDB(Relational DataBase)의 테이블을 매핑(연결)한다는 뜻이며, 기술적으로는 어플리케이션의 객체를 RDB 테이블에 자동으로 영속화 해주는 것이라고 보면된다.
장점
- SQL문이 아닌 Method를 통해 DB를 조작할 수 있어, 개발자는 객체 모델을 이용하여 비즈니스 로직을 구성하는데만 집중할 수 있음.
(내부적으로는 쿼리를 생성하여 DB를 조작함. 하지만 개발자가 이를 신경 쓰지 않아도됨) - Query와 같이 필요한 선언문, 할당 등의 부수적인 코드가 줄어들어, 각종 객체에 대한 코드를 별도로 작성하여 코드의 가독성을 높임
- 객체지향적인 코드 작성이 가능하다. 오직 객체지향적 접근만 고려하면 되기때문에 생산성 증가
- 매핑하는 정보가 Class로 명시 되었기 때문에 ERD를 보는 의존도를 낮출 수 있고 유지보수 및 리팩토링에 유리
- 예를들어 기존 방식에서 MySQL 데이터베이스를 사용하다가 PostgreSQL로 변환한다고 가정해보면, 새로 쿼리를 짜야하는 경우가 생김. 이런 경우에 ORM을 사용한다면 쿼리를 수정할 필요가 없음
단점
- 프로젝트의 규모가 크고 복잡하여 설계가 잘못된 경우, 속도 저하 및 일관성을 무너뜨리는 문제점이 생길 수 있음
- 복잡하고 무거운 Query는 속도를 위해 별도의 튜닝이 필요하기 때문에 결국 SQL문을 써야할 수도 있음
- 학습비용이 비쌈
간단하게 이야기 하자면
여태까지는 Mybatis를 통해서 쿼리를 매핑하여 java와 Database를 연결해서 사용해 왔다
하지만 이것은 객체지향적으로 굉장히 좋지 못한 방법이라고 한다
왜냐하면 DB에서 사용하는 개념과 JAVA에서 사용하는 개념이 다른 데 이것을 자바의 객체라는 개념에 DB의 데이터를 끼워 맞추려다보니 문제가 생긴다
하지만 ORM 기술을 사용하는 JPA를 사용한다면 그러한 문제 없이 자바 객체의 개념만으로 DB와의 연동이 가능해진다
JPA 사용법
JPA를 사용하게되면 Mybatis에서 CRUD 기능을 구현하기 위해 사용하던 create, read(select), update, delete / 통칭 CRUD 기능의 SQL문을 작성할 필요가 없어진다
이미 만들어져있는 JPA Repository를 사용해서
findById, delete, save 등을 사용하면 SQL 쿼리를 작성하지 않아도 자동으로 JPA가 쿼리를 만들어서 적용시켜서 우리가 필요한 데이터를 불러오거나 수정, 저장 삭제 작업을 진행해주게 된다
JPA 구동 방식
JPA의 구동 방식은 대부분
Controller - Entity - Repository - DB
의 형태를 뛴다
Controller에서 Repository에 DB에 쿼리를 JPA Respotiry에 만들어진 메소드를 사용해 요청한다
그러면 Repsitory는 해당 쿼리를 보고 Entity에서 빼올 데이터가 있으면 Entity를 확인 후 데이터를 가지고
DB에 쿼리를 작성해서 데이터를 가져온다
그러고 난 뒤 Controller로 조회한 데이터를 반환 혹은 쿼리를 실행하게 된다
JPA의 주요 메소드
현재 내가 알고 있는 메소드들을 위주로 정리하고자 한다
(1) findById(Object id) : JPA에서 PK로 인식 될 ID값을 넣어주면 해당 ID 값을 기준으로 모든 데이터를 가져온다
(2) findAll( ) : DB에 있는 모든 데이터를 가져온다
(3) deleteById(Object id) : JPA에서 PK로 인식 될 ID값을 넣어주면 해당 ID값의 컬럼을 모두 삭제한다
(4) delete(Entity entity) : 해당 객체에 해당 하는 모든 데이터를 삭제한다
(5) save(Entity entity) : 해당 객체의 데이터를 DB에 추가한다
이 외에도 굉장히 많은 메소드가 있고 그때그때 공부하면서 알아가도록 하자
JPA Repository
Repository 인터페이스의 모습이다
중요한 점은 interface로 만들었다는 것과 JpaRepository를 상속 받고 해당 JpaRepository에는 제네릭 < > 을 통해서 데이터가 2개 들어가 있는 것을 확인할 수 있다
제네릭의 앞 에는 사용할 Entity 객체를, 뒤에는 @Id 즉 PK로 설정되어있는 값의 데이터 타입을 넣어줌으로써 데이터를 인식 할 수 있도록 설정한다
Entity 클래스이다
@Entity 를 통해서 Entity 클래스임을 JPA Repository와 Springboot에 알리고 name 을 통해서 DB의 이름을 인식시킨다
@Entity 클래스는 기본생성자가 필요한 점에 유의하다
@Id : 해당 데이터가 DB의 기본키(PK)임을 알려준다
@GeneratedValue : 간단하게 id 값이 1씩 자동으로 생성될 때 마다 늘어난다고 생각하면 된다
@Column : 해당 데이터가 Column임을 알려준다, 길이와 Not Null 설정도 가능하다
@Builder : Builder 패턴을 활용한 어노테이션, 기본생성자가 생성될때 모든 데이터를 넣은 후 한꺼번에 생성할 수 있게 해준다고 한다
Entity 클래스에서 주목해야할 점은 보통은 lombok의 @Data 어노테이션을 활용해서 Getter, Setter, ToString 등을 한꺼번에 등록하는데
entity.builder( ) 를 통해서 기본 생성자에 데이터를 추가할 수 있게 된다
자세한 건 아래의 블로그를 참조하도록 하자
https://pamyferret.tistory.com/67
빌더 패턴(Builder pattern)을 써야하는 이유, @Builder
빌더 패턴(Builder pattern)이란? 객체를 정의하고 그 객체를 생성할 때 보통 생성자를 통해 생성하는 것을 생각한다. Bag bag = new Bag("name", 1000, "memo"); 하지만 생성자를 통해 객체를 생성하는데 몇 가
pamyferret.tistory.com
'IT 공부' 카테고리의 다른 글
10. 카카오, 구글, 페이스북 로그인 설정 (0) | 2022.07.25 |
---|---|
9. JWT 및 SpringSecurity (0) | 2022.07.21 |
7. Spring Test (0) | 2022.06.23 |
6. Spring security (0) | 2022.06.11 |
5. REST / REST API / RESTFUL (0) | 2022.06.10 |