Spring/Spring Data JPA
[Spring Data JPA] 내부 동작 원리
[Spring Data JPA] 내부 동작 원리
2023.01.03Spring Data JPA 기술이 제공하는 공통 인터페이스의 구현체를 살펴보자. SimpleJpaRepository 클래스가 공통 인터페이스를 구현한다. @Repository 애너테이션이 붙어있다. 따라서 Spring의 Component Scan의 대상이 되고, 특정 계층에서 예외가 터진 경우 Spring이 다루기 쉬운 예외로 변환한다. 덕분에 구현 기술을 바꾸더라도 기존 기술에 영향을 주지 않는다. @Transaction 애너테이션도 붙어있다. 모든 데이터의 변경은 Transaction 내부에서 진행되어야 한다. Spring Data JPA는 기본으로 제공하는 기능에 모두 @Transaction 애너테이션을 붙이기 때문에 개발자가 좀 더 편하게 개발할 수 있다. 단순히 조회만 하는 작업에서 @Tran..
[Spring Data JPA] 사용자 정의 리포지토리와 확장 기능
[Spring Data JPA] 사용자 정의 리포지토리와 확장 기능
2023.01.03Spring Data JPA 가 제공하는 기능을 사용하면 개발이 생산성이 증가하지만, 상황에 따라 특정 기능은 Spring Data JPA가 제공하는 방법 대신 다른 방법을 사용해야 하는 경우가 생긴다. (JPA를 직접 사용한다던가, MyBatis를 사용한다던가...) 이럴 때는 어떻게 해야 할까? Spring Data JPA는 이런 경우 Custom Repository를 사용할 수 있도록 한다. 사용자가 직접 인터페이스를 만들고, 필요한 기능을 원하는 방법으로 구현한 후 Spring Data JPA와 합치는 방식으로 문제를 해결한다. MemberRepositoryCustom에 구현하려는 기능을 선언하고, MemberRepositoryImpl에서 기능을 구현한다. (둘 다 인터페이스이다) 이후 JpaRe..
[Spring Data JPA] 벌크 연산과 EntityGraph
[Spring Data JPA] 벌크 연산과 EntityGraph
2023.01.02JPA를 공부할 때 배웠듯, 한 번에 여러 데이터들을 한 번에 수정하는 경우 벌크 연산을 사용한다. Spring Data JPA에서 벌크성 수정 쿼리를 작성할 때는 @Modifying 애너테이션이 붙는다. 벌크 연산은 영속성 컨텍스트를 무시하고 바로 데이터베이스에 쿼리를 보내기 때문에 영속성 컨텍스트로 관리되는 엔티티의 상태와 데이터베이스에 저장된 데이터가 서로 일치하지 않는 경우가 발생할 수 있다. 따라서 벌크 연산을 수행한 이후 flush와 clear함수를 실행해 영속성 컨텍스를 초기화 하는 방법을 사용하자. @Modifying(clearAutomatically = true) 로 설정하면 해당 애너테이션이 붙은 메서드가 실행된 후 영속성 컨텍스트가 자동으로 초기화된다. Spring Data JPA에서..
[Spring Data JPA] 쿼리 메서드와 페이징
[Spring Data JPA] 쿼리 메서드와 페이징
2023.01.02Spring Data JPA 기술을 사용해 회원의 이름과 나이를 기준으로 조회하는 기능을 구현한다고 생각해보자. 공통으로 제공하는 메서드가 아니기 때문에 별도로 처리해 줘야 하는데, 이 때 쿼리 메서드 기능을 사용하면 매우 편하게 처리할 수 있다. 쿼리 메서드를 사용하면 이전처럼 JPQL을 하나하나 작성하지 않아도 된다. 쿼리 메서드는 메서드의 이름을 바탕으로 JPQL을 만들어주는 기술이다. 위와 같이 메서드의 이름을 적절하게 작성하고 매개변수를 설정하면 직관적으로 어떤 JPQL이 만들어지는지 유추할 수 있따. 이 때 아무 이름이나 사용하면 안 되고, 관례가 있다. 이름에 사용되는 관례는 (https://docs.spring.io/spring-data/jpa/docs/current/reference/ht..
[Spring Data JPA] 공통 인터페이스
[Spring Data JPA] 공통 인터페이스
2023.01.02기존에는 JPA를 사용해 원하는 기능을 하나하나 작성해 줘야 했지만, Spring Data JPA기술을 사용하면 개발을 훨씬 편하게 할 수 있다. 단순하게 인터페이스를 만들고 JpaRepository 클래스를 상속받는것만으로도 Spring Data JPA의 기능을 사용할 수 있다. 그런데 구현체가 아닌 인터페이스를 사용하는데 어떻게 기능을 사용할 수 있을까? Spring Data JPA는 인터페이스를 통해 구현체를 만들고 주입해준다. 애플리케이션이 로딩될 때 개발자가 만들어놓은 인터페이스를 보고 구현 클래스를 만드는 방식으로 작동한다. (프록시) 개발자는 JpaRepository 클래스의 제네릭스만 적당히 설정해주면 Spring Data JPA의 기능을 사용할 수 있고, 인터페이스에는 @Repositor..