MapleStory Cookie With Halo

๐Ÿƒ Spring/๐Ÿƒ Spring Boot

[SpringBoot][JUnit]ํšŒ์›๊ด€๋ฆฌ-๋„๋ฉ”์ธ๊ณผ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๊ทธ๋ฆฌ๊ณ  ํ…Œ์ŠคํŠธ

๋‰ด์ด NUEY 2025. 1. 4. 19:16
๋ฐ˜์‘ํ˜•

 

Domain & @Repository

domain์€ ๋ฐ์ดํ„ฐ์šฉ์ด๋ผ Repository ๊ตฌํ˜„ ํด๋ž˜์Šค์ธ MemoryMemberRepository์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

  • @Repository ๋ฅผ ๋ ˆํฌ์ง€ํ† ๋ฆฌ ํด๋ž˜์Šค ์œ„์— ๋ถ™์—ฌ์ค๋‹ˆ๋‹ค.
  • private static Map<Long, Member> store : save()์‹œ ์ €์žฅํ•  ๋ฐ์ดํ„ฐ์šฉ์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • private static long sequence : 0, 1, 2...์‹์œผ๋กœ ์นด์šดํŠธ๋ฅผ ์„ธ๋Š” ์‹œํ€€์Šค ๊ทธ ์ž์ฒด.

  • save() : ๋ฉค๋ฒ„ ์ €์žฅ์šฉ.

  • findId() : id๋กœ ๋ฉค๋ฒ„๊ฐ€ ์žˆ๋Š” ์ง€ ํ™•์ธํ•˜๋Š”๋ฐ, null์ด๋ฉด Optional์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  • findByName()
    1. store.values().stream() : store ๋งต์˜ ๊ฐ’๋“ค๋งŒ ๋ถˆ๋Ÿฌ์™€ Stream์„ ๋งŒ๋“  ๋’ค
    2. .filter(member -> member.getName().equals(name)) : ์ผ์น˜ํ•˜๋Š” ์ด๋ฆ„์ด ์ผ์น˜ํ•˜๋Š” ๊ฒƒ๋“ค์„ ์ฐพ์Šต๋‹ˆ๋‹ค.
    3. .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

 

  1. test ํด๋”์— repository ํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“ค๊ณ  ๊ทธ ์•ˆ์— ๊ตฌํ˜„ํด๋ž˜์Šค+Test๋ฅผ ๋ถ™์ธ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
    ํด๋”์œ„์น˜
  2. ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค
    • ์ฝ”๋“œ
      ์ฐธ๊ณ ๋กœ ๋งจ์•„๋ž˜ 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 ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์—ฌ์ค๋‹ˆ๋‹ค.

    • ๋ฉ”์„œ๋“œ ์•ˆ์— ๋„๋ฉ”์ธ์„ ์ด์šฉํ•ด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ ์Šต๋‹ˆ๋‹ค.
       
  3. ํ…Œ์ŠคํŠธ ์‹คํ–‰
    1. ์™ผ์ชฝ ์ฝ”๋“œ๋ผ์ธ์— ์žˆ๋Š” โœ…๋ฒ„ํŠผ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
      ๐ŸŒŸ ํ…Œ์ŠคํŠธ ์‹คํ–‰ ์‹œ ์—ฌ๊ธฐ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค!
    2. TEST RESULTS๋ž€์— ๊ฒฐ๊ณผ๊ฐ€ ๋œน๋‹ˆ๋‹ค.
      ์„ฑ๊ณต์‹œ
      ์‹คํŒจ์‹œ

 

Assertions ํŒจํ‚ค์ง€

 

 

 

์œ„ ์ฝ”๋“œ์— ์‚ฌ์šฉ๋œ ๊ฒƒ์€ 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๊ณผ ๊ฑฐ์˜ ์œ ์‚ฌํ•˜๋‹ค.

 


 

 

๐ŸŒŸ ๋ณดํ†ต import static ์„ ์ด์šฉํ•ด ๋” ๊ฐ„๋‹จํžˆ ์‚ฌ์šฉํ•œ๋‹ค.

 

 


 

ํ…Œ์ŠคํŠธํด๋ž˜์Šค ์ „์ฒด๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋ ค๋ฉด ํด๋ž˜์Šค ์˜†์˜ run tests ๋ฒ„ํŠผ์„ ํด๋ฆญ.

 


 

ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค๊ฐ€ ๋งŽ์•„์ง€๋ฉด ํŒจํ‚ค์ง€๋ฅผ ์„ ํƒํ•ด ์ „์ฒด ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

 


 


 

 

 

 

@AfterEach
: ํ…Œ์ŠคํŠธ๊ฐ€ ๋๋‚  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋œ๋‹ค.

 

 

โ€ป ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š” ์ด์œ  : ํด๋ž˜์Šค ์ „์ฒด๋ฅผ ํ…Œ์ŠคํŠธrunํ–ˆ๋”๋‹ˆ ์—๋Ÿฌ๊ฐ€ ๋‚ฌ๋‹ค. ๋„๋ฉ”์ธ์œผ๋กœ ๋งŒ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ์ค‘๋ณต๋˜์„œ ์žˆ๋‹ค.

 

๐ŸŒŸ ๋”ฐ๋ผ์„œ ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค @AfterEach๋ฅผ ์ด์šฉํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•ด, ๋„๋ฉ”์ธ์œผ๋กœ ๋งŒ๋“  ๋ฐ์ดํ„ฐ๋ฅผ clearํ•ด์ฃผ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.

 

  1. ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๊ตฌํ˜„ํด๋ž˜์Šค์— store.clear(); ๋ฅผ ๋‹ด์€ ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ ๋‹ค.
  2. ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค @AfterEach ๋ฉ”์„œ๋“œ์— repository.clearStore(); ๋ฅผ ์ ๋Š”๋‹ค.
  3. ํ…Œ์ŠคํŠธ ์‹คํ–‰๊ฒฐ๊ณผ.
    ์ •์ƒ์ ์œผ๋กœ ๋ชจ๋‘ ์ž˜ ํ…Œ์ŠคํŠธ๋œ ๊ฒŒ ํ™•์ธ๋œ๋‹ค.

 

๐Ÿ’ก ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ TDD
ํ…Œ์ŠคํŠธ๋ฅผ ๋จผ์ € ๋งŒ๋“ค๊ณ  ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋‹ค๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

 


โ€ป ์ฐธ์กฐ : https://www.inflearn.com/roadmaps/373

๋ฐ˜์‘ํ˜•