JPA 상품 엔티티 설계하기

박일한·2021년 11월 26일
0

item class 생성

package는 entity, repository, service, controller로 분리해서 작성을 한다.
추가적으로 enum class는 constant package에서 관리한다.
1. entitiy package 작성
2. item class 작성
3. constant 패키지 작성
4. ItemSellStatus enum class 생성
일단 setter는 안쓸것이다.



기본적으로 생성자 전략으로 개발을 할것이다.
특이한것만 집필하면 generatedValue에서 auto로 정했는데 이건 database의 유형에 따라 시퀀스 전략으로 가져갈것인지 아이덴티티전략으로 갈것인지 해준다.
그리고 @Lob은 BLOB타입, CLOB타입이 가능하다.
그리고 Enumerated에서 string타입으로 하는 이유는 ORDINAL하면 index로 잡히는데
이때 추가되는 위치에 따라 index가 바뀔수 있기 때문에 string으로 하는것이다.
이건 aws 시리즈에도 작성해놨으니 기억좀 하자.
그리고 기본적으로 entity에서 기본생성자를 필요로 하는데 무작위 접근을 못하게 하기위해서 protected로 가져간다. 만약 new Item()을 생성하면서 오류가 난다고 생각해보자.
그리고 생성자로 생성하게끔 처리를 하였다.
그리고 하다보니 컬럼이 많아서 builder를 사용하였다.

repository 설계하기

  1. repository 패키지 작성
  2. itemRepository 생성

    기본적으로 JpaRepository의 타입은 <엔티티클래스,PK 타입> 이다.
    내부적으로 crud가 들어있으니 기본동작은 될것이다.
    이것은 이제 테스트코드로 알아보자.
    일단 테스트하기전에 application에서 h2 메모리db설정을 해야한다.

test버전의 application 작성

  1. application-test.properties작성

repository 테스트하기

인텔리제이는 ctrl + shift + t를 누르면 테스트클래스를 만들수 있다.


테스트 통과 여기서 볼것은 repository에 아무것도 없었다는것.
그리고 build 패턴을 사용했다는것 build패턴을사용하는 이유는 필요한 부분만
사용이 가능하고 어떤 부분에 무슨값이 들어가는지 식별이 가능하기 때문이다.

쿼리 메서드

쿼리 메서드는 find 문법을 많이 이용한다.
find + (엔티티 이름) + by + 변수이름
1) 이름을 찾는 쿼리 메서드를 추가한다.
List< Item> findByItemName(String itemName);

2) 테스트 코드 생성


or이나 and조건도 가능하니 테스트 해볼수있다.
주로 사용할 명령어가 and, or, is, equals, between, lessthan, lessthanequals, greaterthan, greaterthanequals, isnull 등등 너무많다..
인텔리제이에서는 자동기능완성이좋아서 어느정도 가능한지 알수 있다.

Spring Data JPA Query어노테이션

spring data jpaㅇ서 제공하는 @Query 어노테이션을 사용하면 sql과 유사한 JPQL이라는 객체지향 쿼리 언어를 사용 할 수있다.
기본 예제로 설명을 봐야겠다.
@Query("select i from item i where i.itemDetail like $:itemDetail% order by i.price desc")
List< item> findByItemDetail(@Param("itemDetail")) String itemDetail);

여기서 @Param - itemDetail 대신에 :itemDetail도 사용이 가능한데 파라미터 순서가 바뀌면 해당 쿼리문이 변경될수있기 때문에 명시적으로 작성하는게 좋다
그리고 String itemDetail 뒤에 nativeQuery = true를하면 실제 SQL문을 작성할수 있다.

Spring Data JPA QueryDsl

query 어노테이션을 보안하기 위해서 나온것이 queryDsl이다.
이유는 jpql에서 문법으로 문자열을 입력하기 때문에 컴파일 시점에 에러를 못잡을 수도 있다.

QueryDsl장점
  • 고정된 SQL문이 아닌 조건에 맞게 동적으로 쿼리를 생성
  • 비슷한 쿼리를 재사용 할 수 있으며 제약 조건 조립 및 가독성을 향상
  • 문자열이 아닌 자바 소스코드로 작성하기 때문에 컴파일 시점에 오류 발견
  • IDE의 도움을 받아서 자동완성 기능을 이용 할 수 있기 때문에 생산성 향상

QueryDsl을 사용해보자.
1. pom.xml에 라이브러리 등록


2. 의존성을 추가한다.
우측의 maven목록을 클릭 -> Reload All Maven Projects을 클릭
-> maven complie을 더블클릭한다.
빌드가 완료되면 target/generated-sources폴더에 QItem 클래스가 생성된다.

3. QItem이 import가 안될시 file -> project structure -> module에서
target폴더 아래에 generated-sources폴더를 클릭 -> sources버튼을 클릭해 소스코드로 인식할 수 있게 처리한다.
4. ItemRepositoryCustom을 생성하고 상속받는다.
5. ItemRepositoryImpl을 생성한고 custom을 상속받는다.



querydsl은 영속성 컨텍스트 안에서 돌아야되기 때문에 EntityManager를 호출하였다. 그리고 JPAQueryFactory를 이용하여 쿼리를 동적으로 생성한다.
이때에 생성자에 파리미터로 entityManager를 주입해야 사용이 가능하다.

테스트 코드의 변경은 repository의 메서드만 수정하였다.
ItemRepository를 가져가는건 naming Role이있기때문에 인식을 하는걸로 알고있다.

이번 챕터의 나의 생각

기존의 TDD와 JPA강의를 통해서 어느정도는 익숙한 상태이다. 책은 정말 기초로만 되어있어서 내가 아는한에 대한 변형을 통하여 코드를 작성하였다.
일단 JPA에서 중요한건 보안인것 같다. 불변에 대한 코드변경 OOP의 개념중 하나인
클래스는 확장에 용이하고 변경에 불가해야한다.(폐쇄적이다.)
정말 쿼리문이 자동으로 나가는것을보면 얼마나 위험한지 알것이다.

profile
긍정적인 삶을 갖자~~

0개의 댓글