Spring Data/Spring Data JPA: 56개의 글
![](http://i1.daumcdn.net/thumb/C200x150/?fname=https://blog.kakaocdn.net/dn/KwyO4/btq2ES6xoHS/Np5eRDSq72djrpKO8zDS6k/img.png)
spring boot 환경이 아니라, 일반 springframework 환경에서 진행하였습니다. 모든 소스는 mac OS 환경에서 진행되었습니다. 이번에는 ORM을 이용한 데이터베이스 조작입니다. ORM이란 자바객체와 관계형데이터베이스의 테이블 간의 매핑을 아주 쉽게 해주는 기술입니다. 주로 mybatis만 이용하는 저였기에 이 기술을 접하고 아주 신세계...하지만 둘다 장단점이 있는 기술인 것같습니다. 아직까지는 우리나라는 mybatis를 더욱 많이 쓰고 있는 것 같기도 한데....맞나요.. project 우클릭 -> properties -> project facets -> JPA 선택. resources 밑에 영속성 관련 설정을 할 수 있는 persistence.xml이 생성되어 있을 것입니다. 요 ..
![](http://i1.daumcdn.net/thumb/C200x150/?fname=https://blog.kakaocdn.net/dn/cABTfN/btq0ZL3Eu8n/bKrn9AjKFZfp3GwjrRGMSK/img.png)
| Spring JPA Specification Spring JPA Specification은 Spring JPA에서 제공하는 검색 조건을 메서드 형태로 추상화하여 Repository 인터페이스에서 해당 검색 조건을 조합하고 쿼리하기 쉽게 할 수 있는 기능입니다. | Spring JPA Specification 예제 프로젝트 구조 +---src | +---main | | +---java | | | \---com | | | \---tutorial | | | \---springboot | | | Application.java | | | Comment.java | | | CommentRepository.java | | | CommentSpecs.java | | | | | \---resources | | | a..
![](http://i1.daumcdn.net/thumb/C200x150/?fname=https://blog.kakaocdn.net/dn/bgAG9K/btq01qLGpbA/613oaVDKJKUQ5DOeMcwI80/img.png)
| Spring JPA Projection Spring JPA에서 제공하는 Projection 기능은 엔티티의 일부 데이터만을 가져오게 하는 기능입니다. Projection은 인터페이스 기반으로 구현되며 이 인터페이스를 가지고 Repository의 반환값에 명시하면 이 정보를 토대로 JPA가 해당 쿼리를 최적화해서 가져올 수 있거나 표현식을 사용하여 DB에서 데이터를 커스터마이징하여 가져올 수 있습니다. | Spring JPA Projection 예제 프로젝트 구조 ├── src │ ├── main │ │ ├── java │ │ │ └── com │ │ │ └── tutorial │ │ │ └── springevent │ │ │ ├── Application.java │ │ │ ├── Comment.jav..
![](http://i1.daumcdn.net/thumb/C200x150/?fname=https://blog.kakaocdn.net/dn/CiwuA/btq05oslQrI/tzkkcLQDnendCXkWsLm581/img.png)
| EntityGraph란 엔티티들은 서로 연관되어 있는 관계가 보통이며 이 관계는 그래프로 표현이 가능합니다. EntityGraph는 JPA가 어떤 엔티티를 불러올 때 이 엔티티와 관계된 엔티티를 불러올 것인지에 대한 정보를 제공합니다. FetchType.LAZY 와 FetchType.EAGER로 연관 엔티티를 가져올 것인지를 결정할 수 있습니다. 하지만 이 구문은 정적이며 런타임 시 이 설정을 변경하지 못하는 단점이 있었습니다. EntityGraph는 이러한 점을 보완하고 연관 엔티티를 어떻게 로딩할 것인지에 대한 정보를 제공함으로서 엔티티 로딩 속도를 높일 수 있는 장점이 있습니다. | EntityGraph 예제 프로젝트 구조 ├── src │ ├── main │ │ ├── java │ │ │ └─..
![](http://i1.daumcdn.net/thumb/C200x150/?fname=https://blog.kakaocdn.net/dn/x5BYW/btq03GUM71g/JriIw1qk8xLk0LT6Cr1V7K/img.png)
| Named Parameter @Query 어노테이션을 통해서 매개변수를 ?1, ?2 꼴과 같이 참조하는 것이 아니라 이름으로 다음과 같이 참조할 수 있습니다. @Query("SELECT p FROM Post as p where p.title = :title") List findByTitle(@Param("title") String title, Sort sort); | SpEL @Query에서 엔티티 이름을 #{#entityName}으로 변경할 수 있습니다. 이 표현식의 이점은 엔티티의 이름을 변경할 때 이 @Query 어노테이션 문을 변경하지 않고 사용할 수 있다는 점입니다. @Query("SELECT p FROM #{#entityName} as p where p.title = :title") Lis..
![](http://i1.daumcdn.net/thumb/C200x150/?fname=https://blog.kakaocdn.net/dn/bezpFt/btq01rqhdjj/facvSLkkNeoKc2MzSM42Rk/img.png)
| Spring JPA 쿼리 메서드 Spring JPA에서 DB에 쿼리를 날릴 때 사용할 수 있는 방법은 크게 3가지가 있습니다. 1. 리포지터리 메서드 2. @NamdeQuery 3. @Query [Spring Framework/Spring JPA] - [Spring JPA #13] 스프링 데이터 쿼리 만들기 | Spring JPA 쿼리 메서드 예제 Repository 인터페이스에 메서드명으로 어떤 쿼리를 날릴 지 정할 수 있습니다. pository 인터페이스에 메서드명으로 어떤 쿼리를 날릴 지 정할 수 있습니다. public interface PostRepository extends JpaRepository { List findByTitleStartsWith(String title); } "Title..
![](http://i1.daumcdn.net/thumb/C200x150/?fname=https://blog.kakaocdn.net/dn/bv3LLD/btq0ZMuKFYt/lKttjjMJScvyK2J06qaIb0/img.png)
| 스프링 데이터 JPA 엔티티 저장 상태 전이 스프링 데이터 JPA에서는 기본적으로 JpaRepository를 통해 DB와 상호작용하게 됩니다. JpaRepository는 save 메서드들 통해 DB에 엔티티 정보를 저장하게 됩니다. save 메서드는 단순히 새 엔티티를 DB에 추가하는 것이 아니고 엔티티의 상태에 따라 다른 동작방식을 보입니다. 아래의 조건에 따라 엔티티를 관리해주는 EntitiyManager는 엔티티의 상태를 추적해서 DB에 반영할지 아니면 업데이트를 할 지 결정하게 됩니다. 엔티티의 @Id를 기준으로 해당 프로퍼티가 null이면 Transient 상태로 판단하고 id가 null이 아니면 Detached 상태로 판단합니다. 만일 @Id가 null일 경우 save 메서드로 엔티티를 D..
![](http://i1.daumcdn.net/thumb/C200x150/?fname=https://blog.kakaocdn.net/dn/NIswt/btq038pZqZv/zfz5DdQf21KvrholQ9p7VK/img.png)
| 스프링 데이터 HATEOAS HATEOAS에 대한 설명은 아래 링크로 대신하겠습니다. [Spring Framework/Spring boot2] - [Spring Boot #19] 스프링 부트 Spring HATEOAS | 스프링 데이터 HATEOAS 예제 프로젝트 구조 ├── src │ ├── main │ │ ├── java │ │ │ └── com │ │ │ └── tutorial │ │ │ └── springevent │ │ │ ├── Application.java │ │ │ ├── PostController.java │ │ │ ├── Post.java │ │ │ └── PostRepository.java │ │ └── resources │ │ └── application.properties │ ..
![](http://i1.daumcdn.net/thumb/C200x150/?fname=https://blog.kakaocdn.net/dn/6TYD6/btq06hzJGQs/UmgMKn7kX4sWMIj85kYOW0/img.png)
| 스프링 데이터 Pageable과 Sort 프로젝트 구조 ├── src │ ├── main │ │ ├── java │ │ │ └── com │ │ │ └── tutorial │ │ │ └── springevent │ │ │ ├── Application.java │ │ │ ├── PostController.java │ │ │ ├── Post.java │ │ │ └── PostRepository.java │ │ └── resources │ │ └── application.properties │ └── test │ └── java │ └── com │ └── tutorial │ └── springevent │ └── PostControllerTest.java 의존성 관리 org.springframework...
![](http://i1.daumcdn.net/thumb/C200x150/?fname=https://blog.kakaocdn.net/dn/lbCDk/btq03u78fwr/rqzuFdTflcEqpIy6qQUBb0/img.png)
| 스프링 데이터 DomainClassConverter 스프링에서 Converter는 컨트롤러에 사용자 요청이 오게될 때, 요청값을 다른 타입으로 변환하여 컨트롤러의 메서드에 전달하는 역할을 하는 인터페이스를 의미합니다. DomainClassConverter는 이 개념을 확장하여 어떤 사용자 요청에 대한 요청값을 도메인 클래스로 변환하여 컨트롤러의 메서드에 전달하는 Converter를 의미합니다. | 스프링 데이터 DomainClassConverter 예제 프로젝트 구조 ├── src │ ├── main │ │ ├── java │ │ │ └── com │ │ │ └── tutorial │ │ │ └── springevent │ │ │ ├── Application.java │ │ │ ├── PostCont..