AR삽질러

SpringBoot-회원관리기초(1) 본문

JAVA/SpringBoot

SpringBoot-회원관리기초(1)

아랑팡팡 2023. 3. 20. 16:06
728x90

데이터 : 회원ID, 이름

기능 : 회원 등록, 조회

 

컨트롤러(Controller) : 클라이언트의 요청을 처리하고 응답을 반환하는 역할. 웹MVC의 컨트롤러 @Controller, @RestController, @RequestMapping 등

서비스(Service) : 서비스는 비즈니스 로직을 수행하는 역할하며 핵심 비즈니스로직구현. @Service

리포지토리(Repository) : 데이터베이스와 상호작용으로 DB에 접근, 도메인 객체를 DB에 저장,관리 @Repository

도메인(Domain) : 도메인 객체는 비즈니스 로직을 포함하고 서비스(회원관리, 주문 등), 컨트롤러에서 사용. 

 

회원 도메인, 리포지토리 만들기

회원객체

package hello.hellospring.domain;

public class Member {
    // 식별자, 이름
    private Long id;
    private String name;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

 

회원 리포지토리

package hello.hellospring.repository;
import hello.hellospring.domain.Member;

import java.util.List;
import java.util.Optional;

public interface MemberRepository {
    Member save(Member member);
    Optional<Member> findById(Long id);
    Optional<Member> findByName(String name);
    List<Member> findAll();
}

Optional<Member> findById(Long id);

Optional <Member> findByName(String name); 은 MemberRepository 인터페이스에서 선언된 메서드로 id와 Name을 기준으로 Member를 찾는 기능을 수행한다.

 

메서드 반환타입 : Optional<Member> Optional은 Java8에서 추가된 클래스로 null-safe한 값을 제공하기 위해 사용된다.

메서드는 매개변수로 Long타입의 id와 String타입의 name을 받아 회원의 id와 이름으로 일치하는 회원을 조회한다.

 

구현체

package hello.hellospring.repository;
import hello.hellospring.domain.Member;
import java.util.*;

public class MemoryMemberRepository implements MemberRepository{

    // key, values
    private static final Map<Long, Member> store = new HashMap<>();
    private static long sequence = 0L;

    @Override
    public Member save(Member member) {
        member.setId(++sequence);
        store.put(member.getId(), member); //
        return member;
    }

    @Override
    public Optional<Member> findById(Long id) {
        return Optional.ofNullable(store.get(id));
    }

    @Override
    public Optional<Member> findByName(String name) {
        return store.values().stream()
                .filter(member -> member.getName().equals(name))
                .findAny();
    }

    @Override
    public List<Member> findAll() {
        return new ArrayList<>(store.values());
    }
}

3번째 MemberRepository인터페이스에서 선언된 findByName메서드를 구현하는 코드로 메서드는 매개변수로 String타입의 name을 받아 회원의 이름으로 해당 이름과 일치하는 회원을 조회한다.

이때 매서드 내부에서 HashMap을 이용하여 저장된 Member데이터를 검색한다. Name이 일치하는 회원을 찾으면 Optional객체에 담아서 반환한다.

 

회원 리포지토리 테스트 케이스 구현

package hello.hellospring.repository;

import hello.hellospring.domain.Member;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;

import java.util.List;
import java.util.Optional;

public class MemoryMemberRepositoryTest {
    MemoryMemberRepository repository = new MemoryMemberRepository();

    // Data clear
    @AfterEach
    public void afterEach(){
        repository.clearStore();
    }

    @Test
    public void save(){
        Member member = new Member();
        member.setName("Spring");

        repository.save(member);

        Member result = repository.findById(member.getId()).get();
        Assertions.assertThat(member).isEqualTo(result);
    }

    @Test
    public void findByName(){
        Member member1 = new Member();
        member1.setName("spring1");
        repository.save(member1);

        Member member2 = new Member();
        member2.setName("spring2");
        repository.save(member2);

        Member result = repository.findByName("spring1").get();

        Assertions.assertThat(result).isEqualTo(member1);
    }

    @Test
    public void findAll(){
        Member member1 = new Member();
        member1.setName("spring1");
        repository.save(member1);

        Member member2 = new Member();
        member2.setName("spring2");
        repository.save(member2);

        List<Member> result = repository.findAll();

        Assertions.assertThat(result.size()).isEqualTo(2);
    }

}

MemberRepository 테스트하는 방법 2

1. Unit Test

 단위 테스트는 개발자가 직접 작성한 코드의 일부분을 검증하는 테스트이다.

 

2. Integration Test

 통합테스트는 실제 데이터베이스와 연동하여 테스트하는 방법이다.

 

- @Test 어노테이션은 JUnit프레임워크에서 실행된다. Member객체를 생성한 후 MemoryMemberRepository객체의 save()메서드를 호출하여 회원을 저장한다.

- 저장한 회원 id를 이용하여 findById()메서드로 회원을 조회한다.

 

- Assertions.assertThat(member).isEqualTo(result)는 assertj 라이브러리를 이용하여 저장한 회원과 조회한 회원이 일치하는지 검증한다.

- 각테스트케이스에 영향을 주지 않게 하기 위해서 @AfterEach 에노테이션을 붙여 public void afterEach()메서드를 호출해 객체의 저장소를 지워주고 다음 테스트 케이스를 실행한다.

 

 

 

 

728x90
반응형
LIST