스프링 입문 - 4 비지니스 요구사항

CodeKong의 기술 블로그·2023년 7월 5일
1

SPRING BOOT

목록 보기
4/24
post-thumbnail

컨트롤러 - 웹 MVC의 컨트롤러 역할
서비스 - 핵심 비즈니스 로직 구현
리포지토리 - 데이터베이스에 접근, 도메인 객체를 DB에 저장하고 관리
도메인 - 비즈니스 도메인 객체, 예) 회원, 주문, 쿠폰 등등 주로 데이터베이스에 저장하고 관리됨

나중에 리포지토리를 변경할 수도 있기에 interface로 선언

회원 객체 만들기

domain/Member

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;
 }
}

리포지토리 만들기

Repository/MemberRepository

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

Optional은 null을 반환할 수도 있으므로 처리할 수 있는 타입

/**
 * 동시성 문제가 고려되어 있지 않음, 실무에서는 ConcurrentHashMap, AtomicLong 사용 고려
 */

public class MemoryMemberRepository implements MemberRepository {

   private static 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 List<Member> findAll() {
      return new ArrayList<>(store.values());
   }

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

회원 레포지토리 테스트 케이스

src/test/java/MemoryMemberRepositoryTest

class MemoryMemberRepositoryTest {

    MemoryMemberRepository repository = new MemoryMemberRepository();

    @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();
        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();

        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();

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

@AfterEach는 테스트 케이스가 끝날 때마다 실행

Assertions.assertThat( 비교대상 ).isEqualTo( 비교대상 )

0개의 댓글