회원서비스(MemberService)
순서별로 설명
a.@Service
- @service 어노테이션에 ctrl + b로 확인을 해보면 @component가 설정이 되어 있다.
@component의 스캔의 대상이 되어서 자동으로 스프링빈으로 등록이 된다.
b.@Transactional(readOnly = true)
-class 전체적용 여기에선 읽기가 많으므로, readOnly으로 설정
-jpa의 모든 데이터변경이나 모든 로직들은 Transactional 안에서 실행 되어야 한다.
Transactional 설정으로 lazy loading이 가능해진다.
-클래스레벨의@Transacntional 사용시 public method가 적용범주 안에 속한다.
*Transactional 종류2가지 javax,
-스프링에 dependency한 로직이많아서 스프링이 제공하는
Transactional 어노테이션사용권장한다. 사용할수있는옵션들이많기 때문에
c.@Autowired
//MemberRepository 클래스를 Autowired로 스프링이 스프링빈에 등록되어 있는 MemberRepository를 인젝션해준다.
____________________________________
현재구문에 @Autowired 단점
-일단 테스트를 위해 변경을 못하고 액세스할 수 있는 방법이 없다. 그래서 setter 인젝션을 사용한다.
단점보완책
1.예시(setter injection)
@Autowired
public void setMemberRepository(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
-setter injection을 사용, 테스트할때에 memberRepository 목에 직접 입력(임의의 가짜 repository를 주입)해줄 수 있다.
-단점은, 실제 서비스실행시 누군가 바꿀 수있다.
-실제 동작하고 있는데 사실 바꿀일은 없다. 그래서 이보완책은 좋지 않다.
-스프링데이터 jpa에 의해서 다음과 같이 줄이고 보완할 수 있다.
2.최적의 보완책 예시(생성자 injection)
@RequiredArgsConstructor 와 private final MemberRepository 설정
-private final MemberRepository memberRepository 권장
-MemberService 에 값을 작성안해주면 위의 memberRepository에 빨간줄이 생긴다.
-즉, compile 시점에 한번 더 점검 할 수 있다.
*@RequiredArgsConstructor (lombok 참고)
-final에 있는 필드만 가지고 생성자를 만들어준다. 권장.
________________________________________
d.@Transactional
-@Transactional default가 Transactional=false 이다. class전체적용이 있어도
현재 지금의 어노테이션이 우선권을 가져 이것만 적용이 된다.
-읽기전용아닌 곳에서는 @Transactional에 (readOnly=true)를 하면 안된다.
회원가입
validateDuplicateMember(member); 중복 회원 검증 함수이름=Exception
-MemberRepository클래스에서 jpa에서 em.persist를 하면 순간에 영속성컨텍스트에 Member를 올린다.
-@GeneratedValue를 생성하면 id가 항상생성된 것을 보장한다.
영속성 컨텍스트에 값을 넣어야 하는데 db와 매핑한 키값이 id(pk)값이 된다.
-db에 들어가지 않아도 그래서 member의 id도 채워준다는 얘기
f.Exception(validateDuplicateMember (Member member)
List<Member> findMembers = memberRepository.findByName(member.getName());
-받아온 이름을 찾아볼 때에 반환값 설정을 findByName에서 단축키ctrl+alt+v-member이름을
유니크제약조건을 적용해주어야한다. (현재는 적용이 안되어 있음)
MemberA라는 이름으로 동시에 INSERT를 하면 같은 이름으로 가입이 가능하기 때문에
if (!findMembers.isEmpty()) {
throw new IllegalStateException("이미 존재하는 회원입니다.");
}
-member이름을 찾아(!findMembers)보고 없으면(isEmpty)이면 throw new로
이미존재하는 회원이라고 출력한다.
g.회원전체조회 작성
public List<Member> findMembers() and public Member findOne(Long memberId)
-@Transactional(readOnly=true)로 줄 경우 멤버를 찾을 때에 읽기전용으로만 사용하므로
jpa가 사용되는 곳에서는 성능을 최적화 한다. 리소스를 적게사용한다.
-읽기전용아닌 곳에서는 @Transactional에 (readOnly=true)를 하면 안된다.
변경이 안된다.
h. MemberRepository 클래스에서
-스프링부트 라이브러리, 스프링데이터 jpa의 지원으로 하기와 같이 가능해져
@Autowired
private EntityManager em;
public MemberRepository(EntityManager em) {
// Alt + Insert 키 이용해서 Generator사용
this.em = em;
}
위의 내용을 @RequiredArgsConstructor와 final 조합으로 사용할 수 있다.
*원래는 @Autowired와 @PersistentContext(이것도 잇어야 하지만, 생략가능하다.
스프링부트에서 있는 것으로 지원을 해주기때문(현재 버전에서 지원가능한지를 체크해야 함)
@Repository
@RequriedArgsConstructor
public class MemberRepository {
private final EntityManager em;
}
으로 줄일 수 있다.
사진
'신입개발자로 취업하기까지 > JPA쇼핑몰기능구축' 카테고리의 다른 글
20200601 웹계층개발_홈화면 레이아웃 (0) | 2020.07.09 |
---|---|
20200529 회원도메인개발_회원기능테스트 (0) | 2020.06.30 |
20200528 회원도메인개발 (0) | 2020.06.22 |
20200528 애플리케이션 아키텍처 (0) | 2020.06.22 |
20200527 주문기능검색개발 (0) | 2020.06.22 |