회원가입 기능 구현 1

루민 ·2023년 3월 30일
0

📖회원

회원 엔티티




📖MemberRepository

public interface MemberRepository extends JpaRepository<Member, Long> {


    List<Member> findByName(String name);
    Optional<Member> findByEmail(String email);
}
  • findyByName : 이름으로 회원을 찾습니다. 이름은 중복 될 수 있기 때문에 List로 설정하였습니다.
  • findByEmail : 이메일로 회원을 찾습니다. 이메일은 중복 불가 하기 때문에 중복 회원을 검증할 때 사용됩니다.



📖MemberService

@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)  //조회하는 곳에서 성능 최적화
public class MemberService {

  private final MemberRepository memberRepository;


  //회원가입
  @Transactional(readOnly = false)
  public Long join(Member member) {
      validateDuplicateMember(member);
      Member savedMember = memberRepository.save(member);
      return savedMember.getId();
  }

  //중복 회원 검증
  private void validateDuplicateMember(Member member) {
      Member findMember = memberRepository.findByEmail(member.getEmail()).orElse(null);
      if (findMember != null) {
          throw new IllegalStateException("이미 존재하는 회원입니다");
      }
  }

  public Member findMember(Long id) {
      return memberRepository.findById(id).get();
  }

  public List<Member> findMembers() {
      return memberRepository.findAll();
  }
}
  • validateDuplicateMember : 회원의 이메일로 중복 회원을 검증하는 로직입니다. 만약 회원 이메일이 중복된다면 IllegalStateException 예외를 발생시킵니다.
  • join : validateDuplicateMember로 중복 회원을 검증하고 회원을 데이터베이스에 저장시킵니다.



📖MemberServiceTest

@RunWith(SpringRunner.class)
@SpringBootTest
@Transactional
public class MemberServiceTest {

  @Autowired
  MemberRepository memberRepository;
  @Autowired
  MemberService memberService;

  private Member createMember() {
      return Member.builder()
              .name("woomin")
              .address(new Address("Incheon", "Ieum-ro", "123"))
              .email("woomin@google.com")
              .password("123")
              .build();
  }

  @Test
  @DisplayName("회원가입 테스트")
  public void join() {
      //given
      Member member = this.createMember();

      //when
      Long savedId = memberService.join(member);

      //then
      Assert.assertEquals(member, memberService.findMember(savedId));
  }

  @Test
  @DisplayName("중복회원 검증 테스트")
  public void duplicateMember() {
      //given
      Member member = this.createMember();

      //when
      memberService.join(member);
      try {
          memberService.join(member); //예외가 발생해야 함
      } catch (IllegalStateException e) {
          return;
      }

      //then
      Assert.fail("예외가 발생해야 함!!");
  }

  @Test
  @DisplayName("관리자, 사용자 역할 테스트")
  public void setRole() {
      //given
      Member member = createMember();
      member.changeRole("admin");  //관리자(판매자)

      //when
      Long savedId = memberService.join(member);

      //then
      Assert.assertEquals(member.getRole(), memberService.findMember(savedId).getRole());
  }

}
  • RunWith(SpringRunner.class) : 스프링과 테스트를 통합합니다.
  • SpringBootTest : 스프링 부트를 띄우고 테스트를 진행합니다. 만약 이 어노테이션이 없으면 @Autowired는 모두 실패합니다.
  • @Transactional : default값은 readOnly=false, 각각의 테스트를 실행할 때마다 트랜잭션을 시작하고 테스트가 끝나면 트랜잭션을 강제로 롤백합니다. (단, 테스트 케이스에서 사용될 때만 롤백합니다.)

0개의 댓글