스프링 347

37. 트레이드 오프, SpringDataJPA 사용에 따른 구조변화

우리가 과거 SpringDataJPA를 썼을 때의 구조를 보자. 뭔가 우리가 의도했던 repository가 SpringDataJpaRepository와 어댑터 역할을 하는 꼴이 되었다. 그리고, 한눈에 보기에도 좀 복잡해 보인다. 뭐 이렇게 보면 낫긴하다. 여튼간에, 유지보수에도 비용이 든다. 예를 들어 서비스가 추상화에 의존하지 않고 바로 저 SpringDataRepository구현체를 의존한다고 생각해보자. 이게, 우리가 객체지향 SOLID 하면서 추상화에 의존하는게 좋다고 하긴 했지만, 어떤 게 나은지 진짜 곰곰히 생각해 봐야 한다. 만약 위처럼 우리가 의도한 리포지토리가 SpringDataJpaItemRepository의 어댑터 역할을 한다고 했을 때, 유지보수할 때 Service에서는 뭘 의존하..

36. Querydsl 적용

자, Querydsl을 설정하면 QItem 이라는 클래스가 자동으로 만들어 졌을 것이다. 이제 그냥 그거 쓰면 된다. 이제 쿼리는 JPA, 즉 EntityManager를 통해 간단하게 사용. Querydsl, 조건, 즉 쿼리를 동적으로 변경해야 할 경우 마치 블록 넣듯이 쿼리를 동적으로 변경하여 사용하고 싶을 떄 사용. JdbcTemplate, 위의 저런 것 보다 그냥 쿼리 한번으로 짜는 게 훨씬 깔끔할 경우, 혹은 JPA나 Querydsl로 해결하지 못한 경우 이렇게 3가지 경우로 쓴다. 주는 JPA, Querydsl을 쓰다가, (이 중에서도 주는 JPA이고 동적으로 쿼리를 만들어야 할 경우에 Querydsl) 가끔 쿼리를 직접 작성해야 할 경우 Jdbc템플릿을 쓰는 느낌이다. 일단은, 자동으로 생성된..

35. Querydsl 설정

build.gradle에 implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta" annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api" 이렇게 넣어 주고 plugins 부분에 id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" 이거 넣어주면 gradle 창에 querydsl 관련 명령어들을 추가 시킨다. 여튼 이게, 뭐 스프링 ..

34. Querydsl 등장

D : 도메인 S : 특화 L : 언어 쿼리를 특정 도메인에 특화 시킨 제한적인 표현력을 가진 프로그래밍 언어 간결, 단순, 유창 쿼리에 특화된 간결한 언어이며, 다양한 DB의 쿼리를 통합해 지원해 주는 API. 처음 시작은, 쿼리도 사실 DB에 따라 다양함. 근데 이런 쿼리를 추상화해서 통합시켜 보자. 에서 출발. (실제로 여러 DB에서 Querydsl을 쓸 수 있음) 그럼 뭐 인터페이스에, 표준화 시키고 각 DB의 쿼리에 따라 구현해 놨겠지. 쿼리를 자바코드로 쓸 수 있게. 여러 DB의 query를 type-safe하게 쿼리로 만들어 줄 수 있음.(자바코드로 만들어 줄 수 있음. 오류 있으면 뱉으면서.) 잘은 모르겠는데, type safe한 쿼리를 작성하려면 코드가 좀 필요하다고 한다. JPA같은 경..

33. Querydsl

자, 이제 동적 쿼리 문제를 해결해 줄 기술 Querydsl이다. 만약 sql이 클래스처럼 타입이 있고 자바코드로 작성할 수 있다면? 막 내가 u만 쳐도 알아서 username이 emmet 기능으로 나오고 그런다면? 그리고 타입구분이 되어서 컴파일 오류도 발생시켜 준다면? (이런 걸 type-safe 라고 함) Querydsl은 쿼리를 자바로 type-safe하게 개발할 수 있게 지원해주는 프레임 워크. 주로 JPQL에 사용. sql 문법의 오류를 잡아준다..! sql도 지원하긴 하는데, 그건 복잡해서 잘 안쓰고, 주로 JPQL에서 사용. 예를 들어, DB에서 다음과 같은 조건의 사람들을 가져오라고 할 때. 나이 : 20~40살 성 : 김씨 순서 : 나이 많은 순 3명만. @Entity public cl..

30. 스프링DataJPA 주요 기능

스프링DataJPA는 JPA를 편리하게 사용할 수 있도록 도와주는 라이브러리 대표적인 기능은 공통 인터페이스 (CRUD) 쿼리 메서드 기능 : 메서드의 이름을 통해 쿼리를 만들어 준다. 공통 인터페이스 이렇게 공통적인 CRUD와 보통 DB들이 공통적으로 가지고 있는 기술들. 스프링DataJPA의 인터페이스 이거 외에도 공통 기능들 대부분 포함. 뭐 DB의 전체 카운트 등등.. 사용법은 public interface ItemRepository extends JpaRepository{ } 하면서 인터페이스로 상속받으면 된다. 마지막 타입을 이렇게 해 놓으면 스프링DataJPA가 프록시로 구현체를 만들어 스프링 빈에 등록해 준다. 쿼리 메서드 기능. 메서드 이름을 findByUsernameAndAgeGreat..

29. 스프링 데이터 JPA 전체적인 기능

SpringDataJPA는 구현체가 아니라 인터페이스를 만든다. 그러면 또 프록시가 구현체를 만들어 준다. SpringDataJPA는 이름으로 쿼리를 자동으로 생성해준다. 예를 들어 findByEmailAndName() 이렇게 하면 select m from Member m where m.email=? and m.name=? 이렇게 email과 name findBy 는 select 이렇게 JPQL을 생성해 줌. 인터페이스에 쿼리작성도 가능하다. 메소드에 @Query("select u from User u where u.emailAddress=?" User findByEmailAddress(String emailAddress); 또, @Query(value="sql문", nativeQurey=true) 하면..

28. 스프링 데이터 JPA

원래 스프링 + JPA 조합으로 오랫동안 사용 해 왔음. 근데 어느 순간 굉장히 많은 종류의 DB가 만들어 졌음. 근데 결국, DB는 다 똑같음. 어딘가에 데이터를 저장하거나, 불러오거나 등등. 그냥 CRUD 이렇게 비슷한데, 개발자가 일일히 Mapper역할을 하며 DB마다 CRUD를 구현 해야 했다. 근데, 이럴 바에 굉장히 넓은 boundary의 추상화를 하여 인터페이스를 만들고 그걸 한번 제공해보자. 그래서, SpringData라는 공통 기술이 있고(뭐 CRUD 이런 DB마다 교집합인 공통기술일거임.) 각각의 DB마다 특징이 있는데, 그것을 SpringDataJPA, SpringDataMongo 등 그 DB의 특징에 맞춰 추가로 제공. 스프링데이터는 - CRUD + 쿼리에 대한 것도 제공 - 다른 ..