728x90
320x100
[사용기술]
Java, Spring Boot, Spring JPA, MySQL
[만들려는 것]
책을 위한 SNS.
[오늘 하려는 것]
회원(Member) 도메인 개발 및 테스트
- 회원을 저장(회원가입)하고 회원 아이디 중복 체크를 위한 메서드와 회원 전체를 조회하는 로직까지 생성해두었음.
- 추후에 필요한 메서드들은 필요할 때 추가할 예정
MemberRepository. java
package seulgi.bookbookclub.repository;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import org.springframework.stereotype.Repository;
import seulgi.bookbookclub.domain.Member;
import java.util.List;
@Repository
public class MemberRepository {
@PersistenceContext
private EntityManager em;
public void save(Member member){
em.persist(member);
}
public List<Member> findByMemberId(String memberId) {
return em.createQuery("SELECT m FROM Member m WHERE m.memberId = :memberId", Member.class)
.setParameter("memberId", memberId)
.getResultList();
}
public List<Member> finaAll(){
return em.createQuery("select m from Member m", Member.class)
.getResultList();
}
}
- 원래 회원 아이디로 찾는 부분은 em.find(PK) 로 찾으면 간편하게 끝나긴 하는데, 이 로직은 회원가입 시에 중복 아이디 체크를 방지하기 위한 거라서 PK가 아닌 회원 아이디로 찾았어야 했음 그래서 createQuery를 사용하여 조회함.
- 나중에 PK를 통해 회원을 조회하는 기능이 필요하겠지만 그건 필요할 때 만들 예정
MemberService
package seulgi.bookbookclub.service;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import seulgi.bookbookclub.domain.Member;
import seulgi.bookbookclub.repository.MemberRepository;
import java.util.List;
@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class MemberService {
private final MemberRepository memberRepository;
//회원가입
@Transactional
public String join(Member member){
validateDuplicatieMember(member);
memberRepository.save(member);
return member.getMemberId();
}
//중복 아이디 체크
private void validateDuplicatieMember(Member member) {
List<Member> findMembers = memberRepository.findByMemberId(member.getMemberId());
if (!findMembers.isEmpty()) {
throw new IllegalStateException("이미 존재하는 회원입니다.");
}
}
//회원 전체 조회
public List<Member> findMembers(){
return memberRepository.finaAll();
}
//회원 조회
public List<Member> findByMemberId(String memberId){
return memberRepository.findByMemberId(memberId);
}
}
- 클래스 전체에 @Transactional(readOnly = True)를 주고 데이터 변경이 있는 메서드에만 따로 @Transactional 을 사용하는 방식으로 함.
회원 도메인 테스트
package seulgi.bookbookclub.service;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;
import seulgi.bookbookclub.domain.Member;
import seulgi.bookbookclub.repository.MemberRepository;
import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest
@Transactional
class MemberServiceTest {
@Autowired MemberService memberService;
@Autowired MemberRepository memberRepository;
@Test
void 회원가입_성공() {
// given
Member member = new Member("testId", "1234", "닉네임1");
// when
String savedId = memberService.join(member);
// then
Member foundMember = memberRepository.findByMemberId(savedId).get(0);
assertNotNull(foundMember);
assertEquals("testId", foundMember.getMemberId());
assertEquals("닉네임1", foundMember.getNickname());
}
@Test
public void 중복회원_예외() throws Exception
{
//given
Member member1 = new Member("testId", "1234", "닉네임1");
Member member2 = new Member("testId", "5678", "닉네임2");
//when
memberService.join(member1);
//then
IllegalStateException exception = assertThrows(IllegalStateException.class, () -> {
memberService.join(member2);
});
assertEquals("이미 존재하는 회원입니다.", exception.getMessage());
}
}
- 회원가입_성공()
- 회원을 저장하고 다시 저장한 아이디로 회원을 찾아와서 저장된 아이디가 조회 되는지, 두 객체의 아이디와 닉네임이 동일한지 체크하는 테스트를 진행하였음.
- 중복회원_예외()
- 똑같은 아이디를 가진 회원객체를 두개 생성하여 먼저 하나를 저장하고, 그 후에 두번째 객체를 저장하엿을 때 예외가 터지는지에 대한 테스트를 진행하였음.
테스트 성공
728x90
320x100
'💻 뚝딱뚝딱 > 북북클럽' 카테고리의 다른 글
[개발일지#005] 좋아요 도메인 개발 및 테스트 (0) | 2025.01.20 |
---|---|
[개발일지#004] 팔로우 도메인 개발 및 테스트 (0) | 2025.01.20 |
[개발일지#003] 타임라인 도메인 개발 및 테스트 (0) | 2025.01.20 |
[개발일지#001] 엔터티 설계 및 개발 (0) | 2025.01.06 |
[개발일지#000] 프로젝트 생성 (요구사항 분석, 프로젝트 생성, MySQL 연결, 개발 편의 설정 등) (0) | 2025.01.03 |