๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŒฟ Spring

[์ž…๋ฌธ] ํšŒ์› ๊ด€๋ฆฌ ์˜ˆ์ œ(1) - domain, repository, test case

by nitronium102 2021. 8. 15.

<๋ชฉ์ฐจ>

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

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

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

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

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

 

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

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

 

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

  • ์ปจํŠธ๋กค๋Ÿฌ : ์›น MVC์˜ ์ปจํŠธ๋กค๋Ÿฌ ์—ญํ• 
  • ์„œ๋น„์Šค : ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๊ตฌํ˜„
  • ๋ ˆํฌ์ง€ํ† ๋ฆฌ : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผ, ๋„๋ฉ”์ธ ๊ฐ์ฒด๋ฅผ DB์— ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌ
  • ๋„๋ฉ”์ธ : ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ ๊ฐ์ฒด (ex. ํšŒ์›, ์ฃผ๋ฌธ, ์ฟ ํฐ ๋“ฑ -> ์ฃผ๋กœ DB์— ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌ๋จ)

 

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

  • ์•„์ง ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ๊ฐ€ ์„ ์ •๋˜์ง€ ์•Š์•„์„œ, ์šฐ์„  ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„
  • ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ๋Š” RDB, NoSQL ๋“ฑ๋“ฑ ๋‹ค์–‘ํ•œ ์ €์žฅ์†Œ๋ฅผ ๊ณ ๋ฏผ์ค‘์ธ ์ƒํ™ฉ์œผ๋กœ ๊ฐ€์ •
  • ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ดˆ๊ธฐ ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ๋Š” ๊ตฌํ˜„์ฒด๋กœ ๊ฐ€๋ฒผ์šด ๋ฉ”๋ชจ๋ฆฌ ๊ธฐ๋ฐ˜์˜ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ ์‚ฌ์šฉ

 

02. ํšŒ์› ๋„๋ฉ”์ธ๊ณผ ๋ ˆํฌ์ง€ํ† ๋ฆฌ ์ƒ์„ฑ

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

ํšŒ์› ๊ฐ์ฒด(domain)

๋”๋ณด๊ธฐ
๋”๋ณด๊ธฐ
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;
 }
}

 

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

๋”๋ณด๊ธฐ
๋”๋ณด๊ธฐ
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); // null๊ฐ’ ์žˆ์„ ๊ฒฝ์šฐ optional๋กœ ๊ฐ์‹ธ์„œ ๋ฐ˜ํ™˜
	Optional<Member> findByName(String name);
	List<Member> findAll();
}

 

 

 

๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ null๊ฐ’์ด ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ Optional๋กœ ๊ฐ์‹ธ์ฃผ๋ฉด ์ข‹๋‹ค.

 

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

๋”๋ณด๊ธฐ
๋”๋ณด๊ธฐ
package hello.hellospring.repository;

import hello.hellospring.domain.Member;

import java.util.*;

public class MemoryMemberRepository implements MemberRepository{
	// ๋™์‹œ์„ฑ ๋ฌธ์ œ ๊ณ ๋ ค X
	private static Map<Long, Member> store = new HashMap<>();
	private static long sequence = 0L; // ์‹œํ€€์Šค ๊ฐ’ ์ƒ์„ฑ(1, 2, 3...)

	@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)); // null๊ฐ’ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ Optional.ofNullable๋กœ ๊ฐ์‹ธ๊ธฐ
	}

	@Override
	public Optional<Member> findByName(String name) {
		return store.values().stream()
			.filter(member -> member.getName().equals(name))
			.findAny(); // ํ•˜๋‚˜๋ผ๋„ ์ฐพ๊ธฐ(Optional๋กœ ๋ฐ˜ํ™˜
	}

	@Override
	public List<Member> findAll() {
		return new ArrayList<>(store.values());
	}

	public void clearStore(){
		store.clear();
	}
}
  • Optional.ofNullable()์„ ์‚ฌ์šฉํ•˜๋ฉด null๊ฐ’์ด ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ์˜ค๋ฅ˜์—†์ด ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ˜„์žฌ HashMap๊ณผ Long์„ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ, ์‹ค๋ฌด์—์„œ๋Š” ๋™์‹œ์„ฑ ๋ฌธ์ œ ๋•Œ๋ฌธ์— ConcurrentHashMap๊ณผ AtomicLong์„ ์‚ฌ์šฉํ•œ๋‹ค.

+ ๋žŒ๋‹ค์‹ ๊นŒ๋จน์–ด์„œ ๊ธ‰ํ•˜๊ฒŒ ์ •๋ฆฌ https://dev-minji.tistory.com/19

 

[JAVA] ๋žŒ๋‹ค์‹๊ณผ Stream API(filter, map, limit, sorted, peek ๋“ฑ)

๊ณต๋ถ€ํ•˜๋‹ค๊ฐ€ ๋žŒ๋‹ค์‹์ด๋ž‘ ์ŠคํŠธ๋ฆผ ๋‚˜์™€์„œ ์ •๋ฆฌํ• ๊ฒธ ์ ์–ด๋ณธ๋‹ค ๋žŒ๋‹ค์‹์ด๋ž€? JAVA 8๋ถ€ํ„ฐ ์ถ”๊ฐ€๋œ ํ‘œํ˜„ ๋ฐฉ์‹ ์ค‘ ํ•˜๋‚˜๋กœ ํ•จ์ˆ˜ํ˜• ํ‘œํ˜„๋ฐฉ์‹์ด๋‹ค. ๋ฉ”์†Œ๋“œ๋ฅผ ํ•˜๋‚˜์˜ ๊ฐ„๊ฒฐํ•œ ์‹์œผ๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ์ด๋‹ค. ๋ฉ”์†Œ๋“œ๋ฅผ ๋žŒ

dev-minji.tistory.com

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

๊ฐœ๋ฐœํ•œ ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•ด์„œ ํ…Œ์ŠคํŠธ ํ•  ๋•Œ ์ž๋ฐ”์˜ main ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด์„œ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜, ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ†ตํ•ด์„œ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์€ ์ค€๋น„ํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š”๋ฐ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ณ , ๋ฐ˜๋ณต ์‹คํ–‰ํ•˜๊ธฐ ์–ด๋ ต๊ณ  ์—ฌ๋Ÿฌ ํ…Œ์ŠคํŠธ๋ฅผ ํ•œ๋ฒˆ์— ์‹คํ–‰ํ•˜๊ธฐ ์–ด๋ ต๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. ์ž๋ฐ”๋Š” JUnit์ด๋ผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ด์„œ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค.

https://dev-minji.tistory.com/66

 

[JUnit] ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ž‘์„ฑ(Assertions, assertEquals, assertThat)

JUnit์ด๋ž€? ์ž๋ฐ”์šฉ ์œ ๋‹› ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ, ๊ตฌํ˜„ํ•œ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฉฐ ํด๋ž˜์Šค ๋ ˆ๋ฒจ ๋‹จ์œ„๋กœ๋„ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ๊ฒ€์ฆ ๋ฐฉ๋ฒ• 01. Println()์œผ๋กœ ์ถœ๋ ฅ System.out.

dev-minji.tistory.com

  • ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ์žฅ์ ์€ ํด๋ž˜์Šค ๋‹จ์œ„(๋ ˆ๋ฒจ)์—์„œ ์‹คํ–‰๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์ ์ด๋‹ค.
  • hello.hellospring ํŒจํ‚ค์ง€์—์„œ ์‹คํ–‰ํ•˜๋ฉด ์ „์ฒด ํด๋ž˜์Šค ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ
  • test๋Š” ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ, public์ด ์•„๋‹ˆ์–ด๋„ ๊ดœ์ฐฎ๋‹ค.

ํšŒ์› ๋ ˆํฌ์ง€ํ† ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌํ˜„์ฒด ํ…Œ์ŠคํŠธ

src/test/java ํ•˜์œ„ ํด๋”์— ์ƒ์„ฑํ•œ๋‹ค.

๋”๋ณด๊ธฐ
๋”๋ณด๊ธฐ
package hello.hellospring.repository;

import hello.hellospring.domain.Member;
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.*;

class MemoryMemberRepositoryTest {
   MemoryMemberRepository repository = new MemoryMemberRepository();
   
   @AfterEach
   public void afterEach() {
   	repository.clearStore();
   }
   
   @Test
   public void save() {
     //given
     Member member = new Member();
     member.setName("spring");
     //when
     repository.save(member);
     //then
     Member result = repository.findById(member.getId()).get();
     assertThat(result).isEqualTo(member);
   }
   
   @Test
   public void findByName() {
     //given
     Member member1 = new Member();
     member1.setName("spring1");
     repository.save(member1);
     Member member2 = new Member();
     member2.setName("spring2");
     repository.save(member2);
     //when
     Member result = repository.findByName("spring1").get();
     //then
     assertThat(result).isEqualTo(member1);
   }
   
   @Test
   public void findAll() {
     //given
     Member member1 = new Member();
     member1.setName("spring1");
     repository.save(member1);
     Member member2 = new Member();
     member2.setName("spring2");
     repository.save(member2);
     //when
     List<Member> result = repository.findAll();
     //then
     assertThat(result.size()).isEqualTo(2);
   }
}

 

01. ํ…Œ์ŠคํŠธ๋ฅผ ํ•  ๋•Œ GIVEN / WHEN / THEN ์„ธ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ„์–ด ์ง„ํ–‰ํ•œ๋‹ค

  • given : ์ฃผ์–ด์ง„ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฌด์—‡์ธ์ง€
  • when : ๊ฒ€์ฆ ์กฐ๊ฑด์ด ๋ฌด์—‡์ธ์ง€
  • then : ๋‚˜์™€์•ผ ํ•˜๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋ฌด์—‡์ธ์ง€
@Test
 public void save() {
   //given
   Member member = new Member();
   member.setName("spring");
   
   //when
   repository.save(member);
   
   //then
   Member result = repository.findById(member.getId()).get();
   assertThat(result).isEqualTo(member);
 }

 

02. @AfterEach(์ฝœ๋ฐฑ ๋ฉ”์†Œ๋“œ)

/* main/java/repository/MemoryMemberRepository.java */
public void clearStore(){
	store.clear();
}
/* test/java/repository/MemoryMemberRepositoryTest.java */
MemoryMemberRepository repository = new MemoryMemberRepository();
 @AfterEach
 public void afterEach() {
 	repository.clearStore();
 }

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

 

03. ํ…Œ์ŠคํŠธ๋Š” ๊ฐ๊ฐ ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰๋˜์–ด์•ผ ํ•œ๋‹ค. 

ํ…Œ์ŠคํŠธ ์ˆœ์„œ์— ์˜์กด๊ด€๊ณ„๊ฐ€ ์žˆ๋Š” ๊ฒƒ์€ ์ข‹์€ ํ…Œ์ŠคํŠธ๊ฐ€ ์•„๋‹ˆ๋‹ค. 

 

๋Œ“๊ธ€