📖회원
회원 엔티티
📖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() {
Member member = this.createMember();
Long savedId = memberService.join(member);
Assert.assertEquals(member, memberService.findMember(savedId));
}
@Test
@DisplayName("중복회원 검증 테스트")
public void duplicateMember() {
Member member = this.createMember();
memberService.join(member);
try {
memberService.join(member);
} catch (IllegalStateException e) {
return;
}
Assert.fail("예외가 발생해야 함!!");
}
@Test
@DisplayName("관리자, 사용자 역할 테스트")
public void setRole() {
Member member = createMember();
member.changeRole("admin");
Long savedId = memberService.join(member);
Assert.assertEquals(member.getRole(), memberService.findMember(savedId).getRole());
}
}
- RunWith(SpringRunner.class) : 스프링과 테스트를 통합합니다.
- SpringBootTest : 스프링 부트를 띄우고 테스트를 진행합니다. 만약 이 어노테이션이 없으면 @Autowired는 모두 실패합니다.
- @Transactional : default값은 readOnly=false, 각각의 테스트를 실행할 때마다 트랜잭션을 시작하고 테스트가 끝나면 트랜잭션을 강제로 롤백합니다. (단, 테스트 케이스에서 사용될 때만 롤백합니다.)