본문 바로가기
💻 뚝딱뚝딱/북북클럽

[개발일지#002] 회원 도메인 개발 및 테스트

by 뚜루리 2025. 1. 16.
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