6_oHji
6_oHji
ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค☺
GitHub   Gmail
์ „์ฒด ๋ฐฉ๋ฌธ์ž
์˜ค๋Š˜
์–ด์ œ
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (62)
    • ๐Ÿ’ก DEEP DIVE (17)
      • PATTERN (17)
    • ๐Ÿ“ ๋„์ ๋„์  (4)
    • ๐ŸŒˆ EXPERIENCE (3)
    • ๐Ÿ’ป PROJECT (3)
    • ๐Ÿ“’ STUDY (34)
      • ALGORITHM (1)
      • JAVA (5)
      • FRONT-END (7)
      • BACK-END (10)
      • SPRING (7)
      • NETWORK (3)
      • CLOUD (1)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ํ™ˆ
  • ํƒœ๊ทธ

๊ณต์ง€์‚ฌํ•ญ

์ธ๊ธฐ ๊ธ€

์ตœ๊ทผ ๋Œ“๊ธ€

์ตœ๊ทผ ๊ธ€

ํ‹ฐ์Šคํ† ๋ฆฌ

๊ฐœ์ธ์ •๋ณด

  • ํ‹ฐ์Šคํ† ๋ฆฌ ํ™ˆ
  • ์Šคํ† ๋ฆฌ
  • ํฌ๋Ÿผ
  • ๋กœ๊ทธ์ธ
hELLO ยท Designed By ์ •์ƒ์šฐ.
6_oHji
6_oHji
๐Ÿ“’ STUDY/SPRING

[โœํ˜ผ์ž์„œ ์Šคํ”„๋ง ๊ณต๋ถ€ํ•˜๊ธฐ] 2์ผ์ฐจ - ํšŒ์› ๊ด€๋ฆฌ ์˜ˆ์ œ๋กœ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœํ•ด๋ณด๊ธฐ

2023. 4. 4. 22:06

https://github.com/jiholee0/hello-spring

 

GitHub - jiholee0/hello-spring: SPRING ๊ณต๋ถ€ ๋ ˆํฌ์ง€ํ† ๋ฆฌ

SPRING ๊ณต๋ถ€ ๋ ˆํฌ์ง€ํ† ๋ฆฌ. Contribute to jiholee0/hello-spring development by creating an account on GitHub.

github.com

 

 

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

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

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

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

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

 

 

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

- ๋ฐ์ดํ„ฐ : ํšŒ์› ID, ์ด๋ฆ„

- ๊ธฐ๋Šฅ : ํšŒ์› ๋“ฑ๋ก, ์กฐํšŒ

 

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

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

 

 

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

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

 

ํšŒ์› ๊ฐ์ฒด (/domain/Member.java)

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/MemberRepository.java)

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

 

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

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

 

 

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

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

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

import hello.hellospring.domain.Member;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.AfterAll;
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.*;

public 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();
        // 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 member = new Member();
        member.setName("spring");
        repository.save(member);

        List<Member> result = repository.findAll();
        assertThat(result.size()).isEqualTo(1);
    }
}

 

 

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

๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋‹ด๋‹นํ•˜๋Š” ์„œ๋น„์Šค ์ฝ”๋“œ์ด๋‹ค. ๋‹จ์ˆœํ•œ ํšŒ์› ๊ฐ€์ž… ๋ฐ ํšŒ์› ์กฐํšŒ๋งŒ ๋งŒ๋“ค์—ˆ๋‹ค.

package hello.hellospring.service;

import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemberRepository;

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

public class MemberService {
    private final MemberRepository memberRepository;

    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

    /**
     * ํšŒ์› ๊ฐ€์ž…
     */
    public Long join(Member member){
        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);
    }
}

 

 

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

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.BeforeEach;
import org.junit.jupiter.api.Test;

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

class MemberServiceTest {

    MemberService memberService;
    MemoryMemberRepository 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("spring");
        // when
        Long saveId = memberService.join(member);

        // then
        Member findMember = memberService.findOne(saveId).get();
        assertThat(member.getName()).isEqualTo(findMember.getName());
    }

    @Test
    void ํšŒ์›๊ฐ€์ž…_์ค‘๋ณต_ํšŒ์›_์˜ˆ์™ธ() {
        Member member = new Member();
        member.setName("spring");

        Member memberSameName = new Member();
        memberSameName.setName("spring");

        Long saveId = memberService.join(member);
        IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(memberSameName));
        assertThat(e.getMessage()).isEqualTo("์ด๋ฏธ ์กด์žฌํ•˜๋Š” ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.");
//        try {
//            Long saveId2 = memberService.join(memberSameName);
//            fail();
//        } catch (IllegalStateException e) {
//            assertThat(e.getMessage()).isEqualTo("์ด๋ฏธ ์กด์žฌํ•˜๋Š” ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.");
//        }
}

 

 

๋ฐ˜์‘ํ˜•
์ €์ž‘์žํ‘œ์‹œ ๋น„์˜๋ฆฌ ๋™์ผ์กฐ๊ฑด
    '๐Ÿ“’ STUDY/SPRING' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • [โœํ˜ผ์ž์„œ ์Šคํ”„๋ง ๊ณต๋ถ€ํ•˜๊ธฐ] 3์ผ์ฐจ - ์›น MVC ๊ฐœ๋ฐœ(ํšŒ์› ๊ด€๋ฆฌ ์˜ˆ์ œ)
    • [โœํ˜ผ์ž์„œ ์Šคํ”„๋ง ๊ณต๋ถ€ํ•˜๊ธฐ] 3์ผ์ฐจ - ์Šคํ”„๋ง ๋นˆ๊ณผ ์˜์กด๊ด€๊ณ„
    • [โœํ˜ผ์ž์„œ ์Šคํ”„๋ง ๊ณต๋ถ€ํ•˜๊ธฐ] 2์ผ์ฐจ - ์Šคํ”„๋ง ์›น ๊ฐœ๋ฐœ ๊ธฐ์ดˆ(์ •์  ์ปจํ…์ธ , MVC์™€ ํ…œํ”Œ๋ฆฟ ์—”์ง„, API)
    • [โœํ˜ผ์ž์„œ ์Šคํ”„๋ง ๊ณต๋ถ€ํ•˜๊ธฐ] 1์ผ์ฐจ - ์Šคํ”„๋ง ํ”„๋กœ์ ํŠธ๋ฅผ ์œˆ๋„์šฐ cmd ์ฐฝ์—์„œ ๋นŒ๋“œํ•˜๊ณ  ์‹คํ–‰ํ•˜๊ธฐ
    6_oHji
    6_oHji
    ๋„์ ๋„์ 

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”