Bibi's DevLog π€π
[Spring] μΈνλ° μ€νλ§ μ λ¬Έ(κΉμν λ) - νμ κ΄λ¦¬ μμ :λΉμ¦λμ€ μꡬμ¬ν, νμ λλ©μΈ/리ν¬μ§ν 리/μλΉμ€ κ°λ°, ν μ€νΈμΌμ΄μ€ μμ± λ³Έλ¬Έ
[Spring] μΈνλ° μ€νλ§ μ λ¬Έ(κΉμν λ) - νμ κ΄λ¦¬ μμ :λΉμ¦λμ€ μꡬμ¬ν, νμ λλ©μΈ/리ν¬μ§ν 리/μλΉμ€ κ°λ°, ν μ€νΈμΌμ΄μ€ μμ±
λΉλΉ bibi 2021. 3. 4. 00:55μ΄ κΈμ μΈνλ° κΉμν λμ μ€νλ§ μ λ¬Έ κ°μ λ₯Ό λ£κ³ μ 리ν κΈμ λλ€.
νμ κ΄λ¦¬ μμ - λ°±μλ κ°λ°
- λΉμ¦λμ€ μꡬμ¬ν μ 리
- νμ λλ©μΈκ³Ό μ μ₯μ(리ν¬μ§ν 리) λ§λ€κΈ°
- νμ 리ν¬μ§ν 리 ν μ€νΈμΌμ΄μ€ μμ±
- νμ μλΉμ€ κ°λ°
- νμ μλΉμ€ ν μ€νΈ
*νμ μ μ₯μ(리ν¬μ§ν 리) : νμ λλ©μΈ κ°μ²΄λ₯Ό μ μ₯ λ° λΆλ¬μ¬ μ μλ κ°μ²΄.
λΉμ¦λμ€ μꡬμ¬ν μ 리
μμμ΄λ―λ‘ κ°μ₯ μ¬μ΄ κ²μΌλ‘ λ§λ λ€.
λ¨μν μλΉμ€λ‘ μ€νλ§ μνκ³κ° μ΄λ»κ² κ°λ°, λμλλμ§ μ΄ν΄νλ κ² λͺ©νλ€.
- λ°μ΄ν° : νμ μμ΄λ, μ΄λ¦
- κΈ°λ₯ : νμ λ±λ‘, μ‘°ν
- (κ°μμ μλ리μ€) μμ§ λ°μ΄ν° μ μ₯μκ° μ μ λμ§ μμ
μΌλ°μ μΉ μ ν리μΌμ΄μ κ³μΈ΅ ꡬ쑰
μΌλ°μ μΈ μΉ μ ν리μΌμ΄μ μ 컨νΈλ‘€λ¬, μλΉμ€, 리ν¬μ§ν 리, λλ©μΈ, DB μ 5 μμλ‘ κ΅¬μ±λλ€.
- 컨νΈλ‘€λ¬ : μΉ MVCμ 컨νΈλ‘€λ¬ μν
- μλΉμ€ : ν΅μ¬ λΉμ¦λμ€ λ‘μ§ κ΅¬ν
- λΉμ¦λμ€ λλ©μΈ κ°μ²΄λ₯Ό κ°μ§κ³ ν΅μ¬ λΉμ¦λμ€ λ‘μ§μ΄ λμνλλ‘ κ΅¬νν κ³μΈ΅.
- 리ν¬μ§ν 리 : λ°μ΄ν°λ² μ΄μ€μ μ κ·Ό, λλ©μΈ κ°μ²΄λ₯Ό DBμ μ μ₯ λ° κ΄λ¦¬
- λλ©μΈ : λΉμ¦λμ€ λλ©μΈ κ°μ²΄.
- μ) νμ, μ£Όλ¬Έ, μΏ ν° λ±λ± μ£Όλ‘ λ°μ΄ν°λ² μ΄μ€μ μ μ₯νκ³ κ΄λ¦¬λ¨
ν΄λμ€ μμ‘΄κ΄κ³
νμ 리ν¬μ§ν 리 (MemberRepository) : μΈν°νμ΄μ€λ‘ μ€κ³ν κ²μ΄λ€.
μ? μμ§ λ°μ΄ν° μ μ₯μκ° μ μ λμ§ μμμΌλ―λ‘.
λ°μ΄ν° μ μ₯μλ RDB, NoSQL λ± λ€μν μ μ₯μλ₯Ό κ³ λ―Ό μ€μΈ μν©μΌλ‘ κ°μ
Memory MemberRepository : νμ 리ν¬μ§ν 리μ ꡬν체 (λ¨μ)
μ΄κΈ° κ°λ° λ¨κ³μμλ ꡬνμ²΄λ‘ κ°λ²Όμ΄ λ©λͺ¨λ¦¬ κΈ°λ° λ°μ΄ν°μ μ₯μλ₯Ό μ¬μ©νλ€.
ꡬ체μ μΈ κΈ°μ μ΄ μ μ λκ³ λλ©΄ μ΄λ₯Ό λ°κΏ κ²μ΄λ€. λλ¬Έμ μΈν°νμ΄μ€λ‘ λ§λ€λ©΄ λμ€μ ꡬν ν΄λμ€λ₯Ό λ³κ²½νκΈ° μ’λ€.
νμ λλ©μΈκ³Ό 리ν¬μ§ν 리 λ§λ€κΈ°
μμ λΉμ¦λμ€ μꡬμ¬νμ λ°νμΌλ‘ ꡬνμ μμνλ€.
νμ : μμ΄λμ μ΄λ¦μ κ°μ§λ€.
src/main/java/νλ‘μ νΈλͺ /domain
ν¨ν€μ§λ₯Ό λ§λ€κ³Member.java
μμ±μμ΄λλ νμμ΄ μ§λ IDκ° μλλΌ, νμ ꡬλΆμ μν΄ μμ€ν μ΄ μ νλ IDμ.
private Long id
μ΄λ¦μ νμμ΄ μ λ μ΄λ¦.
private String name
getter, setterλ₯Ό λ§λ λ€.
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;
}
}
μ μ₯μ(리ν¬μ§ν 리) : νμ(
Member
)μ μ μ₯νκ³ κΊΌλΈλ€.src/main/java/νλ‘μ νΈλͺ /repository
λλ ν 리λ₯Ό λ§λ€κ³MemberRepository
λΌλ μΈν°νμ΄μ€λ₯Ό μμ±νλ€.μ μ₯ : νμμ μ μ₯νκ³ μ μ₯λ νμμ λ°νν¨.
Member save(Member member)
μμ΄λλ‘ νμμ‘°ν
Optional<Member> findByID(Long id)
μ΄λ¦μΌλ‘ νμμ‘°ν
Optional<Member> findByName(String name)
λͺ¨λ νμμ‘°ν
List<Member> findAll()
Optional
: μλ°8μ λ€μ΄κ° κΈ°λ₯μΌλ‘, λ°νλλ κ°μ²΄κ° nullμΌ κ°λ₯μ±μ΄ μμ λ μ¬μ©νλ€.(μ°ΎμΌλ €λ idλ nameμ΄ μμ μ μμΌλ―λ‘ μ΄λ° μ²λ¦¬λ₯Ό νλ€)
μ°λ¦¬ μ½λμμλ Member κ°μ²΄λ₯Ό Optionalλ‘ ν λ² λ κ°μΈμ μ¬μ©ν κ²μ΄λ€.
*Optional λ³μμμ κ°μ κΊΌλΌ λλ
get()
μ μ¬μ©νλ€. (Optionalκ°μ²΄μμ Member)
orElseGet()
: κ°μ΄ μμΌλ©΄ κΊΌλ΄κ³ , μμΌλ©΄ ()λ΄μ λ©μλλ₯Ό μ€ννλ€.
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();
}
μ μ₯μμ ꡬν체
src/main/java/νλ‘μ νΈλͺ /repository
μMemoryMemberRepository.java
μμ±ν΄λμ€λͺ μμ
implements MemberRepository
λ₯Ό μ λ ₯νκ³ alt + enterλ‘ λ©μλλ₯Ό λ§λ λ€.λ§λ€μ΄μ§ λ©μλλ₯Ό νλνλ ꡬννλ€.
save()
: νμμ μ μ₯νλ €λ©΄ μ μ₯ν κ°μ²΄κ° νμ.private static Map<Long, Member> store = new HashMap<>();
: memberμ μμ΄λλ₯Ό μ μ₯ν κ°μ²΄μ΄λ€.private static long sequence = 0L;
: μνμ€λ 0, 1, 2.. μ κ°μ΄ ν€ κ°μ μμ±ν΄ μ£Όλ μν μ΄λΌκ³ 보면 λλ€.- sequenceμ 1μ λν κ°μ memberμ μμ΄λλ‘ μ§μ νλ€ - storeμ μμ΄λμ memberλ₯Ό λ£λλ€ - memberλ₯Ό λ°ννλ€
findById()
: storeμμ μμ΄λλ₯Ό κ°μ§κ³ memberλ₯Ό κΊΌλΈλ€.return Optional.ofNullable(store.get(id));
- μμ΄λμ ν΄λΉνλ νμμ΄ μμ΄ nullμ΄ λμ¬ μ μμΌλ―λ‘,
Optional.ofNullable()
λ‘ κ°μΈ μ€λ€.
findByName()
: storeμμ μ΄λ¦μ κ°μ§κ³ μ°Ύλλ€.- λλ€μ μ€νΈλ¦Όμ νμ©ν΄ 루νλ₯Ό λλ¦°λ€.
.filter(member -> member.getName().equals(name))
: memberμ μ΄λ¦μ΄ νλΌλ―Έν°λ‘ λμ΄μ¨name
κ³Ό κ°μμ§ λΉκ΅νλ€. κ°μ κ²½μ°μλ§ νν°λ§μ΄ λλ€..findAny()
: μ°Ύμ κ²λ€μ λͺ¨λ λ°ννλ€.
findAll()
: λͺ¨λ νμμ λ°ννλ€.return new ArrayList<>(store.values())
- νμ μ μ₯μ Mapμ νμ§λ§ λ°νμ Listλ‘ νλ€. μ΄μ λ 루νλ₯Ό λ리기 λ νΈν΄μ.
νμ 리ν¬μ§ν 리 ν μ€νΈ μΌμ΄μ€ μμ±
ꡬνλ MemoryMemberRepositoryκ° μ λμνλμ§ νμΈνκΈ° μν΄, ν μ€νΈμΌμ΄μ€λ₯Ό λ§λ€μ΄ λ³Έλ€.
κ°λ°ν κΈ°λ₯μ μ€νν΄μ ν μ€νΈ ν λ, mainλ©μλλ₯Ό ν΅ν΄μ μ€ννκ±°λ 컨νΈλ‘€λ¬λ₯Ό ν΅ν΄ μ€ννλ€. μ΄λ° λ°©λ²μ μ€λΉ λ° μ€νμ΄ μ€λ κ±Έλ¦¬κ³ , λ°λ³΅ μ€νμ΄ μ΄λ ΅κ³ , μ¬λ¬ ν μ€νΈλ₯Ό ν λ²μ μ€ννκΈ° μ΄λ ΅λ€.
μλ°λ JUnitμ΄λΌλ νλ μμν¬λ‘ ν μ€νΈλ₯Ό μ€νν΄ μ΄λ° λ¬Έμ λ₯Ό ν΄κ²°νλ€.
ν μ€νΈ ν΄λμ€λ
src/test/java/νλ‘μ νΈλͺ
κ²½λ‘μ λμΌν ν¨ν€μ§λ₯Ό λ§λ€κ³ κ±°κΈ°μ μμ±νλ€.ν μ€νΈ ν΄λμ€μ μ΄λ¦μ κ΄λ‘μ
ν μ€νΈνλ €λ ν΄λμ€ μ΄λ¦+Test
μ΄λ€.MemoryMemberRepositoryμ ν μ€νΈν΄λμ€ μ΄λ¦μ
MemoryMemberRepositoryTest
κ° λλ€.
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.*;
public 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);
}
}
- ν μ€νΈ ν΄λμ€λ publicμΌ νμκ° μλ€.
- ν
μ€νΈ ν΄λμ€μ ν
μ€νΈλ₯Ό μνλ κ°μ²΄λ₯Ό μμ±νκ³ , λ©μλ μμ
@Test
μ΄λ Έν μ΄μ μ λΆμ΄λ©΄ ν΄λΉ λ©μλλ₯Ό ν μ€νΈν μ μκ² λλ€.import org.junit.jupiter.api.Test;
κ° νμνλ€.
- ν μ€νΈ λ©μλ μμμ mainλ©μλμμ ν μ€νΈνλ κ²κ³Ό κ°μ΄ ν μ€νΈμ½λλ₯Ό μ§λ©΄ λλ€.
- ν
μ€νΈ λ©μλμμ κ²μ¦μ ν λλ
org.assertj.core.api.Assertions
μAssertions.assertThat(member).isEqualTo(result)
μ κ°μ΄ μ¬μ©.import static org.assertj.core.api.Assertions.*;
λ‘ κ°μ Έμ€λ©΄ Assertions μμ΄ μ¬μ© κ°λ₯νλ€.
- κ°
@Test
μ μμλ 보μ₯λμ§ μλλ€.- ν μ€νΈλ μλ‘ μμ‘΄κ΄κ³ μμ΄ (μμμ κ΄κ³μμ΄) κ²°κ³Όκ° λ³΄μ₯λμ΄μΌ ν¨.
@AfterEach
: κ° ν μ€νΈλ©μλκ° λλ λ λ§λ€ μ€ννλ λ©μλλ₯Ό μ μν¨
- ν
μ€νΈ λ©μλμ μ΄λ¦μ νκΈλ‘ μ μ μλ μλ€.
void νμκ°μ () { ... }
- μ’ λ μ§κ΄μ μ΄κΈ° λλ¬Έ
(μ°Έκ³ ) ν μ€νΈ μ£Όλ κ°λ°(TDD)
: ν μ€νΈ μΌμ΄μ€λ₯Ό λ¨Όμ λ§λ€κ³ κΈ°λ₯μ λ§λλ κ².
μ°λ¦¬λ κΈ°λ₯ κ°λ°μ λ¨Όμ νκ³ κ·Έ κΈ°λ₯μ ν μ€νΈνκΈ° μν΄ ν μ€νΈλ₯Ό λ§λ€μμ§λ§,
ν μ€νΈ μ£Όλ κ°λ°μμλ ν μ€νΈλ₯Ό λ¨Όμ λ§λ€κ³ κ·Έ ν μ€νΈμ λ§λ κΈ°λ₯μ κ°λ°νλ€.
κ·λͺ¨κ° 컀μ§μλ‘, νμ μ ν μλ‘ ν μ€νΈμ μ€μμ±μ 컀μ§λ€.
ν μ€νΈ μμ± μμ κΌ κΉμ΄ μκ² κ³΅λΆν΄μΌ νλ λΆλΆμ΄λ€.
νμ μλΉμ€ κ°λ°
λλ©μΈμ νμ©ν΄ μ€μ λΉμ¦λμ€ λ‘μ§μ μμ±νλ€.
src/main/java/νλ‘μ νΈλͺ
/service
ν¨ν€μ§λ₯Ό λ§λ€κ³ MemberService.java
μμ±.
MemberRepository
μ λ©μλλͺ
μ ν΄λμ€ μ΄λ¦λλ‘ "μ μ₯μμ λ£κ³ λΉΌλ λλ"μ΄ λ€μ΄μΌ νλ€. μ μ₯μλ κ°λ°μμκ² λ κ°κΉκΈ° λλ¬Έ.
MemberService
μ λ©μλλͺ
μ ν΄λμ€ μ΄λ¦λλ‘ "λΉμ¦λμ€μ λ κ°κΉμ΄ λλ"μ΄ λ€μ΄μΌ νλ€. μλΉμ€κ° λ λΉμ¦λμ€ μμ‘΄μ μ΄κΈ° λλ¬Έ.
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);
}
}
νμκ°μ
κ°μ μ΄λ¦μ΄ μλ νμμ κ°μ ν μ μλ€
// κ°μ μ΄λ¦μ νμ κ°μ μ°¨λ¨ memberRepository.findByName(member.getName()) .ifPresent(m -> { // κ°μ΄ μμΌλ©΄ throw new IllegalStateException("μ΄λ―Έ μ‘΄μ¬νλ νμμ λλ€."); });
ifPresent()
: Optionalμ λ©μλλ‘, μ΄λ€ κ°μ΄ μ‘΄μ¬νλ©΄ μκ΄νΈ λ΄μ λ‘μ§μ μννλ€.
νμ μλΉμ€ ν μ€νΈ μΌμ΄μ€ μμ±
ν μ€νΈλ₯Ό μμ±νλ €λ ν΄λμ€ μ΄λ¦μ λκ³ Ctrl + Shift + Tλ₯Ό λλ₯΄λ©΄ νΈνκ² ν μ€νΈμΌμ΄μ€λ₯Ό λ§λ€ μ μλ€.
ν μ€νΈ : given - when - then λ²
ν
μ€νΈ λ©μλ λ΄μ //given
, //when
, //then
μ μ¬μ©νλ κΈ°λ²μ΄λ€.
ν μ€νΈ λ©μλκ° κΈΈκ³ λ³΅μ‘ν λ κ°λ μ±μ λμ¬μ€λ€.
''ν μ€νΈ''λΌλ κ³Όμ μ체λ₯Ό μκ°ν΄λ΄€μ λ,
- 무μΈκ° μ£Όμ΄μ§κ³ (given)
- ν μ€νΈνλ λ°μ΄ν°λ₯Ό λνλΈλ€.
- μ΄λ€ λ‘μ§μ μ€ννμ λ (when)
- κ²μ¦νλ λ‘μ§μ λνλΈλ€.
- κ²°κ³Όκ° μ΄λ¬ν΄μΌ νλ€ (then)
- κ²μ¦λΆλ₯Ό λνλΈλ€.
μ μ μ°¨λ‘ κ²μ¦νλ κ³Όμ μ΄κΈ° λλ¬Έ.
ν μ€νΈλ μ μflowλ³΄λ€ μμΈflowκ° μ€μνλ€
'νμκ°μ 'μ΄λΌλ λ‘μ§μ μκ°ν΄ λ΄€μ λ, νμκ°μ μ΄ μ λλ κ²λ μ€μνμ§λ§ μ€λ³΅ νμμΌ λ μμΈκ° λ°μλλμ§ νμΈνλ κ² μ€μνλ€.
- try - catch λ‘ μμΈκ° λ°μνλμ§ μ‘μλ΄λ λ°©λ².
- μ€μ ν μμΈλ₯Ό catchλ¬Έμ μμ±ν΄ μμΈκ° μ λ°μνλμ§ νμΈ.
error.getMessage()
: μλ¬ λ©μμ§μ λ΄μ©μ κ°μ Έμ€λ λ©μλfail()
: ν μ€νΈμΌμ΄μ€κ° μ€ν¨νμμ λνλ΄λ λ©μλ
assertThrows(error.class, λλ€μ )
:λλ€μ
μ μ€ννμ λ μ§μ λerror
κ° ν°μ ΈμΌ νλ€. κ·Έλ μ§ μμΌλ©΄ ν μ€νΈλ μ€ν¨νλ€.
package hello.hellospring.service;
import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemoryMemberRepository;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.*;
class MemberServiceTest {
MemberService memberService = new MemberService();
MemoryMemberRepository memberRepository = new MemoryMemberRepository();
@AfterEach
public void afterEach() {
memberRepository.clearStore();
}
@Test
void νμκ°μ
() {
// given - ν
μ€νΈν λ°μ΄ν°
Member member = new Member();
member.setName("spring");
// when - κ²μ¦νλ €λ λ‘μ§ : MemberServiceμ join().
Long saveId = memberService.join(member);
// then - ν
μ€νΈ κ²°κ³Ό (κ²μ¦λΆ)
Member findMember = memberService.findOne(saveId).get();
assertThat(member.getName()).isEqualTo(findMember.getName());
}
@Test
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("μ΄λ―Έ μ‘΄μ¬νλ νμμ
λλ€.");
}
*/
IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));
// then
assertThat(e.getMessage()).isEqualTo("μ΄λ―Έ μ‘΄μ¬νλ νμμ
λλ€.");
}
@Test
void findMembers() {
}
@Test
void findOne() {
}
}
DI : ν μ€νΈ μΌμ΄μ€λ₯Ό μν΄ ν΄λμ€ μΈμ€ν΄μ€λ₯Ό μλ‘ λ§λ€μ§ μκ³ ..
ν μ€νΈ μΌμ΄μ€λ§μ μν΄ ν΄λμ€ μΈμ€ν΄μ€λ₯Ό μλ‘ λ§λ€λ©΄ κΈ°μ‘΄ ν΄λμ€μ λ€λ₯Έ μΈμ€ν΄μ€μ΄λ―λ‘ λ¬Έμ κ° λ°μν μ μλ€.
- ν΄λΉ ν΄λμ€μ μΈμ€ν΄μ€λ³μκ° λͺ¨λ νμ staticμΌ μλ μλ€.
- μλ³Έκ³Ό λμΌν λμμ κ°μ§κ³ ν μ€νΈν΄μΌ νλλ°, λ€λ₯Έ μΈμ€ν΄μ€λ₯Ό λ§λ€μ΄ ν μ€νΈνλ μν©μ΄ λλ€.
β ν΄κ²° : ν΄λμ€μ μΈμ€ν΄μ€λ³μ κ°μ new
λ‘ μμ±νμ§ μκ³ , μμ±μλ₯Ό ν΅ν΄ κ°μ μΈλΆμμ λ£λλ‘ λ³κ²½νλ€. μ΄λ₯Ό DI (Dependency Injection, μμ‘΄μ± μ£Όμ
) λΌκ³ νλ€.
Before
MemberService.java
public class MemberService { private final MemberRepository memberRepository = new MemberRepository(); }
MemberServiceTest.java
class MemberServiceTest { MemberService memberService = new MemberService(); MemoryMemberRepository memberRepository = new MemoryMemberRepository(); }
After
MemberService.java
public class MemberService { private final MemberRepository memberRepository; public MemberService(MemberRepository memberRepository) { this.memberRepository = memberRepository; } }
MemberServiceTest.java
class MemberServiceTest { MemberService memberService; MemoryMemberRepository memberRepository; @BeforeEach public void beforeEach() { memberRepository = new MemoryMemberRepository(); memberService = new MemberService(memberRepository); } }