[Spring][혼곡] 4. νšŒμ› 관리 예제 - (4) νšŒμ› μ„œλΉ„μŠ€ 개발

2021. 8. 12. 22:04Β·πŸ“ Language/✏ JAVA

νšŒμ› 관리 예제

4. νšŒμ› μ„œλΉ„μŠ€ 개발

1) νšŒμ› μ„œλΉ„μŠ€ λ§Œλ“€κΈ°

service/MemberService.java

  • service νŒ¨ν‚€μ§€ 생성
  • MemberService 클래슀 생성
  • νšŒμ› 리포지토리와 도메인을 ν™œμš©ν•˜μ—¬ μ‹€μ œ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ κ΅¬ν˜„ν•  것이닀.
  • νšŒμ› λ¦¬ν¬μ§€ν† λ¦¬λŠ” λ©”μ„œλ“œλ₯Ό 개발자 μΉœν™”μ μΈ μ΄λ¦„μœΌλ‘œ κ΅¬ν˜„ν•˜μ§€λ§Œ, νšŒμ› μ„œλΉ„μŠ€λŠ” λΉ„μ¦ˆλ‹ˆμŠ€ μΉœν™”μ μΈ μ΄λ¦„μœΌλ‘œ κ΅¬ν˜„ν•œλ‹€.
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();

    // νšŒμ› κ°€μž…
    public long join(Member member) {
        validateDuplicateMember(member);
        memberRepository.save(member);
        return member.getId();
    }

    // λΉ„μ¦ˆλ‹ˆμŠ€ 둜직: 같은 이름인 νšŒμ›μ€ μ•ˆλœλ‹€.
    private void validateDuplicateMember(Member member) {
        // λ°˜ν™˜ 값을 Optional 인자둜 λ°›μ•„ μ‚¬μš©ν•  μˆ˜λ„ μžˆμ§€λ§Œ,
        // λ°˜ν™˜λ°›μ§€ μ•Šκ³  λ°”λ‘œ μ‚¬μš©ν•˜λŠ” 방법을 ꢌμž₯ν•œλ‹€.
        memberRepository.findByName(member.getName())
                .ifPresent(member1 -> { // null이 μ•„λ‹Œ 값이 μ‘΄μž¬ν•œλ‹€λ©΄ {} λ©”μ†Œλ“œ μ‹€ν–‰
                    throw new IllegalStateException("이미 μ‘΄μž¬ν•˜λŠ” νšŒμ›μž…λ‹ˆλ‹€.");
                });

        // Optional 값을 κΊΌλ‚Ό 땐 get()을 μ‚¬μš©ν•˜λŠ” 방법도 μžˆμ§€λ§Œ,
        // orElseGet()을 톡해 값이 μžˆλ‹€λ©΄ κΊΌλ‚΄κ³  μ—†λ‹€λ©΄ μ•ˆμ— λ©”μ†Œλ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” 방법을 많이 μ“΄λ‹€.
    }

    // 전체 νšŒμ› 쑰회
    public List<Member> findMembers() {
        return memberRepository.findAll();
    }

    // νšŒμ› 쑰회
    public Optional<Member> findOne(Long memberId) {
        return memberRepository.findById(memberId);
    }
}

 

2) ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€ μ‰½κ²Œ λ§Œλ“œλŠ” 법

Ctrl + Shift + T λˆ„λ₯Έ ν›„ ν…ŒμŠ€νŠΈν•  Member ν•­λͺ© μ„ νƒν•˜κ³  Ok ν•˜λ©΄ νŒ¨ν‚€μ§€, ν…ŒμŠ€νŠΈ Class λͺ¨λ‘ μžλ™μœΌλ‘œ μƒμ„±λœλ‹€.

Ctrl + Shift + T

 

3) νšŒμ› μ„œλΉ„μŠ€ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€ μž‘μ„±

service/MemberServiceTest.java

  • ν…ŒμŠ€νŠΈ μ½”λ“œ 내에선 ν•œκΈ€λ‘œ 넀이밍해도 λ¬΄κ΄€ν•˜λ‹€.
  • ν…ŒμŠ€νŠΈ μ½”λ“œλŠ” λΉŒλ“œ μ‹œ ν¬ν•¨λ˜μ§€ μ•ŠλŠ”λ‹€.
  • @BeforeEach: 각 ν…ŒμŠ€νŠΈ μ‹€ν–‰ 전에 ν˜ΈμΆœλœλ‹€. ν…ŒμŠ€νŠΈκ°€ μ„œλ‘œ 영ν–₯이 없도둝 항상 μƒˆλ‘œμš΄ 객체λ₯Ό μƒμ„±ν•˜κ³ , 
    의쑴 관계도 μƒˆλ‘œ λ§Ίμ–΄μ€€λ‹€.
package hello.hello.spring.service;

import hello.hello.spring.domain.Member;
import hello.hello.spring.repository.MemberRepository;
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 java.util.Optional;

import static org.junit.jupiter.api.Assertions.*;

class MemberServiceTest {

    MemberService memberService;
    MemoryMemberRepository memberRepository;

    // MemoryMemberRepository μ•ˆ store λ°μ΄ν„°λŠ” static 선언이라
    // μ‚¬μš©ν•  λ•Œλ§ˆλ‹€ new()둜 생성해도 λ¬΄λ°©ν•˜μ§€λ§Œ κ·Έλž˜λ„ 각각 λ‹€λ₯Έ 객체둜 κ΄€λ¦¬ν•˜λŠ” 것은 μ’‹μ§€ μ•Šλ‹€.
    // MemberRepository 인자둜 λ°›λŠ” μƒμ„±μž κ΅¬ν˜„ν•˜μ—¬ λ™μΌν•œ λ©”λͺ¨λ¦¬ 객체λ₯Ό μ‚¬μš©ν•˜λ„λ‘ λ³€κ²½ν•˜μž

    @BeforeEach
    public void beforeEach() {
        memberRepository = new MemoryMemberRepository();
        memberService = new MemberService(memberRepository);
    }

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

    @Test
    void νšŒμ›κ°€μž…() {
        // given
        Member member = new Member();
        member.setName("hello");

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

        // then
        Member findMember = memberService.findOne(saveId).get();
        Assertions.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);
        // 였λ₯Έμͺ½ λžŒλ‹€λ₯Ό μ‹€ν–‰ν•  λ•Œ μ™Όμͺ½ μ˜ˆμ™Έκ°€ λ°œμƒν•˜λŠ”μ§€ 체크
        IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));
        Assertions.assertThat(e.getMessage()).isEqualTo("이미 μ‘΄μž¬ν•˜λŠ” νšŒμ›μž…λ‹ˆλ‹€.");

/*
        try {
            memberService.join(member2); // μ˜ˆμ™Έ λ°œμƒ 체크
            fail(); // μ˜ˆμ™Έ λ°œμƒμ΄ μ•ˆλ˜λ©΄ μ‹€νŒ¨ 처리
       } catch (IllegalStateException e){ // μ˜ˆμ™Έ λ°œμƒ
            Assertions.assertThat(e.getMessage()).isEqualTo("이미 μ‘΄μž¬ν•˜λŠ” νšŒμ›μž…λ‹ˆλ‹€.");
        }
*/
    }

    @Test
    void findMembers() {
    }

    @Test
    void findOne() {
    }
}

 

public class MemberService {

    private final MemberRepository memberRepository;

    // DI: MemberService μž…μž₯μ—μ„œ 보면 μ™ΈλΆ€μ—μ„œ 객체λ₯Ό μ •ν•΄μ€€λ‹€.
    public MemberService(MemberRepository memberRepository){
        this.memberRepository = memberRepository;
    }
    
    ...
}
μ €μž‘μžν‘œμ‹œ (μƒˆμ°½μ—΄λ¦Ό)
'πŸ“ Language/✏ JAVA' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • [Spring][혼곡] 4. μŠ€ν”„λ§ 빈과 μ˜μ‘΄κ΄€κ³„ - (2) 직접 μŠ€ν”„λ§ 빈 λ“±λ‘ν•˜κΈ°
  • [Spring][혼곡] 4. μŠ€ν”„λ§ 빈과 μ˜μ‘΄κ΄€κ³„ - (1) μ»΄ν¬λ„ŒνŠΈ μŠ€μΊ”κ³Ό μžλ™ μ˜μ‘΄κ΄€κ³„ μ„€μ •
  • [Spring][혼곡] 4. νšŒμ› 관리 예제 - (3) ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€ μž‘μ„±
  • [Spring][혼곡] 4. νšŒμ› 관리 예제 - (2) νšŒμ› 도메인과 리포지토리 λ§Œλ“€κΈ°
Blxxming
Blxxming
CS 지식과 κ³΅λΆ€ν•˜λ‹€ 배운 것, κ²½ν—˜ν•œ 것 등을 κΈ°λ‘ν•˜λŠ” λΈ”λ‘œκ·Έμž…λ‹ˆλ‹€.
  • Blxxming
    πŸ’‘λ²ˆλœ©πŸ’‘
    Blxxming
  • 전체
    였늘
    μ–΄μ œ
  • 곡지사항

    • Tech Interview
    • πŸ“š Tech (246)
      • πŸ“ Computer Science (96)
        • ✏ OS (12)
        • ✏ Network & Web (10)
        • ✏ Database (11)
        • ✏ Data Structure (6)
        • ✏ Algorithm (40)
        • ✏ Design Pattern (9)
        • ✏ Cloud Computing (3)
        • ✏ (5)
      • πŸ“ Language (73)
        • ✏ Language (6)
        • ✏ C & C++ (11)
        • ✏ C# (19)
        • ✏ JAVA (37)
      • πŸ“ Game (43)
        • ✏ Computer Graphics (2)
        • ✏ Unity (14)
        • ✏ Unreal (26)
        • ✏ (1)
      • πŸ“ Book (34)
        • ✏ Effective (3)
        • ✏ Game Server (16)
        • ✏ Clean Code (14)
        • ✏ (1)
  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.0
Blxxming
[Spring][혼곡] 4. νšŒμ› 관리 예제 - (4) νšŒμ› μ„œλΉ„μŠ€ 개발
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”