You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
예전에 정파 기술인 Enterprise Java Beans 가 있었음.
서버당 수천만원의 비용을 받고 팔음.
컨테이너 기술, 설정에 의한 트렌젝션, ORM기술까지 있었음.
이론은 좋은데 너무 복잡하고, 테스트 어렵고, 코드 지저분해짐.
EJB 가 너무 어려워서, 순수한 자바로 돌아가자는 POJO(Plain Old Java Object) 라는 용어가 나옴,
EJB 프로젝트를 많이 경험한 개발자가 이를 비판하면서 만든 책으로부터 스프링이 탄생함.
크게 두가지 축이 있음.
트랜젝션, 빈컨테이너 관련 기술 -> 스프링
ORM 기술 (EJB 에선 엔티티빈) => 내가만들어도 이것보단 괜찮겠는데? 해서 만든게 하이버네이트.
하이버네이트가 먼저 만들어지고 JPA 가 정해짐.
이후 여러 구현체가 나옴.
중요한 포인트는 실무에서 활용되는 오픈소스를 기반으로 표준이 다시 만들어졌기 때문에 실무에서 필요한 부분이 잘 스며들어 있음.
많은 데이터베이스가 등장했지만, 결국 기능만 본다면 CRUD 로 동일,
이 많은 데이베이스의 기능을 인터페이스화 하자! 가 Spring Data
각 데이터베이스마다 특징에 따라 기능을 확장해서 제공하는 구현체를 제공. Spring Data JPA, Spring Data Mongo .. 등등..
데이터베이스를 잘 알고 사용해야한다.
스프링 데이터 JPA 소개2 - 기능
오늘의 주제는 Spring Data JPA
옛날엔 다 이렇게 개발함.
그런데 JDBC 템플릿, 마이바티스 등장으로
이후에 Spring + JPA등장
마지막으로 Spring Data JPA 등장
이렇게 인터페이스만 있으면 된다.
구현체는?
인터페이스를 기반으로 동적 프록시 기술이 인터페이스에 대한 구현체를 자동으로 만듦.
공통 인터페이스가 이렇게 있는데, 이것만으론 부족함.
기본적인 CRUD 제공하고, 간단한 것은 인터페이스로 만들 수 있음.
엔티티를 사용해 도메인이 중요해짐.
SQL 사용하면 이를 이해하는데 시간이 걸리는데 이 시간을 줄여줌.
도메인 중심이니 테스트를 작성하기 더 좋아짐.
손으로 치는게 줄어드는거지, 개발 장애의 90% 는 디비이기 때문에 잘 알아야한다.
주의점!
처음(JPA에 대한 이해 없이) JPA 사용시 발생하는 문제의 95% 는 잘못 사용해서 발생하는것
가장 중요한 것은 JPA 자체를 이해하는 것!
스프링 데이터 JPA 주요 기능
스프링 데이터 JPA는 JPA를 편리하게 사용할 수 있도록 도와주는 라이브러리이다.
수많은 편리한 기능을 제공하지만 가장 대표적인 기능은 다음과 같다.
공통 인터페이스 기능
쿼리 메서드 기능
- `JpaRepository` 인터페이스를 통해서 기본적인 CRUD 기능 제공한다.
- 공통화 가능한 기능이 거의 모두 포함되어 있다.
- `CrudRepository` 에서 `fineOne()` `findById()` 로변경되었다.
JpaRepository 인터페이스를 인터페이스 상속 받고, 제네릭에 관리할 <엔티티, 엔티티ID> 를 주면 된다.
그러면 JpaRepository 가 제공하는 기본 CRUD 기능을 모두 사용할 수 있다.
구현체가 필요한데, 스프링 데이터 JPA 가 동적 프록시 기술을 사용해 구현 클래스를 만들어주고 이를 스프링 빈에 등록함.
쿼리 메서드 기능.
스프링 데이터 JPA는 인터페이스에 메서드만 적어두면, 메서드 이름을 분석해서 쿼리를 자동으로 만들고 실행해주는 기능을 제공한다.
순수 JPA 리포지토리
publicList<Member> findByUsernameAndAgeGreaterThan(Stringusername, intage) {
returnem.createQuery("select m from Member m where m.username = :username and m.age > :age")
.setParameter("username", username)
.setParameter("age", age)
.getResultList();
}
publicinterfaceSpringDataJpaItemRepositoryextendsJpaRepository<Item, Long> {
//쿼리 메서드 기능List<Item> findByItemNameLike(StringitemName);
//쿼리 직접 실행 (파라미터가 너무 많아 네임이 길어질때)@Query("select i from Item i where i.itemName like :itemName and i.price <= :price")
List<Item> findItems(@Param("itemName") StringitemName, @Param("price") Integerprice);
}
쿼리 메서드 기능 대신에 직접 JPQL을 사용하고 싶을 때는 @Query 와 함께 JPQL을 작성하면 된다. 이때는 메 서드 이름으로 실행하는 규칙은 무시된다.
참고로 스프링 데이터 JPA는 JPQL 뿐만 아니라 JPA의 네이티브 쿼리 기능도 지원하는데, JPQL 대신에 SQL 을 직접 작성할 수 있다.
중요
스프링 데이터 JPA는 JPA를 편리하게 사용하도록 도와주는 도구이다. 따라서 JPA 자체를 잘 이해하는 것이 가 장 중요하다.
publicinterfaceSpringDataJpaItemRepositoryextendsJpaRepository<Item, Long> {
List<Item> findByItemNameLike(StringitemName);
List<Item> findByPriceLessThanEqual(Integerprice);
// 쿼리 메서드 (아래 메서드와 같은 기능 수행)List<Item> findByItemNameLikeAndPriceLessThanEqual(StringitemName, Integerprice);
// 쿼리 직접 실행@Query("select i from Item i where i.itemName like :itemName and i.price <= :price")
List<Item> findItems(@Param("itemName") StringitemName, @Param("price") Integerprice);
}
조건없이 검색하는건 이미 인터페이스에 있음.
스프링 데이터 JPA가 제공하는 JpaRepository 인터페이스를 인터페이스 상속 받으면 기본적인 CRUD 기능 을 사용할 수 있다.
그런데 이름으로 검색하거나, 가격으로 검색하는 기능은 공통으로 제공할 수 있는 기능이 아니다. 따라서 쿼리 메 서드 기능을 사용하거나 @Query 를 사용해서 직접 쿼리를 실행하면 된다.
여기서는 데이터를 조건에 따라 4가지로 분류해서 검색한다.
모든 데이터 조회
이름 조회
가격 조회
이름 + 가격 조회
동적 쿼리를 사용하면 좋겠지만, 스프링 데이터 JPA는 동적 쿼리에 약하다. 이번에는 직접 4가지 상황을 스프링 데이터 JPA로 구현해보자.
그리고 이 문제는 이후에 Querydsl에서 동적 쿼리로 깔끔하게 해결하겠다.
findAll()
코드에는 보이지 않지만 JpaRepository 공통 인터페이스가 제공하는 기능이다. 모든 Item 을 조회한다.
다음과 같은 JPQL이 실행된다. select i from Item i
findByItemNameLike()
이름 조건만 검색했을 때 사용하는 쿼리 메서드이다. 다음과 같은 JPQL이 실행된다. select i from Item i where i.name like ?
findByPriceLessThanEqual()
가격 조건만 검색했을 때 사용하는 쿼리 메서드이다. 다음과 같은 JPQL이 실행된다. select i from Item i where i.price <= ?
findByItemNameLikeAndPriceLessThanEqual()
이름과 가격 조건을 검색했을 때 사용하는 쿼리 메서드이다. 다음과 같은 JPQL이 실행된다. select i from Item i where i.itemName like ? and i.price <= ?
findItems()
메서드 이름으로 쿼리를 실행하는 기능은 다음과 같은 단점이 있다.
조건이 많으면 메서드 이름이 너무 길어진다.
조인같은복잡한조건을사용할수없다.
메서드 이름으로 쿼리를 실행하는 기능은 간단한 경우에는 매우 유용하지만, 복잡해지면 직접 JPQL 쿼리를 작성하는 것이 좋다.
쿼리를 직접 실행하려면 @Query 애노테이션을 사용하면 된다.
메서드 이름으로 쿼리를 실행할 때는 파라미터를 순서대로 입력하면 되지만, 쿼리를 직접 실행할 때는 파라미터를 명시적으로 바인딩 해야 한다.
파라미터 바인딩은 @Param("itemName") 애노테이션을 사용하고, 애노테이션의 값에 파라미터 이름을 주면 된다.
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
스프링 데이터 JPA 소개1 - 등장 이유
예전에 정파 기술인 Enterprise Java Beans 가 있었음.
서버당 수천만원의 비용을 받고 팔음.
컨테이너 기술, 설정에 의한 트렌젝션, ORM기술까지 있었음.
이론은 좋은데 너무 복잡하고, 테스트 어렵고, 코드 지저분해짐.
EJB 가 너무 어려워서, 순수한 자바로 돌아가자는 POJO(Plain Old Java Object) 라는 용어가 나옴,
EJB 프로젝트를 많이 경험한 개발자가 이를 비판하면서 만든 책으로부터 스프링이 탄생함.
크게 두가지 축이 있음.
하이버네이트가 먼저 만들어지고 JPA 가 정해짐.
이후 여러 구현체가 나옴.
중요한 포인트는 실무에서 활용되는 오픈소스를 기반으로 표준이 다시 만들어졌기 때문에 실무에서 필요한 부분이 잘 스며들어 있음.
많은 데이터베이스가 등장했지만, 결국 기능만 본다면 CRUD 로 동일,

이 많은 데이베이스의 기능을 인터페이스화 하자! 가 Spring Data
각 데이터베이스마다 특징에 따라 기능을 확장해서 제공하는 구현체를 제공. Spring Data JPA, Spring Data Mongo .. 등등..
데이터베이스를 잘 알고 사용해야한다.
스프링 데이터 JPA 소개2 - 기능
오늘의 주제는 Spring Data JPA
옛날엔 다 이렇게 개발함.

그런데 JDBC 템플릿, 마이바티스 등장으로
이후에 Spring + JPA등장

마지막으로 Spring Data JPA 등장

이렇게 인터페이스만 있으면 된다.

구현체는?
인터페이스를 기반으로 동적 프록시 기술이 인터페이스에 대한 구현체를 자동으로 만듦.
공통 인터페이스가 이렇게 있는데, 이것만으론 부족함.
기본적인 CRUD 제공하고, 간단한 것은 인터페이스로 만들 수 있음.
손으로 치는게 줄어드는거지, 개발 장애의 90% 는 디비이기 때문에 잘 알아야한다.
주의점!
처음(JPA에 대한 이해 없이) JPA 사용시 발생하는 문제의 95% 는 잘못 사용해서 발생하는것
가장 중요한 것은 JPA 자체를 이해하는 것!
스프링 데이터 JPA 주요 기능
스프링 데이터 JPA는 JPA를 편리하게 사용할 수 있도록 도와주는 라이브러리이다.
수많은 편리한 기능을 제공하지만 가장 대표적인 기능은 다음과 같다.
JpaRepository 사용법
JpaRepository인터페이스를 인터페이스 상속 받고, 제네릭에 관리할<엔티티, 엔티티ID>를 주면 된다.JpaRepository가 제공하는 기본 CRUD 기능을 모두 사용할 수 있다.쿼리 메서드 기능.
스프링 데이터 JPA는 인터페이스에 메서드만 적어두면, 메서드 이름을 분석해서 쿼리를 자동으로 만들고 실행해주는 기능을 제공한다.
순수 JPA 리포지토리
순수 JPA를 사용하면 직접 JPQL을 작성하고, 파라미터도 직접 바인딩 해야 한다.
스프링 데이터 JPA
스프링 데이터 JPA가 제공하는 쿼리 메소드 기능
find...By,read...By,query...By,get...ByfindHelloBy처럼 ...에 식별하기 위한 내용(설명)이 들어가도 된다.count...By반환타입longexists...By반환타입booleandelete...By,remove...By반환타입longfindDistinct,findMemberDistinctByfindFirst3,findFirst,findTop,findTop3쿼리 메소드 필터 조건
스프링 데이터 JPA 공식 문서 참고
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query- methods.query-creation https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.limit-query- result
JPQL 직접 사용하기
@Query와 함께 JPQL을 작성하면 된다. 이때는 메 서드 이름으로 실행하는 규칙은 무시된다.중요
스프링 데이터 JPA는 JPA를 편리하게 사용하도록 도와주는 도구이다. 따라서 JPA 자체를 잘 이해하는 것이 가 장 중요하다.
스프링 데이터 JPA 적용 1
이게 있으면 이미 JPA 가 들어와있음.
Spring Data JPA 적용하기
조건없이 검색하는건 이미 인터페이스에 있음.
JpaRepository인터페이스를 인터페이스 상속 받으면 기본적인 CRUD 기능 을 사용할 수 있다.@Query를 사용해서 직접 쿼리를 실행하면 된다.여기서는 데이터를 조건에 따라 4가지로 분류해서 검색한다.
동적 쿼리를 사용하면 좋겠지만, 스프링 데이터 JPA는 동적 쿼리에 약하다. 이번에는 직접 4가지 상황을 스프링 데이터 JPA로 구현해보자.
그리고 이 문제는 이후에 Querydsl에서 동적 쿼리로 깔끔하게 해결하겠다.
findAll()
코드에는 보이지 않지만
JpaRepository공통 인터페이스가 제공하는 기능이다. 모든Item을 조회한다.다음과 같은 JPQL이 실행된다.
select i from Item ifindByItemNameLike()
이름 조건만 검색했을 때 사용하는 쿼리 메서드이다. 다음과 같은 JPQL이 실행된다.
select i from Item i where i.name like ?findByPriceLessThanEqual()
가격 조건만 검색했을 때 사용하는 쿼리 메서드이다. 다음과 같은 JPQL이 실행된다.
select i from Item i where i.price <= ?findByItemNameLikeAndPriceLessThanEqual()
이름과 가격 조건을 검색했을 때 사용하는 쿼리 메서드이다. 다음과 같은 JPQL이 실행된다.
select i from Item i where i.itemName like ? and i.price <= ?findItems()
메서드 이름으로 쿼리를 실행하는 기능은 다음과 같은 단점이 있다.
메서드 이름으로 쿼리를 실행하는 기능은 간단한 경우에는 매우 유용하지만, 복잡해지면 직접 JPQL 쿼리를 작성하는 것이 좋다.
@Query애노테이션을 사용하면 된다.@Param("itemName")애노테이션을 사용하고, 애노테이션의 값에 파라미터 이름을 주면 된다.All reactions