회원서비스(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 defaultTransactional=false 이다. class전체적용이 있어도

 현재 지금의 어노테이션이 우선권을 가져 이것만 적용이 된다.

-읽기전용아닌 곳에서는 @Transactional(readOnly=true)를 하면 안된다.

 

회원가입

validateDuplicateMember(member); 중복 회원 검증 함수이름=Exception

-MemberRepository클래스에서 jpa에서 em.persist를 하면 순간에 영속성컨텍스트에 Member를 올린다.

-@GeneratedValue를 생성하면 id가 항상생성된 것을 보장한다.

 영속성 컨텍스트에 값을 넣어야 하는데 db와 매핑한 키값이 id(pk)값이 된다.

-db에 들어가지 않아도 그래서 memberid도 채워준다는 얘기

 

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;

}

 

위의 내용을 @RequiredArgsConstructorfinal 조합으로 사용할 수 있다.

*원래는 @Autowired@PersistentContext(이것도 잇어야 하지만, 생략가능하다.

스프링부트에서 있는 것으로 지원을 해주기때문(현재 버전에서 지원가능한지를 체크해야 함)

 

 

@Repository

@RequriedArgsConstructor

public class MemberRepository {

 

private final EntityManager em;

}

으로 줄일 수 있다.

 

사진

+ Recent posts