ํฐ์คํ ๋ฆฌ ๋ทฐ
[SPRING]์คํ๋ง ์ ๋ฌธ - ์ฝ๋๋ก ๋ฐฐ์ฐ๋ ์คํ๋ง ๋ถํธ, ์น MVC, DB ์ ๊ทผ ๊ธฐ์ ์น์ 3 (ํ์ ๊ด๋ฆฌ ์์ - ๋ฐฑ์๋ ๊ฐ๋ฐ)
chaewonni 2023. 11. 8. 03:35๐ก๋น์ฆ๋์ค ์๊ตฌ์ฌํญ ์ ๋ฆฌ
๋ฐ์ดํฐ: ํ์ID, ์ด๋ฆ
๊ธฐ๋ฅ: ํ์ ๋ฑ๋ก, ์กฐํ
์์ง ๋ฐ์ดํฐ ์ ์ฅ์๊ฐ ์ ์ ๋์ง ์์(๊ฐ์์ ์๋๋ฆฌ์ค) --> ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ํ ์ง No SQL๋ก ํ ์ง ์ด๋ฐ๊ฒ ์์ง ์ ์ ํด์ง ์ํฉ
๐ป์น ์ ํ๋ฆฌ์ผ์ด์ ๊ณ์ธต ๊ตฌ์กฐ

์ปจํธ๋กค๋ฌ: ์น MVC์ ์ปจํธ๋กค๋ฌ ์ญํ ๊ณผ API๋ฅผ ๋ง๋๋ ์ปจํธ๋กค๋ฌ ์ญํ ์ ํ๋ค.
์๋น์ค: ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง์ด ๋ค์ด๊ฐ ์์ด, ํ์์ ์ค๋ณต ๊ฐ์
์ด ์๋๋ค ๋ฑ์ ๋ํ ๋ก์ง๋ค์ด๋ค.
๋๋ฉ์ธ: ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฃผ๋ก ์ ์ฅํ๊ณ ๊ด๋ฆฌ๋๋ ๋น์ฆ๋์ค ๋๋ฉ์ธ ๊ฐ์ฒด์ด๋ค.
๋ฆฌํฌ์งํ ๋ฆฌ: ๋น์ฆ๋์ค ๋๋ฉ์ธ ๊ฐ์ฒด๋ฅผ ๊ฐ์ง๊ณ ํต์ฌ ๋น์ฆ๋์ค๊ฐ ๋์ํ๋๋ก ๊ตฌํํ ๊ฐ์ฒด์ด๋ค. ๋๋ฉ์ธ ๊ฐ์ฒด๋ฅผ DB์ ์ ์ฅํ๊ณ ๊ด๋ฆฌ
์ผ๋ฐ์ ์ธ ๊ณ์ธตํ ๊ตฌ์กฐ๋ฅผ ๋ฐ๋ผ๊ฐ๋ค.
๐ปํด๋์ค ์์กด๊ด๊ณ

ํ์๋น์ฆ๋์ค ๋ก์ง์๋ ํ์์๋น์ค(MemberService)๊ฐ ์๊ณ , ํ์ ๋ฆฌํฌ์งํ ๋ฆฌ ํ์์ ์ ์ฅํ๋ ๊ฒ์ ์ธํฐํ์ด์ค๋ก ์ค๊ณ๋ฅผ ํ ๊ฒ์ด๋ค. ์์ง ๋ฐ์ดํฐ ์ ์ฅ์๊ฐ ์ ์ ๋์ง ์์๊ธฐ ๋๋ฌธ์, ์ฐ์ ๊ฐ๋จํ๊ฒ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฅ์ ํ ํ์, ๋์ค์ ๋ฐ์ดํฐ ์ ์ฅ์ (DB)๊ฐ ์ ์ ๋๋ฉด ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ DB๋ก ๋ฐ๊ฟ์ฃผ์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ธํฐํ์ด์ค(interface)๋ก ์ค๊ณํ๋ค.
๐กํ์ ๋๋ฉ์ธ๊ณผ ๋ฆฌํฌ์งํ ๋ฆฌ ๋ง๋ค๊ธฐ
๐ป ํ์ ๊ฐ์ฒด

main/java/hello.hellospring ํด๋์ domain ํจํค์ง ์ถ๊ฐ, ๊ทธ ์์ 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;
}
}
ํ์ ID์ ์ด๋ฆ์ ๋ํ getter setter๋ฅผ ๋ง๋ค์ด์ฃผ์๋ค.
๐ป ํ์ ๋ฆฌํฌ์งํ ๋ฆฌ ์ธํฐํ์ด์ค

์ ๊ฒฝ๋ก์ repository ํจํค์ง์ MemberRepository ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค์ด์ค๋ค.
์ธํฐํ์ด์ค๋ DB์ฐ๊ฒฐ์ ์ํ ๊ฒ์ด๋ค.
package hello.hellospring.repository;
import hello.hellospring.domain.Member;
import java.util.List;
import java.util.Optional;
public interface MemberRepository {
Member save(Member member); //ํ์์ด ์ ์ฅ๋จ
//์ฒซ ๋ฒ์งธ Member๋ ๋ฉ์๋์ ๋ฐํ ํ์
์ ๋ํ๋ด๋ฉฐ, ์ด ๊ฒฝ์ฐ save ๋ฉ์๋๊ฐ ํธ์ถ๋๋ฉด Member ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.
// ๋ ๋ฒ์งธ Member๋ ๋ฉ์๋์ ๋งค๊ฐ๋ณ์ ํ์
์ ๋ํ๋ด๋ฉฐ, member๋ผ๋ ์ด๋ฆ์ Member ๊ฐ์ฒด๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์ ๋ฉ์๋๋ฅผ ํธ์ถํ ์ ์์์ ์๋ฏธ
Optional<Member> findById(Long id); //findById, findByName์ผ๋ก ๊ฐ์ ธ์ค๋ ๊ฐ์ด null์ผ ์ ์์.
//์์ฆ์๋ null์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์์ null์ ๊ทธ๋๋ก ๋ฐํํ๋ ๋ฐฉ๋ฒ ๋์ Optional ์ด๋ผ๋ ๊ฑธ๋ก ๊ฐ์ธ์ ๋ฐํํ๋ ๋ฐฉ๋ฒ์ ๋ง์ด ์ ํธ
Optional<Member> findByName(String name);
List<Member> findAll(); //์ง๊ธ๊น์ง ์ ์ฅ๋ ๋ชจ๋ ํ์๋ค์ ๋ฆฌ์คํธ๋ฅผ ๋ฐํ
์์ฆ์๋ null์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์์ null์ ๊ทธ๋๋ก ๋ฐํํ๋ ๋ฐฉ๋ฒ ๋์ Optional ์ด๋ผ๋ ๊ฑธ๋ก ๊ฐ์ธ์ ๋ฐํํ๋ ๋ฐฉ๋ฒ์ ๋ง์ด ์ ํธํ๋ค๊ณ ํ๋ค.
๐ป ํ์ ๋ฆฌํฌ์งํ ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ๊ตฌํ์ฒด

์์์ ๋ง๋ค์๋ MemberRepository ์ธํฐํ์ด์ค๊ฐ ์๋ repository ํจํค์ง ์์ MemoryMemberRepository ํด๋์ค๋ฅผ ๋ง๋ค์ด์ค๋ค. ์ฌ๊ธฐ์ MemberRepository interface๋ฅผ ๊ตฌํํ๊ธฐ ์ํ implements ๋ฉ์๋๋ฅผ ์์ฑํ ๊ฒ์ด๋ค.
package hello.hellospring.repository;
import hello.hellospring.domain.Member;
import java.util.*;
public class MemoryMemberRepository implements MemberRepository{
private static Map<Long, Member> store = new HashMap<>();
//Long ํ์
์ ํค์ Member ๊ฐ์ฒด๋ฅผ ๊ฐ์ผ๋ก ๊ฐ์ง๋ HashMap ๊ฐ์ฒด๋ก ์ด๊ธฐํ
private static long sequence = 0L;
@Override
public Member save(Member member) {
member.setId(++sequence);
store.put(member.getId(), member);
//member ๊ฐ์ฒด์ id๋ฅผ ํค๋ก ์ฌ์ฉํ๊ณ , member ๊ฐ์ฒด ์์ฒด๋ฅผ ๊ฐ์ผ๋ก ์ ์ฅํฉ๋๋ค.
// ์ด๋ ๊ฒ ํ๋ฉด id๋ฅผ ์ฌ์ฉํ์ฌ ํ์์ ์กฐํํ ์ ์๊ฒ ๋ฉ๋๋ค.
return member;
}
@Override
public Optional<Member> findById(Long id) {
return Optional.ofNullable(store.get(id)); //null์ด์ด๋ ๊ฐ์ ์ ์์
}
@Override
public Optional<Member> findByName(String name) {
return store.values().stream()
.filter(member -> member.getName().equals(name))
.findAny();
}
//์คํธ๋ฆผ์ ํตํด ๋งต์ ์ ์ฅ๋ ๋ชจ๋ Member ๊ฐ์ฒด์ ์ ๊ทผ
//์คํธ๋ฆผ์ filter ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์์๋ง ๋จ๊น๋๋ค. ์ฌ๊ธฐ์๋ ํ์์ ์ด๋ฆ์ด ์ฃผ์ด์ง name๊ณผ ๋์ผํ ๊ฒฝ์ฐ๋ง์ ํํฐ๋ง
//Optional๋ก 'name'๊ณผ ์ผ์นํ๋ ํ์์ ๋ชป์ฐพ์์ ๋์ ๋น 'Optional'๋ฐํ
//.findAny(): ํํฐ๋ง๋ ์์ ์ค ํ๋๋ฅผ ์ฐพ์
@Override
public List<Member> findAll() {
return new ArrayList<>(store.values());
}
}
์ฝ๋ ์ฃผ์์ ์ฐธ๊ณ ํด์ฃผ๊ธธ ๋ฐ๋๋ค.
๐กํ์ ๋ฆฌํฌ์งํ ๋ฆฌ ํ ์คํธ ์ผ์ด์ค ์์ฑ
์์์ ๋ง๋ MemoryMemberRepository๊ฐ ์ ์์ ์ผ๋ก ์ ๋์๊ฐ๋์ง ๊ฒ์ฆํ๊ธฐ ์ํด ํ
์คํธ ์ผ์ด์ค๋ฅผ ์์ฑํ๋ค.
์๋ฐ์ JUnit์ด๋ผ๋ ํ๋ ์์ํฌ๋ก ํ
์คํธ๋ฅผ ์คํํ๋ค.

์ ๊ฒฝ๋ก์ repositoryํจํค์ง์ MemoryMemberRepositoryTest ํด๋์ค๋ฅผ ๋ง๋ค์ด์ค๋ค.
package hello.hellospring.repository;
import hello.hellospring.domain.Member;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
class MemoryMemberRepositoryTest { // ๊ตณ์ด public ์ผ๋ก ํ ํ์์์ด์ ์ง์
// Test๋ฅผ ํ๊ธฐ ์ํ ์ ์ฅ์
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();
//Assertions.assertEquals(member, result); //๊ธฐ๋ํ๋ ๊ฒ(expected), actual ์
//result๋ member๋ ๋๊ฐ์์ง ํ์ธํด ๋ณผ ์ ์์
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(member1).isEqualTo(result);
}
@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, findAll Test ์ฝ๋๋ฅผ ์์ฑํด์ฃผ์๋ค.

๋ชจ๋ ๋ฉ์๋๋ค์ ๋ํด Test๋ฅผ ํ๊บผ๋ฒ์ ์คํํ๊ณ ์ถ๋ค๋ฉด class ์์ run ๋ฒํผ์ ๋๋ฅด๊ฑฐ๋,

hello.hellospring์ ๋ํด Run์ ๋๋ ค์ฃผ๋ฉด ๋๋ค.
์์ ์๋ AfterEach๋ ๋งค์ฐ ์ค์ํ๋ฐ, ๋ง์ฝ AfterEach๊ฐ ์๋ค๋ฉด

run์ ํ์ ๋ ์์๊ฐ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
์ด๋ findAll๊ณผ findByName์์ ๋ชจ๋ ๋๊ฐ์ member1๊ณผ member2 ๊ฐ์ฒด๊ฐ ๋ ๋ค ์์ฑ ๋์๊ธฐ ๋๋ฌธ์, ๋ฌด์์ด ๋จผ์ ์คํ๋์๋์ ๋ฐ๋ผ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
ํ์ง๋ง AfterEach๋ฉ์๋๋ฅผ ๋ง๋ค์ด์ฃผ๋ฉด, ๋ฉ์๋ ์คํ์ด ๋๋ ๋๋ง๋ค ์ ์ฅ์์ ๋ด์ฉ๋ค์ ๋ชจ๋ ์ญ์ ํด์ค ์ ์๋ค.
@AfterEach
public void afterEach(){
repository.clearStore();
}
-> Test์ ์๋ MemoryMemberRepository์์.
public void clearStore(){
store.clear();
}
-> main์ ์๋ MemoryMemberRepository์์.
ํ
์คํธ ํด๋์ค๋ฅผ ๋จผ์ ์์ฑํ ๋ค์์ ๋ฉค๋ฒ ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ์์ฑํ ์๋ ์๋ค.
TDD(ํ
์คํธ ์ฃผ๋ ๊ฐ๋ฐ): ํ์ ๋จผ์ ๋ง๋๋ ๊ฒ์ผ๋ก, ํ
์คํธ๋ฅผ ๋จผ์ ๋ง๋ค๊ณ ๊ตฌํ ํด๋์ค๋ฅผ ๋ง๋ค์ด์ ๋๋ ค๋ณด๋ ๊ฒ์ ์๋ฏธํ๋ค.
๐กํ์ ์๋น์ค ๊ฐ๋ฐ
ํ์ ์๋น์ค๋ ์ด์ ์ ๋ง๋ค์๋ ํ์ domain๊ณผ repository๋ฅผ ํ์ฉํ์ฌ ์ค์ ๋น์ฆ๋์ค ๋ก์ง์ ์์ฑํ๋ ๊ฒ์ด๋ค.

์์ ๊ฐ์ ๊ฒฝ๋ก์ service๋ผ๋ ํจํค์ง์ MemberService๋ผ๋ class๋ฅผ ๋ง๋ค์ด์ฃผ์๋ค.
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) {
//๊ฐ์ ์ด๋ฆ์ด ์๋ ์ค๋ณต ํ์X
// Optional<Member> result = memberRepository.findByName(member.getName());
// result.ifPresent(m -> {
// throw new IllegalStateException("์ด๋ฏธ ์กด์ฌํ๋ ํ์์
๋๋ค.");
// });
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);
}
}
join ๋ฉ์๋๋ฅผ ์์ฑํ๋ฉด์, ์ค๋ณต ํ์ ๊ฒ์ฆ์ ํ๋ ๋ฉ์๋๋ฅผ ์๋ก ๋ง๋ค์ด ์ฃผ์๊ณ ,
์ด์ด์ ์ ์ฒด ํ์์ ์กฐํํ๋ findMembers๋ฉ์๋์
id๋ก ํ์์ ์กฐํํ๋ findOne๋ฉ์๋๋ฅผ ๋ง๋ค์ด์ฃผ์๋ค.
๐กํ์ ์๋น์ค ํ ์คํธ

MemberService ํ์ผ์์ Generate -> Test๋ฅผ ๋๋ฅด๋ฉด

์ ๊ฒฝ๋ก์ ์๋์ผ๋ก MemberServiceTest๊ฐ ์๊ธด๋ค.
package hello.hellospring.service;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class MemberServiceTest {
@Test
void join() {
}
@Test
void findMembers() {
}
@Test
void findOne() {
}
}
-> ์์ ๊ฐ์ ์ฝ๋๋ค์ด ์๋์ผ๋ก ์์ฑ
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.Test;
import java.util.Optional;
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
Long saveId = memberService.join(member);
//then
Member findMember = memberService.findOne(saveId).get();
//memberRepository์์ ๊ฐ์ ธ์์ ๋น๊ตํด์ผ๋๋๊น ๊ฐ๋จํ findOne์ผ๋ก ๊ฐ์ฒด ๊ฐ์ ธ์ด
// ํ์๊ฐ์
ํ member์ id๊ฐ ์ ์ฅ์์ ์์ผ๋ฉด, ํด๋น member ๊ฐ์ฒด๋ฅผ findMember๋ก
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);
// try{
// memberService.join(member2); //validate์์ ๊ฑธ๋ ค์ ์์ธ๊ฐ ํฐ์ง
// fail();
// } catch (IllegalStateException e){
// assertThat(e.getMessage()).isEqualTo("์ด๋ฏธ ์กด์ฌํ๋ ํ์์
๋๋ค.");
// }
//try catch๋ฌธ์ ๋ฒ๊ฑฐ๋ก์
IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));
assertThat(e.getMessage()).isEqualTo("์ด๋ฏธ ์กด์ฌํ๋ ํ์์
๋๋ค.");
//then
}
@Test
void findMembers() {
}
@Test
void findOne() {
}
}
ํ์๊ฐ์
test ์ฝ๋์ ์ค๋ณต ํ์ ์์ธ test์ฝ๋๋ ์์ฑํด์ฃผ์๋ค.
์ ์ฅ์์ ์ค๋ณต๋ ํ์์ด ์์ ๊ฒฝ์ฐ ์ ์ฝ๋์ ๋ฐ๋ผ ์ ์์ ์ผ๋ก ์์ธ ์ฒ๋ฆฌ๊ฐ ๋๋ค.
MemberService memberService = new MemberService();
MemoryMemberRepository memberRepository = new MemoryMemberRepository();
@AfterEach // ๋ฉ์๋ ์คํ์ด ๋๋ ๋๋ง๋ค ์คํ๋จ
public void afterEach() {
memberRepository.clearStore(); // ์ ์ฅ์ ๋ด์ฉ ๋ค ์ง์
}
์ด๋ฒ์๋ ์ ๋ฒ์ฒ๋ผ ๊ฐ ๋ฉ์๋์ ์คํ์ด ๋๋ ๋๋ง๋ค ์ ์ฅ์์ ์๋ ๋ด์ฉ์ ์ง์์ค๋ค.
๐จ ๐จ ๐จ ๊ทธ๋ฌ๋ ํ์ ๋ฆฌํฌ์งํ ๋ฆฌ ํ
์คํธ ์ผ์ด์ค ์ฒ๋ผ memberRepository์ ๋ด์ฉ์ ์ง์ฐ๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
์๋ํ๋ฉด memberService ๊ฐ์ฒด๊ฐ ์๋ ์๋ก์ด memberRepository ์ ์ฅ์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋์ ๋ค๋ฅธ ๋ด์ฉ์ ์ง์ธ ์ ์๋ ์ํ์ด ์๊ธฐ ๋๋ฌธ์ ์์ ๋ฐฉ๋ฒ์ด ์๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก clearStore() ๋ฅผ ํด์ผํ๋ค.
์ง๊ธ์ MemoryMemberRepository ์ ์ฅ์๊ฐ static์ด๋ผ์ ๋ฌธ์ ๋ ์์ง๋ง, ํน์๋ผ๋ static์ด ์๋ ๊ฒฝ์ฐ ์๋น์ค์ ์ ์ฅ์๊ฐ ์๋ ๋ค๋ฅธ ์ ์ฅ์๋ฅผ ์ฒ๋ฆฌํ๊ฒ ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค. (์ถ์ฒ: easylog)
private static Map<Long, Member> store = new HashMap<>();
๐กํ์ ์๋น์ค ํ ์คํธ - clearStore, DI
์์ ๊ฐ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ MemberService์ memberRepository๋ฅผ ์ธ๋ถ์์ ๋ฃ์ด์ฃผ๋๋ก ๋ณ๊ฒฝํ๋ฉด ๋๋ค.
src/main/java/hello.hellospring/service/MemberService ํ์ผ์์์ ์์
private final MemberRepository memberRepository;
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
src/test/java/hello.hellospring/service/MemberServiceTest ํ์ผ์์์ ์์
MemberService memberService;
MemoryMemberRepository memberRepository;
@BeforeEach // ๋ฉ์๋ ์์๋๊ธฐ ์
public void beforeEach() {
memberRepository = new MemoryMemberRepository();
memberService = new MemberService(memberRepository);
}
@AfterEach // ๋ฉ์๋ ์์๋ ํ
public void afterEach() {
memberRepository.clearStore();
}
์ด๋ฌ๋ฉด ์ด์ ๊ฐ์ memberRepository๊ฐ ์์ฑ์ด ๋๊ณ , ๋ฉ์๋๊ฐ ๋๋๋ฉด memberRepository๋ฅผ clear ํ๊ฒ ๋๋ค.
์ด๋ฅผ DI(Dependency Injection)์ด๋ผ๊ณ ํ๋ค.
'Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
- Total
- Today
- Yesterday
- ์ธํ ๋ฆฌ์ ์ด
- ํ์ํํด
- ๋ก๊น
- JPA
- ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ
- SQL
- ์ปค๋ฎค๋ํฐ
- ์นMVC
- ์คํ๋ง๋ถํธ
- ์ง์ฐ๋ก๋ฉ
- ๋น์์
- elasticsearch
- SQLD
- DP
- ํ๋ก ํธ์๋
- ์น MVC
- ๋ฐฑ์ค
- ์๋ฐ ์คํ๋ง
- ๋ถ๋งํฌ
- ์๋ฐ
- ์์
- ์ค์์
- ํ์ด์ฌ
- ๋ก๊ทธ์์
- ์คํ๋ง
- EnumType.ORDINAL
- SQL ๋ ๋ฒจ์
- ๋ฐฑ์ค ํ์ด์ฌ
- ์คํ๋ง ๋ถ๋งํฌ
- ์คํ๋ง ์ปค๋ฎค๋ํฐ
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |