๋ฐฑ์—”๋“œ(Back-End) ๊ฐœ๋ฐœ/SpringBoot

[SpringBoot] 3.3_ํšŒ์› ์„œ๋น„์Šค ๊ฐœ๋ฐœ ๋ฐ ํ…Œ์ŠคํŠธ

rabo93 2025. 2. 25. 22:29
ํšŒ์› ๊ฐ€์ž… & ํšŒ์› ์กฐํšŒ
package hello.hello_spring.service;

import hello.hello_spring.domain.Member;
import hello.hello_spring.repository.MemberRepository;
import hello.hello_spring.repository.MemoryMemberRepository;

import java.util.List;
import java.util.Optional;

public class MemberService {
    // private final MemberRepository memberRepository = new MemoryMemberRepository();
    // DI (์˜์กด์„ฑ ์ฃผ์ž…) ํŒจํ„ด์œผ๋กœ ๋ฐ”๊พธ๊ธฐ
    private final MemberRepository memberRepository;
    public MemberService(MemoryMemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

    /*
    * ํšŒ์›๊ฐ€์ž…
    * */
    public long join(Member member) {
        //๊ฐ™์€ ์ด๋ฆ„์ด ์žˆ๋Š” ์ค‘๋ณต ํšŒ์› X
//        Optional<Member> result = memberRepository.findByName(member.getName()); // ctrl+alt+V : ๋ณ€์ˆ˜ ์ถ”์ถœํ•˜๊ธฐ
//        result.ifPresent(m -> { //Optional=> ifPresent()๋ฉ”์„œ๋“œ : ๊ฐ’์ด ์žˆ์œผ๋ฉด!
//            throw new IllegalStateException("์ด๋ฏธ ์กด์žฌํ•˜๋Š” ํšŒ์›์ž…๋‹ˆ๋‹ค.");
//        });
        //=> ์ค‘๋ณต ์ฝ”๋“œ ์ •๋ฆฌ
//        memberRepository.findByName(member.getName())
//                .ifPresent(m -> {
//                    throw new IllegalStateException("์ด๋ฏธ ์กด์žฌํ•˜๋Š” ํšŒ์›์ž…๋‹ˆ๋‹ค.");
//                });
        //=> ๋ฉ”์„œ๋“œ ์ถ”์ถœ (ctrl+alt+T ->7.๋ฉ”์„œ๋“œ ์ถ”์ถœ)
        validateDuplicateMember(member); // ์ค‘๋ณต ํšŒ์› ๊ฒ€์ฆ
        memberRepository.save(member);
        return member.getId(); //longํƒ€์ž…์˜ id๊ฐ€ ๋ฆฌํ„ด๋จ
    }

    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);
    }


}

 

 

 


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

 

ํ…Œ์ŠคํŠธํ•  ํด๋ž˜์Šค์—์„œ ๋‹จ์ถ•ํ‚ค ctrl + shift + T > ์ƒˆ ํ…Œ์ŠคํŠธ ์ƒ์„ฑ > ํ…Œ์ŠคํŠธํ•  ๋ฉ”์„œ๋“œ ํด๋ฆญ > ํ™•์ธ

 

package hello.hello_spring.service;

import hello.hello_spring.domain.Member;
import hello.hello_spring.repository.MemoryMemberRepository;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import static org.assertj.core.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.assertThrows;

class MemberServiceTest {

    //MemberService memberService = new MemberService();
    //MemoryMemberRepository memberRepository = new MemoryMemberRepository();
    //=> ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ, ๊ธฐ์กด์˜ Repository๋กœ ํ…Œ์ŠคํŠธํ•ด์•ผํ•œ๋‹ค.
    MemberService memberService;
    MemoryMemberRepository memberRepository;
    
    //@BeforeEach : ๊ฐ ํ…Œ์ŠคํŠธ ์‹คํ–‰ ์ „์— ํ˜ธ์ถœ๋œ๋‹ค. ํ…Œ์ŠคํŠธ๊ฐ€ ์„œ๋กœ ์˜ํ–ฅ์ด ์—†๋„๋ก ํ•ญ์ƒ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์˜์กด๊ด€๊ณ„๋„ ์ƒˆ๋กœ ๋งบ์–ด์ค€๋‹ค.
    @BeforeEach
    public void beforeEach() {
        memberRepository = new MemoryMemberRepository();
        memberService = new MemberService(memberRepository);
    }

    @AfterEach
    public void aferEach() {
        memberRepository.clearStore();
    }

    @Test
    void ํšŒ์›๊ฐ€์ž…() { // ํ…Œ์ŠคํŠธ๋Š” ๋ฉ”์„œ๋“œ๋ช…์„ ํ•œ๊ธ€๋กœ ์ ์–ด๋„ ๋จ.(์ง๊ด€์ ์œผ๋กœ ๋ณด๊ธฐ ์œ„ํ•ด)
        //ํ…Œ์ŠคํŠธ๋ฅผ ํ• ๋•Œ๋Š” given~when~then ํŒจํ„ด์œผ๋กœ ์ž‘์„ฑํ•˜๋Š”๊ฒŒ ์ผ๋ฐ˜์ 
        //given
        Member member = new Member();
        member.setName("spring");

        //when
        Long saveId = memberService.join(member);

        //then
        Member findMember = memberService.findOne(saveId).get();
        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);
//        memberService.join(member2);
        //=> ์ด๋ฆ„์„ ๊ฐ™๊ฒŒ ๋„ฃ์–ด์„œ ํšŒ์›๊ฐ€์ž…ํ•œ ๊ฒฝ์šฐ ํ…Œ์ŠคํŠธ ์‹คํŒจํ•จ.
        //=> java.lang.IllegalStateException: ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ํšŒ์›์ž…๋‹ˆ๋‹ค.

        /*
        try {
            memberService.join(member2);
            fail();
        } catch (IllegalStateException e) {
            assertThat(e.getMessage()).isEqualTo("์ด๋ฏธ ์กด์žฌํ•˜๋Š” ํšŒ์›์ž…๋‹ˆ๋‹ค.123123");
        }
        */
        assertThrows(IllegalStateException.class, () -> memberService
                .join(member2));


        //then
    }



    @Test
    void findMembers() {
    }

    @Test
    void findOne() {
    }
}