본문 바로가기

Spring/jpa

(12)
[spring data jpa] spring data - jpa2 Projection 엔티티의 일부 데이터만 가져올때 사용된다. 지금까진 모든 컬럼을 가져왔다. 인터페이스 기반과 클래스 기반이 있다. 인터페이스 기반 Closed 프로젝션과 Open 프로젝션으로 나눌 수 있다. Closed 프로젝션은 밑 예제처럼 한정적인 것만 가져온다. Comment 객체에서 가져올 것들만 interface 로 만든다 리턴 타입을 바꿔준다. Sql 도 최적화가 된다 . 필요한 컬럼들만 select 를 함 Open 프로젝션은 사실상 다 가져온담에 조합을해서 내가 보고싶은것만 보는것. 연산도 가능함. 하지만 쿼리 최적화 안됨 @Value 로 설정을 한다. 이렇게 쓰면 쿼리도 최적화하고 커스텀하게 연산도 가능해진다. 클래스 기반도 똑같다. 하지만 코드만 더 많아짐 Specifications ..
[spring data jpa] spring data - jpa Common 을 기반으로 만든 jpaRepository 를 봐보자 boot 를 사용하지 않으면 어노테이션을 붙여야 사용가능하다 여기서 BaseRepository 들을 설정 할 수 있다. @Repository 를 안붙여도 된다 이미 중복 JpaRepository 구현체인 SimpleJpaRepository 에 이미 @Repository 가 들어가있다. 근데 붙어있어야 좋은 이유는 빈으로 등록도 되고 예외를 DataAccessException 으로 바꿔주기 때문 Jpa : 엔티티 저장하기 Transient 상태의 객체면 EntityManager.persist() Detached 상태면 EntityManager.merge() 가 된다. Detached 인지 어떻게 판단하는지? 엔티티의 @Id 프로퍼티를 찾아서..
[spring data jpa] spring data common - web 도메인 클래스 컨버터 DomainClassConverter 스프링이 제공해주는 컨버터인데 컨버터는 하나의 타입을 다른 타입으로 변경시키는 인터페이스다. 자동으로 컨버터 레지스트리에 들어가있고 어떤 데이터를 바인딩 받아서 컨버팅 할때 사용이 된다. 여기에 볼 크게 두가지의 Converter 가 있는데 하나는 ToEntityConverter, ToIdConverter가 있다. 엔티티를 엔티티의 아이디의 타입으로 변경하는 IdConverter 엔티티의 아이디를 받아서 엔티티 타입으로 바꾸는 EntityConverter 엔티티컨버터는 레포지토리를 찾아서 FindById 를 한다. 그래서 위 findById 코드가 자동으로 일어난다. 저 두줄을 생략할수있다. 참고) Formatter와 Converter 는 아주 ..
[spring data jpa] spring data jpa - common2 도메인 이벤트 스프링 데이터가 제공하는 이벤트 퍼블리싱 기능 도메인 이벤트 퍼블리싱? 도메인 , 엔티티 클래스가 변할때 이벤트로 발생을 시켜서 이벤트를 리스닝 하는 리스너가 변화를 감지하고 어떤 이벤트 기반의 프로그래밍을 할 수 있는것 스프링에서 어플리케이션 컨텍스트가 이벤트 퍼블리셔를 상속받고 있다. ApplicationEvent 를 상속받아서 Event 를 만들었고 이렇게 이벤트를 던지면 이 이벤트 리스너에서 받아서 사용을 할 수 있다. 이런식으로 이벤트 리스너가 동작을 한다 그런데, JPA 에서 리포지토리에서 save 를 할 때 이벤트 자동 퍼블리쉬 기능을 해준다. 쌓여있던 이벤트를 save 하는 순간 다 이벤트를 퍼블리쉬한다. @DomainEvents 라는 어노테이션을 가지고 있는 메소드에서 이벤..
[spring data jpa] spring data - Common 스프링 데이터는 여러개 프로젝트들의 모음이다. 여기서 공통이 되는 Common 이 있다. 이 Common 부터 봐보자 스프링 데이터 Common Repository JpaRepository 는 스프링 데이터 Jpa 가 제공해주는 레포지토리로 PagingAndSortingRepository를 상속 받고있다. PagingAndSoringRepository 가 스프링 데이터 Common 에서 제공해준것 Paging 과 Sorting 을 할 수 있는 메소드를 제공해줌 PagingAndSorting이 상속받고 있는 CrudRepository를 봐보면 save 나 saveAll , findById, existById, findAll 등.. CRUD 관련 모든게 들어가있다. 테스트 메모리 DB 를 다운받고 테스트 코..
[spring data jpa] spring data jpa 소개 및 원리 EntityManager 를 이용하면, 이런 기능들을 할 수 가 있었다. spring JPA 가 만들어낸 획기적인 방법 이걸 사용하기 위해선 원래는 저 어노테이션을 붙여 줘야 하지만 부트에서 자동으로 붙여준다 저걸 따라가다 보면 ImportBeanDefinitionRegistar 라는 빈이 있고 여기서 부터 시작이 된다. 스프링 프레임워크의 인터페이스고 와 같은 일이 일어나면서 JPA 레지스토리들이 빈으로 등록이 된다. 핵심 개념 정리 데이터베이스와 자바 간의 연결에서 어떻게 동작을 하는지 JDBC 매개체를 통해서 근데 이 둘간에 패러다임이 안맞는 부분들이 있었다 단위의 문제라던지 관계라던지 상속관계 표현등 이런걸 ORM 이 해결해 주는 것 ORM 의 구현체인 JPA 를 살펴봤다 엔티티 맵핑, 밸류 맵핑..
[spring data jpa] jpa query Fetch 연관 관계의 정보를 지금 가져올 것인지 나중에 가져올것인지 OneToMany 일때는 미리 가져오지 않는다 얼마나 많은 데이터가 있을지도 모르고 Post 정보를 얻기 위해 그 많은걸 다 가져오면 불필요할 수 있으니 기본값이 Lazy 로 가져온다. ManyToOne 에서는 같이 가져온다 쿼리 JPQL sql과 차이점은 - db 테이블 기준이 아니라 entity 기준으로 데이터를 가져온다. 각 db에 독립적이다. db 벤더에 맞는 sql 로 변환 해서 실행이 된다. JPA2.0 이상 부터는 저렇게 TypedQuery 를 만들 수 있다. 근데 위와 같이 sql을 쓰면 타입세이프 하지 않을 수 있다. 위처럼 CriteriaBuilder 를 이용해서 타입 세이프한 쿼리를 만들 수 있다.
[spring data jpa] Entity 상태 , Cascade jpa 의 중요한 개념인 entity의 상태와 상태를 전이시키는 cascade 옵션을 봐보자 @OneToMany 나 @ManyToOne 을 보면 Cascade 를 쓸 수 있는데 이게 엔티티의 상태 변화를 연관되어있는 Account 에도 상태 변화를 알려주는것 Study 의 상태를 A에서 B로 바꿀때 Account 에도 변한 상태를 주고 싶을때 사용 Entity 의 상태는 4가지가 있다. 이렇게 만든 상태가 Transient , jpa 가 전혀 모르는 상태 이렇게 저장을 하면 이제 JPA 가 아는 상태로 바뀐다. db 에 객체가 바로 들어간건아니다 하이버네이트가 persistent 상태로 관리를 하고 있다가 이쯤되면 데이터베이스에 싱크업을 해야겟따 그 시점에 실제 데이터를 넣는것 바로 insert 쿼리가 ..