목차

회원 도메인 개발

-구현 기능

-회원 등록

-회원 목록 조회

 

순서

-회원 엔티티 코드 다시 보기

-회원 리포지토리 개발

-회원 서비스 개발

-회원 기능 테스트

 

회원도메인개발

1. 회원엔티티 코드 다시보기

 

2. MemberRepository

사진

a.레포지터리 패키지 생성

b.MemberRepository 클래스 생성

c. @Repository 어노테이션 세팅

*스프링에서제공하는 Repository 어노테이션을 설정해주면, 

component 스캔에의해서 스프링빈으로 자동으로 관리가된다.

 

*스프링빈

-자바 객체

-스프링 컨테이너(Spring Container)에 의해서 만들어진 자바 객체를스프링 빈이라고 부른다.

-스프링 빈과 자바 일반 객체와의 차이점은 없다굳이 다른점이라고 한다면, 컨테이너에 의해 만들어졌다.

 

*스프링 컨테이너가 나오게 된 배경

A a = new A( );

A a1 = new A( );

A a2 = new A( );

각각의 객체를 생성해주도록 코드를 작성하여 메모리를 3번 낭비했었는데,

메모리를 효율적으로 관리해주고자 메모리를 1번만 낭비를 하게 하기 위해 스프링 컨테이너가 탄생했다.

스프링 컨테이너에 스프링빈을 넣어 객체를 하나만 생성하여 공통 객체역할로 이 객체를 가지고 3개의 객체를 @Autowired를 활용해 생성한다.

 

예)

@Autowired

a a;

 

@Autowired

a1 a1; 

 

@Autowired

a2 a2; 

 

 

-@PersistenceContext 설정 및 private EntityManager em;

스프링이 엔티티 매니저를 만들어서 em에 인젝션 주입을 해준다.

 

d. 조회하는로직을 작성한다.(save, find)

save

-기본 엔티티매니저 사용은 persist 영속성 컨텍스트에 멤버엔티티객체를 넣고

후에 트랜잭션이 커밋 되는 시점에 디비에 인서트쿼리가 날라가면서 반영된다.

 

find메서드 사용

-단건조회

return em.find(Member.class : 첫번째 타입, id :primary key를 넣어준다.)

 

 

e. 회원전체 로직을 작성한다.(find all)

-createQuery다음에""를타입할것. 첫번째 jpql를 사용 뒤에는 반환타입

-하기코드를합친다.

( return result;에서 단축키 ctrl + alt + n < inline all < refactor )

List<Member> result = em.createQuery("select m from Member m", Member.class) .getResultList(); return result;

 

확인

*jpqlsql 차이점

-기능적으로 동일하고 결국 sql로 번역한다.

-sqlfrom의 대상이 테이블대상으로 쿼리를 한다.

-jpqlfrom의 대상이 엔티티객체를 대상으로 쿼리를 한다. (사진에 있는 Member를 조회한다.)

 

f. parameter binding에 의해서 특정 회원만 찾는 코드

-setParameterintPosition으로설정

주문 검색 기능 개발

-JPA에서 동적 쿼리를 해결방법

 

검색기능

1. 검색 리포지터리 생성

a. OrderSearch 생성 및 정보생성

 

*OrderRepository의 하기 부분을 완성시키기 위한 검색 리포지터리 생성

public List<Order> findAll(OrderSearch orderSearch) { }

 

-파라미터의 조건이 있으면 where문으로 검색이 가능하다.

 

b. OrderRepository에서 OrderSearch 구문 작성

설명

em.createQuery~

-jpql로 작성한다.

-테이블이 아닌 객체로 표현한다. 실제적으로 보면 일반적인 sql join문으로 실행된다.

 

*JPQL이란 <출처:위키백과>

-Java Persistence Query Language

 Java Persistence API 스펙의 일부로 정의 된 플랫폼 독립적인 객체 지향 쿼리 언어

-JPQL은 관계형 데이터베이스에 저장된 엔티티에 대해 조회하는 데 사용

 

값이 다 있다는 가정하에 구문 작성_1

사진 

 

동적쿼리로 변경_2

상태도 다가져오고 네임도 가져오고 createQuery에 있는 내용만 선택을 해야되라고 한다면 동적 쿼리가 된다.

ordersearch에 네임 파라미터 가 없으면 상태값도 선택 되어 있지 않으면 주문이든 주문취소든 다가져와 라고 하려한다면 다음과 같이 작성되어야 한다.

 

사진

 

 

위의 구문을 JPA에서 동적 쿼리로 바꾸어주려면 어떻게 해야 하는가?

JPA에서 동적 쿼리를 어떻게 해결해야 하는가?

 

방법 1 jpql 문자로 무식하게 해결을 한다.

 

 

설명

단점

jpql을 문자로 생성한다는 것은 번거롭고 실수나 버그가 충분히 발생한다.

 

*mybatis를 사용하는 이유가 동적쿼리를 생성하는데 굉장히 편하다는 이점이 있다.

 

JPA Criteria 로 작성 (비권장)_2 -> 실제 포트폴리오에선 이것으로 사용함.

-jpa가 제공하는 jpql를 자바로 작성할 수 있도록 표준인 것이 있다.

 기본편에도 간단하게 설명만 하고 지나갔다.

 

장점

-build하고 나면 결과적으로 jpql이 만들어진다.

-jpql이 자바코드로 작성할 수 있게 jpa criteria가 도와준다.

-동적 쿼리 작성할 때 메리트가 있다.

 

단점

-이것만 봤을 때는 어떤 jpql이 만들어질지 감이 안잡힌다.

 

 

방법 3 QUERYdsl로 작성 (실무에서 권장)

+ Recent posts