Domain & @Repository
- @Repository ๋ฅผ ๋ ํฌ์งํ ๋ฆฌ ํด๋์ค ์์ ๋ถ์ฌ์ค๋๋ค.
- private static Map<Long, Member> store : save()์ ์ ์ฅํ ๋ฐ์ดํฐ์ฉ์ผ๋ก ์ฌ์ฉํฉ๋๋ค.
- private static long sequence : 0, 1, 2...์์ผ๋ก ์นด์ดํธ๋ฅผ ์ธ๋ ์ํ์ค ๊ทธ ์์ฒด.
- save() : ๋ฉค๋ฒ ์ ์ฅ์ฉ.
- findId() : id๋ก ๋ฉค๋ฒ๊ฐ ์๋ ์ง ํ์ธํ๋๋ฐ, null์ด๋ฉด Optional์ ๋ฐํํฉ๋๋ค.
- findByName()
- store.values().stream() : store ๋งต์ ๊ฐ๋ค๋ง ๋ถ๋ฌ์ Stream์ ๋ง๋ ๋ค
- .filter(member -> member.getName().equals(name)) : ์ผ์นํ๋ ์ด๋ฆ์ด ์ผ์นํ๋ ๊ฒ๋ค์ ์ฐพ์ต๋๋ค.
- .findAny(); : ์ผ์นํ๋ ์ด๋ฆ๋ค ์ค ์๋ฌด๊ฑฐ๋ ๋ฐํํฉ๋๋ค.
- findAll() : ๋ฉค๋ฒ ์ ์ฒด ๊ฐ์ ๋ฐํํฉ๋๋ค.
Optional๊ณผ Stream์ ๋๋ค์->์ด ๋ฏ์ ๋ถ๋ค์ ์๋ ํฌ์คํธ๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์.
2024.12.17 - [โ JAVA/โ Class & Method] - [JAVA]Optional
2024.12.13 - [โ JAVA/โ Class & Method] - [JAVA][stream]์คํธ๋ฆผ์ด๋? (+ํน์ง)
2024.12.11 - [๐ฌ ํ๋ก๊ทธ๋๋ฐ ํํ์] - [Lambda]๋๋ค์
์คํธ๋ฆผ์ ๋ํ ์ค๋ช ํฌ์คํธ๋ ์ฌ๋ ค๋์ ๊ฒ ๋ ๋ง์ผ๋ ๊ถ๊ธํ์๋ค๋ฉด ์ ํฐ์คํ ๋ฆฌ์์ 'java stream'์ ๊ฒ์ํด์ฃผ์ธ์.
↓ ์ฝ๋
๋๋ฉ์ธ Member
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;
}
}
๋ฆฌํฌ์งํ ๋ฆฌ ์ธํฐํ์ด์ค MemberRepository
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();
}
๋ฆฌํฌ์งํ ๋ฆฌ ๊ตฌํํด๋์ค MemoryMemberRepository
package hello.hellospring.repository;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import org.springframework.stereotype.Repository;
import hello.hellospring.domain.Member;
@Repository
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 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());
}
public void clearStore() {
store.clear();
}
}
Test Case
@Test
- test ํด๋์ repository ํจํค์ง๋ฅผ ๋ง๋ค๊ณ ๊ทธ ์์ ๊ตฌํํด๋์ค+Test๋ฅผ ๋ถ์ธ ํด๋์ค๋ฅผ ๋ง๋ญ๋๋ค.
ํด๋์์น - ํ
์คํธ ํด๋์ค
- ์ฝ๋
์ฐธ๊ณ ๋ก ๋งจ์๋ assertEquals(member, result)๋ผ๊ณ ์ ์ด์ผ ํ๋๋ฐ ๋ฐ๊ฟ์ ์์ต๋๋ค. - ์ ์ฒด์ฝ๋
๋๋ณด๊ธฐ
package hello.hello_spring.repository; // import org.junit.jupiter.api.Assertions; import static org.assertj.core.api.Assertions.*; import java.util.List; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import hello.hellospring.domain.Member; import hello.hellospring.repository.MemoryMemberRepository; 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(); // import org.junit.jupiter.api.Assertions;์ ์ฌ์ฉ์ // Assertions.assertEquals(member, result); 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("spring1"); repository.save(member2); List<Member> result = repository.findAll(); assertThat(result.size()).isEqualTo(2); } }
- ๊ตณ์ด public class๋ก ํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ public์ ์ง์์คฌ์ต๋๋ค.
- ๋ฉ์๋ ์์ ํ
์คํธ์ ์ฌ์ฉํ Repository ๊ตฌํํด๋์ค๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
- ๋ฉ์๋ ์์ @Test ์ด๋
ธํ
์ด์
์ ๋ถ์ฌ์ค๋๋ค.
- ๋ฉ์๋ ์์ ๋๋ฉ์ธ์ ์ด์ฉํด ํ
์คํธ ์ฝ๋๋ฅผ ์ ์ต๋๋ค.
- ์ฝ๋
- ํ
์คํธ ์คํ
- ์ผ์ชฝ ์ฝ๋๋ผ์ธ์ ์๋ โ
๋ฒํผ์ ํด๋ฆญํฉ๋๋ค.
๐ ํ ์คํธ ์คํ ์ ์ฌ๊ธฐ๋ฅผ ํด๋ฆญํฉ๋๋ค! - TEST RESULTS๋์ ๊ฒฐ๊ณผ๊ฐ ๋น๋๋ค.
์ฑ๊ณต์ ์คํจ์
- ์ผ์ชฝ ์ฝ๋๋ผ์ธ์ ์๋ โ
๋ฒํผ์ ํด๋ฆญํฉ๋๋ค.
Assertions ํจํค์ง
- import org.junit.jupiter.api.Assertions;
- ์ฃผ๋ก ์ฌ์ฉํ๋ Junit ํ
์คํธ ํจํค์ง.
- assertEquals(expected, actual) : ์์๊ฐ๊ณผ ์ค์ ๊ฐ์ด ์ผ์นํ๋ ์ง ํ์ธํ๋ค.
- โป API ๋ฌธ์ https://junit.org/junit5/docs/current/api/org.junit.jupiter.api/org/junit/jupiter/api/Assertions.html?form=MG0AV3
- ์ฃผ๋ก ์ฌ์ฉํ๋ Junit ํ
์คํธ ํจํค์ง.
์ ์ฝ๋์ ์ฌ์ฉ๋ ๊ฒ์ junit์ Assertions์ ๋๋ค.
assertj
- import org.assertj.core.api.Assertions;
- ์์ฆ ๋ง์ด ์ฌ์ฉ๋๋ AssertJํ
์คํธ ํจํค์ง
- assertThat(expected).isEqualTo(actual) : ์์๊ฐ๊ณผ ์ค์ ๊ฐ์ด ์ผ์นํ๋ ์ง ํ์ธํ๋ค.
- โป API ๋ฌธ์ https://javadoc.io/static/org.assertj/assertj-core/3.24.2/org/assertj/core/api/Assertions.html?form=MG0AV3
- ์ฝ๋
์ฌ์ฉ๋ฒ์ jUnit์ Assertions๊ณผ ๊ฑฐ์ ์ ์ฌํ๋ค.
- ์์ฆ ๋ง์ด ์ฌ์ฉ๋๋ AssertJํ
์คํธ ํจํค์ง
@AfterEach
: ํ ์คํธ๊ฐ ๋๋ ๋๋ง๋ค ์คํ๋๋ค.
๐ ๋ฐ๋ผ์ ๋ฉ์๋๊ฐ ์คํ๋ ๋๋ง๋ค @AfterEach๋ฅผ ์ด์ฉํ ๋ฉ์๋๋ฅผ ์ด์ฉํด, ๋๋ฉ์ธ์ผ๋ก ๋ง๋ ๋ฐ์ดํฐ๋ฅผ clearํด์ฃผ๋ ๋ฉ์๋๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค.
- ๋ฆฌํฌ์งํ ๋ฆฌ ๊ตฌํํด๋์ค์ store.clear(); ๋ฅผ ๋ด์ ๋ฉ์๋๋ฅผ ๋ง๋ ๋ค.
- ํ
์คํธ ํด๋์ค @AfterEach ๋ฉ์๋์ repository.clearStore(); ๋ฅผ ์ ๋๋ค.
- ํ
์คํธ ์คํ๊ฒฐ๊ณผ.
์ ์์ ์ผ๋ก ๋ชจ๋ ์ ํ ์คํธ๋ ๊ฒ ํ์ธ๋๋ค.
๐ก ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ TDD
ํ ์คํธ๋ฅผ ๋จผ์ ๋ง๋ค๊ณ ๊ตฌํ ํด๋์ค๋ฅผ ๋ง๋ค๋ ๊ฒ์ ๋งํ๋ค.
โป ์ฐธ์กฐ : https://www.inflearn.com/roadmaps/373
'๐ Spring > ๐ Spring Boot' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SpringBoot]์คํ๋ง ๋น ๋ฑ๋ก:1.์ปดํฌ๋ํธ ์ค์บ๊ณผ ์๋ ์์กด๊ด๊ณ ์ค์ (0) | 2025.01.06 |
---|---|
[SpringBoot][JUnit]ํ์๊ด๋ฆฌ-์๋น์ค์ ํ ์คํธ (2) | 2025.01.05 |
[SpringBoot]ํ์๊ด๋ฆฌ-๋น์ง๋์ค ์๊ตฌ์ฌํญ ์ ๋ฆฌ (0) | 2025.01.04 |
[SpringBoot]์น ๊ฐ๋ฐ ๊ธฐ์ด-API @ResponseBody (0) | 2025.01.04 |
[SpringBoot][Thymeleaf]์น ๊ฐ๋ฐ ๊ธฐ์ด-MVC์ ํ ํ๋ฆฟ ์์ง (1) | 2025.01.03 |