카테고리 없음

[내일배움캠프] 1월 27일 금요일 TIL 회고록

tft4rollz 2023. 1. 27. 21:29

오늘도 인프런에서 강의를 들었다.

 

service 패키지를 만들고, MemberService 클래스를 만들었다.

MemberRepository를 사용을 해야하므로, 의존성 주입을 해줬다.

private final MemberRepository memberRepository;

@Autowired
public MemberService(MemberRepository memberRepository) {
    this.memberRepository = memberRepository;
}

먼저 회원가입 기능을 만들었다.

private void vaildateDuplicateMember 부분을 보면

먼저 memberRepository 에서 findByName으로 member.getName() 으로 입력된 멤버의 이름이 이미 있는지 찾고

.ifPresent로 이미 있으면 예외를 발생시켰다.

Member member를 매개변수로 받는 Long 타입 join을 만들고, 앞에서 만든 vaildateDuplicateMember 을 사용해서 

중복 회원이 있는지 검증하고, 중복 회원이 없으면 memberRepository에 저장을 시킨 후 member.getId()를 리턴시켰다.

/**
 * 회원가입
 */
public Long join(Member member) {
    // 컨트롤 + T 로 메서드 추출
    vaildateDuplicateMember(member); // 중복 회원 검증
    memberRepository.save(member);
    return member.getId();
}

private void vaildateDuplicateMember(Member member) {
    // 같은 회원이 있는 중복 회원 X
    // memberRepository에서 findByName으로 입력된 멤버의 이름이 이미 있는지 찾고
    // 그 결과는 Optinal<Member> 이니까 ifPresent 사용 가능
    memberRepository.findByName(member.getName())
            // ifPresent 로 이미 있으면 예외발생
            .ifPresent(m -> {
                throw new IllegalStateException("이미 존재하는 회원입니다.");
            });
}

그 다음 전체 회원 조회, 선택 회원 조회를 만들었다.

/**
 * 전체 회원 조회
 */
public List<Member> findMembers() {
    return memberRepository.findAll();
}

/**
 * 선택 회원 조회
 */
public Optional<Member> findOne(Long memberId) {
    return memberRepository.findById(memberId);
}

그 다음 Test 패키지에 Service 패키지를 만들고, MemberServiceTest 클래스를 만들었다.

테스트를 하기전에 MemberService와 MemberRepository 를 사용해야 해서 의존성 주입을 해줬다.

MemberService memberService;
MemoryMemberRepository memberRepository;

// 테스트 실행 전에 실행된다.
@BeforeEach
public void beforeEach() {
    // 먼저 MemoryMemberRepository를 만들고 memberRepository에 넣어놓는다.
    // 그 다음 memberService에 memberRepository를 넣어준다.
    // 그러면 MemberService에 있는 것과 같은 레포지토리가 사용이 된다.
    // 이런 것을 디펜던시 인젝션 이라고 한다. (DI)
    memberRepository = new MemoryMemberRepository();
    memberService = new MemberService(memberRepository);
}

원래 이렇게 의존성 주입을 해줬는데, new 를 사용해서 멤버서비스와 멤버레포지토리를 새로 생성하면 안좋기도 하고 메모리 소모도 있어서 BeforeEach 를 사용 해 의존성 주입을 해줬다.

BeforeEach : 각 테스트 실행 전에 호출된다. 테스트가 서로 영향이 없도록 항상 새로운 객체를 생성하고, 의존관계도 새로 맺어준다.

MemberService memberservice = new MemberService();
MemberRepository memberrepository = new MemberRepository();

 

그 다음 AfterEach 어노테이션을 사용해서 각 테스트가 끝날 때 마다 값을 비워주는 코드를 만들었다.

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

그 다음 회원가입을 테스트하는 코드를 만들었다.

테스트 코드를 만들때는 주석으로 given, when, then 을 적어서 나도 보기 편하고 상대방도 보기 편하게 만드라고 하셨다.

@Test
void 회원가입() {
    //given
    // 새로운 Member를 만들고
    Member member = new Member();
    // 이름을 hello 라고 지정한다. (만든다.)
    member.setName("spring");

    //when
    // 리턴은 저정한 id로 리턴시키기로 했으니 Long 타입 saveId를 만듬.
    Long saveId = memberService.join(member);

    //then
    // Assertions 를 불러올때 junit이 아닌 assertj 꺼를 불러와야 한다.
    // findOne에 saveId를 get으로 가져와서 가져온 값을 findMember에 넣는다.
    Member findMember = memberService.findOne(saveId).get();
    // asserThat을 사용해서 member.gatname과 findMember.getName이 같은지 확인한다.
    assertThat(member.getName()).isEqualTo(findMember.getName());
}

위에 테스트 코드는 중복된 회원이 없을 경우 테스트가 성공하는 코드라면, 이번에는 중복되는 회원이 있을 경우 테스트가 성공하는 코드를 만들었다.

람다를 사용해서 조금 어려워서 밑에 주석을 적지는 못했는데..

먼저 member1 을 만들고 이름을 spring 으로 적고, member2를 만돌고 이름을 spring으로 적었다.

member1을 회원가입 시키고(join) , IllegalStateException e = assertThrows를 사용해  IllegalStateException. class 

() ->member2를 회원가입 시킨 후 assertThat 을 사용해서 e.getMessage() 와 "이미 존재하는 회원입니다" 가 같으면

테스트를 성공시키는 코드를 만들었다. 사실 이 부분은 어려워서 이해가 잘 안됐다 ㅋㅋㅋ

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

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

    //when
    memberService.join(member1);
    // 왼쪽에 자동으로 생성해 주는 단축키 : 커맨드 + 옵션 + v
    // assertThrows로
    IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));
    //then
    assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
}

그 후에 컨트롤러를 만들고 회원가입, 회원 리스트 기능을 만든 후 H2 console 을 적용하려는 것 까지 들었다.

 

오후에 선발대 강의 시간에 내가 만든 코드를 다시 조금 만져주셨다.

깃허브 코드리뷰를 봐보니 내가 만든 부분에 조언을 많이 해주셔서 다음 프로젝트때는 그 조언을 참고하면서 기능을 만들어야겠다.