YOONJI
article thumbnail

๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ์‚ฌํ•ญ ์ •๋ฆฌ


๋ฐ์ดํ„ฐ : ํšŒ์› ID, ์ด๋ฆ„
๊ธฐ๋Šฅ : ํšŒ์› ๋“ฑ๋ก, ์กฐํšŒ
์•„์ง ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ๊ฐ€ ์„ ์ •๋˜์ง€ ์•Š์•˜๋‹ค๊ณ  ๊ฐ€์ •

์ด ๊ฐ•์˜์˜ ๋ชฉํ‘œ๋Š” ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค๋ฅผ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋‹จ์ˆœํ•œ ์˜ˆ์ œ๋ฅผ ๊ฐ€์ง€๊ณ 

์Šคํ”„๋ง ์ƒํƒœ๊ณ„ ์ „๋ฐ˜์ ์œผ๋กœ ์–ด๋–ค ์‹์œผ๋กœ ๊ฐœ๋ฐœ์ด ์ด๋ฃจ์–ด์ง€๊ณ  ๋™์ž‘ํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๋Š” ๊ฒƒ์ด๋‹ค.

๋”ฐ๋ผ์„œ ๋‹จ์ˆœํ•œ ๋น„์ฆˆ๋‹ˆ์Šค๋กœ ์„ค์ •ํ•˜์—ฌ ์ง„ํ–‰ํ•ด๋ณด๊ธฐ๋กœ ํ•œ๋‹ค.


 

# ์ผ๋ฐ˜์ ์ธ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ณ„์ธต ๊ตฌ์กฐ

์ปจํŠธ๋กค๋Ÿฌ : ์›น MVC์˜ ์ปจํŠธ๋กค๋Ÿฌ ์—ญํ• 

์„œ๋น„์Šค : ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๊ตฌํ˜„

๋ฆฌํฌ์ง€ํ† ๋ฆฌ : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผ, ๋„๋ฉ”์ธ ๊ฐ์ฒด๋ฅผ DB์— ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌ

๋„๋ฉ”์ธ : ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ ๊ฐ์ฒด, ์˜ˆ) ํšŒ์›, ์ฃผ๋ฌธ, ์ฟ ํฐ ๋“ฑ๋“ฑ ์ฃผ๋กœ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌ๋จ

 

 

# ํด๋ž˜์Šค ์˜์กด๊ด€๊ณ„

๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ๋Š” RDB, NoSQL ๋“ฑ๋“ฑ ๋‹ค์–‘ํ•œ ์ €์žฅ์†Œ๋ฅผ ๊ณ ๋ฏผ ์ค‘์ธ ์ƒํ™ฉ์œผ๋กœ ๊ฐ€์ •ํ•œ๋‹ค.

๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ดˆ๊ธฐ ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ๋Š” ๊ตฌํ˜„์ฒด๋กœ ๊ฐ€๋ฒผ์šด ๋ฉ”๋ชจ๋ฆฌ ๊ธฐ๋ฐ˜์˜ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์•„์ง ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ๊ฐ€ ์„ ์ •๋˜์ง€ ์•Š์•˜๊ธฐ์—, ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ดํ›„ DB๋ฅผ ๊ฒฐ์ •ํ•˜๋ฉด ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„ํ•œ๋‹ค.

 


์ตœ์ข… ๊ณ„์ธต ๊ตฌ์กฐ ๋ฏธ๋ฆฌ๋ณด๊ธฐ

 


ํšŒ์› ๋„๋ฉ”์ธ๊ณผ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋งŒ๋“ค๊ธฐ

 

# ํšŒ์› ๊ฐ์ฒด

java/hello/hellospring/domain/Member.java

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

 

# ํšŒ์› ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์ธํ„ฐํŽ˜์ด์Šค

java/hello/hellospring/repository/MemberRepository.java

 

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); // ID๋กœ ํšŒ์› ์ฐพ๊ธฐ

    Optional<Member> findByName(String name); // Name์œผ๋กœ ํšŒ์› ์ฐพ๊ธฐ

    List<Member> findAll(); // ์ง€๊ธˆ๊นŒ์ง€ ์ €์žฅ๋œ ๋ชจ๋“  ํšŒ์› ๋ฆฌ์ŠคํŠธ ๋ฐ˜ํ™˜
}

 

# ํšŒ์› ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌํ˜„์ฒด

java/hello/hellospring/repository/MemoryMemberRepositoryTest.java

package hello.hellospring.repository;

import hello.hellospring.domain.Member;

import java.util.*;

/**
* ๋™์‹œ์„ฑ ๋ฌธ์ œ๊ฐ€ ๊ณ ๋ ค๋˜์–ด ์žˆ์ง€ ์•Š์Œ, ์‹ค๋ฌด์—์„œ๋Š” 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); // member save ํ•  ๋•Œ sequence ๊ฐ’ ํ•˜๋‚˜์”ฉ ์˜ฌ๋ ค์„œ ์ €์žฅ
        store.put(member.getId(), member); // member Id์™€ member๋ฅผ ํ•œ ์Œ์œผ๋กœ Map์— ์ €์žฅ
        return member;
    }

    @Override
    public Optional<Member> findById(Long id) {
        return Optional.ofNullable(store.get(id)); // ofNullable์„ ํ†ตํ•ด ๋ฐ˜ํ™˜๊ฐ’์ด null์ด์–ด๋„ ํด๋ผ์ด์–ธํŠธ์—์„œ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
    }

    @Override
    public Optional<Member> findByName(String name) {
        // ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋Š” Optional๋กœ ๋ฐ˜ํ™˜๋˜๋ฉฐ, ์—†๋Š” ์ด๋ฆ„์ด๋ผ๋ฉด Optional์— null์ด ํฌํ•จ๋˜์–ด ๋ฐ˜ํ™˜
        return store.values().stream()
                .filter(member -> member.getName().equals(name)) // member์˜ ์ด๋ฆ„์ด parameter์˜ name๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธ
                .findAny(); // String์—์„œ ๊ฐ€์žฅ ๋จผ์ € ํƒ์ƒ‰๋˜๋Š” ์š”์†Œ ๋ฆฌํ„ด
    }

    @Override
    public List<Member> findAll() {
        return new ArrayList<>(store.values()); // store์˜ member๋“ค์„ ์ „๋ถ€ ๋ฐ˜ํ™˜
    }
    
    public void clearStore() {
        store.clear();
    }
}

 


ํšŒ์› ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ž‘์„ฑ 

 

๋ณดํ†ต ์šฐ๋ฆฌ๊ฐ€ ๊ฐœ๋ฐœํ•œ ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•ด์„œ ํ…Œ์ŠคํŠธ ํ•  ๋•Œ,

1. ์ž๋ฐ”์˜ Main ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜

2. ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ†ตํ•ด์„œ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•œ๋‹ค.

 

ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์€ ์ค€๋น„์™€ ์‹คํ–‰์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ณ , ๋ฐ˜๋ณต ์‹คํ–‰๊ณผ ์—ฌ๋Ÿฌ ํ…Œ์ŠคํŠธ์˜ ๋™์‹œ ์‹คํ–‰์ด ์–ด๋ ต๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

Java๋Š” JUnit์ด๋ผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค๊ณ  ๊ทธ ์ฝ”๋“œ ์ž์ฒด๋ฅผ ์‹คํ–‰ํ•ด์„œ ์œ„์™€ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค.

 

 

# ํšŒ์› ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌํ˜„์ฒด ํ…Œ์ŠคํŠธ
java/hello/hellospring/repository/MemoryMemberRepositoryTest.java

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;

import static org.assertj.core.api.Assertions.assertThat;

class MemoryMemberRepositoryTest {
    MemoryMemberRepository repository = new MemoryMemberRepository();

    // ๋ฉ”์„œ๋“œ๊ฐ€ ๋๋‚  ๋•Œ๋งˆ๋‹ค ๋™์ž‘ํ•˜๋Š” ์ฝœ๋ฐฑ ๋ฉ”์„œ๋“œ
    @AfterEach
    public void afterEach() {
    	// clear repository
        repository.clearStore();
    }

    @Test
    public void save() {
        Member member = new Member(); // ์ƒˆ๋กœ์šด member ์ƒ์„ฑ
        member.setName("spring"); // member ์ด๋ฆ„ spring์œผ๋กœ ์„ค์ •
        repository.save(member); // repository์— ์ €์žฅ

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

        // shift + F6์œผ๋กœ ๋ณ€์ˆ˜ ํŽธ๋ฆฌํ•˜๊ฒŒ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ
        Member member2 = new Member();
        member2.setName("spring2");
        repository.save(member2);

        // result์— repository์—์„œ spring1์ด๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง„ ๊ฐ์ฒด๋ฅผ ์ฐพ์•„ ์ €์žฅ (hello.hellospring.domain.Member@77f1baf5์ด ์ €์žฅ๋จ)
        Member result = repository.findByName("spring1").get();
        // result์™€ member1์ด ๊ฐ™์€์ง€ ํ™•์ธ
        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);
    }
}

 

# save() ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ

> ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค.

 

 

# findByName() ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ

 

1) member๊ฐ€ result์™€ ๊ฐ™์€ ๊ฒฝ์šฐ

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

> ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค.

 

2) member๊ฐ€ result๊ฐ€ ๋‹ค๋ฅธ ๊ฒฝ์šฐ

Member result = repository.findByName("spring2").get();
assertThat(result).isEqualTo(member1);

> result์—๋Š” spring2 ์ด๋ฆ„์„ ํ†ตํ•ด ์ฐพ์€ member2๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋Š”๋ฐ member1๊ณผ ๊ฐ™์€์ง€ ๋น„๊ตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

 

# findAll() ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ

 

1) isEqualTo๊ฐ€ 2์ธ ๊ฒฝ์šฐ

> ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค.

 

2) isEqualTo๊ฐ€ 3์ธ ๊ฒฝ์šฐ

> isEqualTo๋ฅผ 2์—์„œ 3์œผ๋กœ ๋ฐ”๊พธ๋ฉด ์œ„์™€ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

 

# Test ์‹œ ์ฃผ์˜์‚ฌํ•ญ

class ๋‹จ์œ„์—์„œ์˜ ํ…Œ์ŠคํŠธ ์ง„ํ–‰ ์‹œ findByName()์—์„œ ์ด์ „๊ณผ ๋‹ค๋ฅธ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋Š” findAll()์—์„œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ ๋’ค repository์— ์ €์žฅํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ findByName()์—์„œ ํ•œ ๋ฒˆ ๋” ๋“ฑ์žฅํ•ด์„œ

์ด์ „์— ์ €์žฅํ–ˆ๋˜ spring1์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋ถˆ๋Ÿฌ์™€์กŒ๊ธฐ์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

// ๋ฉ”์„œ๋“œ๊ฐ€ ๋๋‚  ๋•Œ๋งˆ๋‹ค ๋™์ž‘ํ•˜๋Š” ์ฝœ๋ฐฑ ๋ฉ”์„œ๋“œ
@AfterEach
public void afterEach() {
    repository.clearStore();
}

@AfterEach : ํ•œ๋ฒˆ์— ์—ฌ๋Ÿฌ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ DB์— ์ง์ „ ํ…Œ์ŠคํŠธ์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋‚จ์„ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ๋‹ค์Œ ์ด์ „ ํ…Œ์ŠคํŠธ ๋•Œ๋ฌธ์— ๋‹ค์Œ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค. @AfterEach๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ ํ…Œ์ŠคํŠธ๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ ๋งˆ๋‹ค ์ด ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ DB์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•œ๋‹ค.

๋˜ํ•œ, ํ…Œ์ŠคํŠธ๋Š” ๊ฐ๊ฐ ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰๋˜์–ด์•ผ ํ•œ๋‹ค. ํ…Œ์ŠคํŠธ ์ˆœ์„œ์— ์˜์กด๊ด€๊ณ„๊ฐ€ ์žˆ๋Š” ๊ฒƒ์€ ์ข‹์€ ํ…Œ์ŠคํŠธ๊ฐ€ ์•„๋‹ˆ๋‹ค.

 

> AfterEach ์‚ฌ์šฉ : class ๋‹จ์œ„์—์„œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์‹คํ–‰ ์‹œ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

# ๊ฐœ๋ฐœ๊ณผ ํ…Œ์ŠคํŠธ ์ˆœ์„œ

 

ํ˜„์žฌ๋Š” MemoryMemberRepository ๊ฐœ๋ฐœ ์™„๋ฃŒ ํ›„ ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค.

ํ•˜์ง€๋งŒ ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•˜๊ณ  MemoryRepository๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”๋ฐ

์ด๋ฅผ ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ(TDD)์ด๋ผ๊ณ  ํ•œ๋‹ค.

 


ํšŒ์› ์„œ๋น„์Šค ๊ฐœ๋ฐœ

 

# ํšŒ์› ์„œ๋น„์Šค ๊ฐœ๋ฐœ

java/hello/hellospring/service/MemberService.java

package hello.hellospring.service;

import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;

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

public class MemberService {

    private final MemberRepository memberRepository = new MemoryMemberRepository();

    // ํšŒ์› ๊ฐ€์ž…
    public Long join(Member member){

        validateDuplicateMember(member); // ์ค‘๋ณต ํšŒ์› ๊ฒ€์ฆ
        memberRepository.save(member);
        return member.getId();
    }

    private void validateDuplicateMember(Member member) {
        memberRepository.findByName(member.getName())
                .ifPresent(m -> { // ๊ฐ’์ด ์กด์žฌํ•œ๋‹ค๋ฉด
                    throw new IllegalStateException("์ด๋ฏธ ์กด์žฌํ•˜๋Š” ํšŒ์›์ž…๋‹ˆ๋‹ค.");
                });
    }

    // ์ „์ฒด ํšŒ์› ์กฐํšŒ
    public List<Member> findMembers() {
        return memberRepository.findAll();
    }

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

 


ํšŒ์› ์„œ๋น„์Šค ํ…Œ์ŠคํŠธ

MemberService ํด๋ž˜์Šค์—์„œ Command + Shift + T๋ฅผ ๋ˆ„๋ฅด๋ฉด ๊ฐ„ํŽธํ•˜๊ฒŒ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ƒ์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

# DI(Dependency Injection, ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…)

 

public class MemberService {
      private final MemberRepository memberRepository = new MemoryMemberRepository();
}

๊ธฐ์กด์—๋Š” ํšŒ์› ์„œ๋น„์Šค๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ํšŒ์› ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜๊ฒŒ ํ–ˆ๋‹ค.

MemberService์™€ MemberServiceTest์—์„œ new MemoryMemberRepository()๋ฅผ ๊ฐ๊ฐ ์„ ์–ธํ•ด์ฃผ๋ฉด

์„œ๋กœ ๋‹ค๋ฅธ Repository(๋‹ค๋ฅธ ๊ฐ์ฒด)๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์˜์กด๊ด€๊ณ„๋ฅผ ์ฃผ์ž…ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

 

public class MemberService {

      private final MemberRepository memberRepository;
      
      public MemberService(MemberRepository memberRepository) {
          this.memberRepository = memberRepository;
	  }
	  ...
}

-> ํšŒ์› ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ ์ฝ”๋“œ๊ฐ€ ํšŒ์› ์„œ๋น„์Šค ์ฝ”๋“œ๋ฅผ DI ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•œ๋‹ค. (Constructor ์ถ”๊ฐ€)

 

 

# given, when, then ๋ฌธ๋ฒ•

given - ๋ฌด์–ธ๊ฐ€๊ฐ€ ์ฃผ์–ด์กŒ๋Š”๋ฐ

when - ์ด๊ฑธ ์‹คํ–‰ํ–ˆ์„ ๋•Œ

then - ์ด๋Ÿฐ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™€์•ผ ํ•จ

 

 

# ํšŒ์› ์„œ๋น„์Šค ํ…Œ์ŠคํŠธ

test/java/hello/hellospring/service/MemberServiceTest.java

package hello.hellospring.service;

import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemoryMemberRepository;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import java.util.Optional;

import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
import static org.junit.jupiter.api.Assertions.*;

class MemberServiceTest {
    
    MemberService memberService;
    MemoryMemberRepository memberRepository;

    @BeforeEach
    public void beforeEach() {
        memberRepository = new MemoryMemberRepository();
        memberService =  new MemberService(memberRepository);
    }

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

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

    @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("์ด๋ฏธ ์กด์žฌํ•˜๋Š” ํšŒ์›์ž…๋‹ˆ๋‹ค.");
/*
        try {
            memberService.join(member2);
            fail();
        } catch (IllegalStateException e) {
            assertThat(e.getMessage()).isEqualTo("์ด๋ฏธ ์กด์žฌํ•˜๋Š” ํšŒ์›์ž…๋‹ˆ๋‹ค.");
        }
*/
    }


    @Test
    void findMembers() {
    }

    @Test
    void findOne() {
    }
}

@BeforeEach : ๊ฐ ํ…Œ์ŠคํŠธ ์‹คํ–‰ ์ „์— ํ˜ธ์ถœ๋œ๋‹ค. ํ…Œ์ŠคํŠธ๊ฐ€ ์„œ๋กœ ์˜ํ–ฅ์ด ์—†๋„๋ก ํ•ญ์ƒ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์˜์กด๊ด€๊ณ„๋„ ์ƒˆ๋กœ ๋งบ์–ด์ค€๋‹ค.

 

 

 

๋‚ด์šฉ ๋ฐ ์ด๋ฏธ์ง€ ์ถœ์ฒ˜ : ๊น€์˜ํ•œ์˜ ์Šคํ”„๋ง ์ž…๋ฌธ    

profile

YOONJI

@๊ธฐ๋ฎจ์ง€

ํฌ์ŠคํŒ…์ด ์ข‹์•˜๋‹ค๋ฉด "์ข‹์•„์š”โค๏ธ" ๋˜๋Š” "๊ตฌ๋…๐Ÿ‘๐Ÿป" ํ•ด์ฃผ์„ธ์š”!