회원 도메인 개발

이가현·2022년 10월 7일
0

💡 개발 순서

(회원 엔티티 코드 다시 보기) ➡️ 회원 리포지토리 개발 ➡️
회원 서비스 개발 ➡️ 회원 기능 테스트

MemberRepository

@Repository  // 스프링 빈으로 등록, JPA 예외를 스프링 기반 예외로 예외 변환
public class MemberRepository {
	@PersistenceContext  // 엔티티 메니저(EntityManager) 주입
    private EntityManager em;
  	
  	// 기능 1
    public void save(Member member) {
          em.persist(member);
	}
    // 기능 2
    public Member findOne(Long id) {
          return em.find(Member.class, id);
	}
    // 기능 3
    public List<Member> findAll() {
          return em.createQuery("select m from Member m", Member.class)
                  .getResultList();
	}
	// 기능 4
    public List<Member> findByName(String name) {
          return em.createQuery("select m from Member m where m.name = :name",
Member.class)
        	.setParameter("name", name)
			.getResultList();
      }
        
}

cf) @PersistenceUnit : 엔티티 메니터 팩토리( EntityManagerFactory ) 주입


MemberService

@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
    public class MemberService {
        private final MemberRepository memberRepository;   // 레포지토리 객체 만들기
      	
        /**
		* 회원가입 */
		@Transactional // 변경
		public Long join(Member member) {
			validateDuplicateMember(member); // 중복 회원 검증 memberRepository.save(member);
			memberRepository.save(member);
            return member.getId();
        }
      
        private void validateDuplicateMember(Member member) {
            List<Member> findMembers = memberRepository.findByName(member.getName());
            if (!findMembers.isEmpty()) {
				throw new IllegalStateException("이미 존재하는 회원입니다."); 
            }
		}
        /**
	    *전체 회원 조회
	    */
        public List<Member> findMembers() {
        	return memberRepository.findAll();
		}
        public Member findOne(Long memberId) {
        	return memberRepository.findOne(memberId);
		}
	}

@RequiredArgsConstructor : 생성자 주입
- 변경이 불가능한 안전한 객체 생성 가능

public class MemberService {
      private final MemberRepository memberRepository;  
		// final 키워드를 추가하면 컴파일 시점에 memberRepository 를 설정하지 않는 오류를 체크할 수 있다.
      public MemberService(MemberRepository memberRepository) {
          this.memberRepository = memberRepository;
	  }
        ... 
}

lombok 라이브러리가 자동완성 해주는 부분이다 !


MemberServiceTest

@RunWith(SpringRunner.class)
@SpringBootTest
@Transactional  // 테스트케이스에서 쓰일 때는, 테스트가 끝나면 강제로 롤백한다.
public class MemberServiceTest {
    @Autowired MemberService memberService;
    @Autowired MemberRepository memberRepository;
	@Test
	public void 회원가입() throws Exception {
		//Given
        Member member = new Member();
        member.setName("kim");
      
		//When
        Long saveId = memberService.join(member);
      
		//Then
        assertEquals(member, memberRepository.findOne(saveId));
    }
	@Test(expected = IllegalStateException.class)
	public void 중복_회원_예외() throws Exception {
		//Given
        Member member1 = new Member();
        member1.setName("kim");
        Member member2 = new Member();
        member2.setName("kim");
      
		//When
		memberService.join(member1);
      	memberService.join(member2);  // 예외가 발생해야 한다.
        
        //Then
        fail("예외가 발생해야 한다.");
    }
}

0개의 댓글