티스토리 뷰
JPA Repository를 사용하면 SQL문 없이 CRUD를 할 수 있다!
엄청나다!
JPA는 ORM(객체 관계 매핑) 기술 표준으로, 인터페이스의 모음이다.
JAVA 어플리케이션과 JDBC 사이에서 동작하는데, 객체를 넘겨받아 엔터티 분석 후 SQL문을 작성하여, JDBC API를 통해 DB에 전달하는 역할을 한다. 알아서 SQL문을 만들어주다니 너무너무 놀랍다!
객체 구성만 알면, 데이터베이스의 구성과 일치시켜주니 직관적이고 쿼리를 분석할 필요가 없어진다.
코드 상에서는 Repository라는 인터페이스를 만들어서 사용하는데, JpaRepository를 상속하면 된다.
@Repository
public interface 이름 extends JpaRepository <엔티티 ID 유형>
그리고 Controller나 Service에서 Repository를 생성해주면 Repository가 가진 메소드를 사용할 수 있다.
findAll() 사용 시 결과는 List타입으로 반환된다.
Repository 파일 내에 아래처럼 새로운 메소드를 추가할 수 있는데, JPA가 지원하는 형식만 따라주면, DB의 컬럼명을 활용하여 마치 쿼리문을 짜는 것처럼 데이터를 주고 받을 수 있다.
List<Memo> findAllByModifiedAtBetweenOrderByModifiedAtDesc(LocalDateTime start, LocalDateTime end);
아래 주소에서 JPA의 메소드 네이밍과 규칙을 알 수 있다.
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.named-queries
Spring Data JPA - Reference Documentation
Example 109. Using @Transactional at query methods @Transactional(readOnly = true) interface UserRepository extends JpaRepository { List findByLastname(String lastname); @Modifying @Transactional @Query("delete from User u where u.active = false") void del
docs.spring.io
트랜잭션이 발생할 때는 @Transactional 어노테이션을 사용한다.
이 어노테이션이 붙은 메서드는 작업 중에 하나라도 실패할 경우 전체 작업을 취소한다. 따라서 여러 작업들을 하나의 단위로 처리하고 싶다면 @Transactional 어노테이션을 활용하면 된다.
참고로, insert 시 id가 자동으로 증가하도록 Auto Increment 옵션을 적용했다면, 이 id는 트랜잭션이 롤백되어도 다시 감소하지 않는다.
Auto Increment 옵션은 트랜잭션의 범위 밖에서 동작하기 때문이다.
여러 사람이 동시에 회원가입을 상황을 가정해보면, 양식이 틀린 경우 등 같이 트랜잭션이 실패할 수도 있는데, 다른 트랜잭션의 성공 여부를 기다렸다가 id를 부여받을 수는 없다. 이러한 동시성 때문에 별개로 동작한다.
↘︎ORM(Object-relational mapping)이란?
- 객체는 객체대로 설계하고, 관계형 데이터베이스는 관계형 데이터베이스대로 설계하는 것.
- ORM 프레임워크가 중간에서 매핑해준다.
'TIL' 카테고리의 다른 글
| [Spring Boot] Bean & Component (0) | 2022.05.23 |
|---|---|
| [WIL] 둘째주 회고 - 자바 & 스프링 공부 (0) | 2022.05.22 |
| [Spring Boot] Controller & RestController (0) | 2022.05.20 |
| 동일한 서버 환경 세팅하기 등 (0) | 2022.05.18 |
| [WIL] 첫째 주 회고 - 미니 프로젝트 & 코딩테스트 (0) | 2022.05.15 |
- Total
- Today
- Yesterday
- overfatching
- ORM
- ManyToMany
- IOC
- 스프링부트
- toCharArray
- ManyToOne
- controller
- ResetController
- GIT
- 항해99
- OneToMany
- jinja2
- 몽고db
- 배열
- clean-up policy
- 임포트
- MVC
- 제어자
- bean
- DI
- AfterEach
- 서버환경
- 자바의정석
- 패키지
- 상속
- 고민
- AssertJ
- Java
- 단항연산자
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
