2 분 소요

[공지사항] [해당 내용은 인프런 김영한의 ‘‘스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술’’ 강의 입니다.] 강의를 듣고 이해한 내용을 바탕으로 직접 필기한 내용입니다. 인프런 : 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술



회원 관리 예제 - 백엔드 개발



회원 서비스

이제 이어서 회원 서비스를 만들어보자

회원 서비스는 회원 리포지토리와 도메인을 활용해 실제 비지니스 로직을 작성한다.

Src-> main -> java -> hello.hellospring -> service 패키지 생성 -> MemberService 클래스 생성

  • 이 코드는 MemberService 클래스의 join 메서드로, 회원가입 기능을 수행합니다.
  1. findByName 메서드를 사용하여 동일한 이름을 가진 회원이 이미 존재하는지 확인합니다.
  2. Optional을 사용하여 검색 결과가 있으면(ifPresent), 이미 존재하는 회원이라는 예외를 던집니다.
  3. 검색 결과가 없다면, save 메서드를 사용하여 회원을 저장하고 해당 회원의 ID를 반환합니다.

코드에서 Optional을 사용하는 이유는 중복 회원 여부를 확인할 때 값이 없는 경우를 명시적으로 처리하기 위함입니다.

public class MemberService {

    private final MemberRepository memberRepository = new MemoryMemberRepository();

    /**
     * 회원가입
     */
    public Long join (Member member){
        //같은 이름이 있는 중복 회원은 안된다.
        Optional<Member> result = memberRepository.findByName(member.getName());
        result.ifPresent(m -> {
            throw new IllegalStateException("이미 존재하는 회원입니다.")
        };

        memberRepository.save(member);
        return member.getId();
    }


코드의 가독성을 위해 Optional 을 통한 result를 생략할 수도 있다.

memberRepository가 반환하는 값이 Optional 이기 때문에 따로 객체 선언할 필요 없이 가능하다.

    public Long join (Member member){
        //같은 이름이 있는 중복 회원은 안된다.
        memberRepository.findByName(member.getName())
                .ifPresent(m -> {
                    throw new IllegalStateException("이미 존재하는 회원입니다.")
                    });

        memberRepository.save(member);
        return member.getId();
    }
}



MemberRepository 에 타입을 맞춰서 나머지 함수를 생성한다.

  1. findMembers 메서드:
    • memberRepositoryfindAll 메서드를 호출하여 모든 회원의 리스트를 반환합니다.
  2. findOne 메서드:
    • 특정 회원의 ID를 받아서 memberRepositoryfindById 메서드를 호출하여 해당 ID에 해당하는 회원을 Optional로 반환합니다.
    public List<Member> findMembers() {
        return memberRepository.findAll();
    }

    public Optional<Member> findOne(Long memberId) {
        return memberRepository.findById(memberId);
    }

}



회원 서비스 테스트

PART1 에서 했던 것처럼 test 클래스를 직접 생성하지 않고 편리하게 하는 방법이 있다.

  • 단축기 command + shift + T 를 누른다.

  • 원하는 메소드를 클릭하면 자동으로 만들어진다.

    image-20240214141531328



  • 테스트 코드

    • given: 테스트를 위해 필요한 초기 데이터를 생성하고 설정합니다. 이 경우 Member 객체를 생성하고 이름을 “hello”로 설정합니다.

    • when: 특정 동작을 수행합니다. 여기서는 memberService.join(member)를 호출하여 회원가입을 시도하고, 반환된 회원 ID를 saveID에 저장합니다.

    • then: 예상 결과와 실제 결과를 비교하고, 테스트를 통과할지 여부를 결정합니다. 이 경우, memberService.findOne(saveID).get()를 호출하여 저장된 회원을 찾아옵니다. 그리고 assertThat을 사용하여 저장한 멤버의 이름과 찾아온 멤버의 이름이 일치하는지 확인합니다.

@Test
void 회원가입() {
    //given
    Member member = new Member();
    member.setName("hello");

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

    //then
    Member findMember = memberService.findOne(saveID).get();
    assertThat(member.getName()).isEqualTo(findMember.getName());
}

Option + Enter를 적절히 활용하여 import , static등을 수행해야한다.



사실 join 메소드는 저장되는 것이 주요 동작이지만 예외처리가 중요하다. 위에서 정의 했던 중복 회원부분이다.

Given, when, then 문법에 따라 작성한다.

  1. given: 두 개의 Member 객체를 생성하고, 각각의 이름을 “spring”으로 설정합니다.
  2. when: 첫 번째 회원(member1)을 가입시킵니다. 그 후, 두 번째 회원(member2)을 가입시키는데, 이 때 중복된 이름(“spring”)으로 가입하려고 합니다.
  3. then: 중복된 이름으로 회원을 가입하려고 시도할 때, IllegalStateException이 발생해야 합니다. 따라서 catch 블록에서 예외를 잡고, 테스트가 성공하도록 합니다.
    @Test
    public void 중복_회원_예외() {
        //given
        Member member1 = new Member();
        member1.setName("spring");

        Member member2 = new Member();
        member2.setName(("spring"));
        
        //when
        memberService.join(member1);
        try {
            memberService.join(member2);
            fail();
        } catch (IllegalStateException e) {
            assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");


        }


  • 또다른 방법이 있다.

assertThrows 메서드를 사용합니다. 이 메서드는 지정된 예외 클래스가 발생하는지를 확인하는데, 여기서는 IllegalStateException이 발생해야 합니다. 따라서 두 번째 회원(member2)을 가입하려고 시도합니다.

memberService.join(member1);
assertThrows(IllegalStateException.class, () -> memberService.join(member2));


@Test
public void 중복_회원_예외() {
    //given
    Member member1 = new Member();
    member1.setName("spring");

    Member member2 = new Member();
    member2.setName(("spring"));

    //when
    memberService.join(member1);
    IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));

    assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");



만약 회원가입 메소드에서 Hello 가 아니라 spring 이라고 한다면, 오류가 발생한다.

@Test
void 회원가입() {
    //given
    Member member = new Member();
    member.setName("Hello");


따라서 MemoryMemberRepository에서 정의해줬던 AfterEach를 사용한다.

당연히 MemoryMemberRepository의 객체를 만들어 줘야 하기때문에 객체 선언도 포함한다.

 MemoryMemberRepository memberRepository = new MemoryMemberRepository();

@AfterEach
public void afterEach() {
    memberRepository.clearStore();

}

태그:

카테고리:

업데이트:

댓글남기기