๊ฐœ๋ฐœ ์ผ์ง€/TIL

23.02.23

sj5262 2023. 2. 27. 01:58

<์˜ค๋Š˜์˜ ๋ณต์Šต>

 

- spring

 

๐ŸŸง ์˜ˆ์ œ ๋งŒ๋“ค๊ธฐ


ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

 

- ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์ˆœ์ˆ˜ํ•œ '์ž๋ฐ”'๋กœ๋งŒ ํ•  ๊ฒƒ์ด๋‹ค (ํ”„๋กœ์ ํŠธ ํ™˜๊ฒฝ์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ํ•˜๋ ค๊ณ  ๋ถ€ํŠธ๋ฅผ ์‚ฌ์šฉํ•จ, ๋‹น์žฅ์€ ์ˆœ์ˆ˜ํ•œ ์ž๋ฐ”๋กœ๋งŒ ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ•  ๊ฒƒ์ด๋ฉฐ ๋‚˜์ค‘์— ์Šคํ”„๋ง ์ถ”๊ฐ€ํ•  ๊ฒƒ์ž„ - ์ „ํ˜€ ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ)

โญ ํ”„๋กœ์ ํŠธ ์„ ํƒ

๐Ÿ”น Project: Gradle - Groovy Project
Spring Boot: 2.3.x
Language: Java
Packaging: Jar
Java: 11

๐Ÿ”น Project Metadata groupId: hello
artifactId: core
Dependencies: ์„ ํƒํ•˜์ง€ ์•Š์Œ 

 

settings

  • gradle์„ ํ†ตํ•ด ์‹คํ•ดํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ธํ…”๋ฆฌ์ œ์ด๋กœ ์‹คํ–‰ํ•ด์•ผ ๋น ๋ฆ„! (์ธํ…”๋ฆฌ์ œ์ด์—์„œ ์ž๋ฐ”๋ฅผ ๋ฐ”๋กœ ์‹คํ–‰) - ๊ฐ•์‚ฌ๋‹˜ ์ถ”์ฒœ!
  • ์ตœ๊ทผ IntelliJ ๋ฒ„์ „์€ Gradle์„ ํ†ตํ•ด์„œ ์‹คํ–‰ ํ•˜๋Š” ๊ฒƒ์ด ๊ธฐ๋ณธ ์„ค์ •, ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์‹คํ–‰์†๋„๊ฐ€ ๋А๋ฆผ ์œ„์™€๊ฐ™์ด ๋ณ€๊ฒฝํ•˜๋ฉด ์ž๋ฐ”๋กœ ๋ฐ”๋กœ ์‹คํ–‰ํ•ด์„œ ์‹คํ–‰์†๋„๊ฐ€ ๋” ๋น ๋ฆ„

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

 

๐Ÿ”น ํšŒ์›
- ํšŒ์›์„ ๊ฐ€์ž…, ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Œ
- ํšŒ์›์€ ์ผ๋ฐ˜ ํšŒ์›/ VIP ํšŒ์› ๋‘ ๊ฐ€์ง€ ๋“ฑ๊ธ‰์ด ์žˆ์Œ
- ํšŒ์› ๋ฐ์ดํ„ฐ๋Š” ์ž์ฒด DB๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Œ, ์™ธ๋ถ€ ์‹œ์Šคํ…œ๊ณผ ์—ฐ๋™ํ•  ์ˆ˜ ์žˆ์Œ(๋ฏธํ™•์ •)

๐Ÿ”ธ์ฃผ๋ฌธ๊ณผ ํ• ์ธ ์ •์ฑ…
- ํšŒ์›์€ ์ƒํ’ˆ์„ ์ฃผ๋ฌธํ•  ์ˆ˜ ์žˆ์Œ
- ํšŒ์› ๋“ฑ๊ธ‰์— ๋”ฐ๋ผ ํ• ์ธ ์ •์ฑ…์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Œ
- ํ• ์ธ ์ •์ฑ… : ๋ชจ๋“  VIP๋Š” 1000์›์„ ํ• ์ธํ•ด์ฃผ๋Š” ๊ณ ์ • ๊ธˆ์•ก ํ• ์ธ์„ ์ ์šฉ(๋‚˜์ค‘์— ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ ์žˆ์Œ)
- ํ• ์ธ ์ •์ฑ…์€ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Œ, ํšŒ์‚ฌ์˜ ๊ธฐ๋ณธ ํ• ์ธ ์ •์ฑ…์„ ์•„์ง ์ •ํ•˜์ง€ ๋ชปํ•จ, ์˜คํ”ˆ ์ง์ „๊นŒ์ง€ ๊ณ ๋ฏผ์„ ๋ฏธ๋ฃจ๊ณ  ์‹ถ๊ณ , ์ตœ์•…์˜ ๊ฒฝ์šฐ ์ ์šฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ(๋ฏธํ™•์ •)
  • DB์™€ ํ• ์ธ ๋ถ€๋ถ„์— ๊ด€๋ จํ•ด์„œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์—ญํ• , ๊ตฌํ˜„ ๋ถ€๋ถ„์„ ๋‚˜๋ˆ„๋ฉด ๋œ๋‹ค
  • ํ• ์ธ ์ •์ฑ… - ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Œ (ํšŒ์‚ฌ๊ฐ€ ์•„์ง ์˜คํ”ˆ ์ „์ด๋ผ ์‹ ์ค‘ํ•˜๊ฒŒ ํ• ์ธ ์ •์ฑ…์„ ๊ณ ๋ฏผ์ค‘์ด๋‹ค)
  • ๋‹น์žฅ ๊ฒฐ์ •ํ•˜๊ธฐ ์–ด๋ ค์šด ๋ถ€๋ถ„์€ ์žˆ์œผ๋‚˜ ์ •์ฑ…์ด ๊ฒฐ์ •๋  ๋•Œ๊นŒ์ง€ ๊ฐœ๋ฐœ์„ ๋ฏธ๋ฃฐ์ˆ˜ ์—†์œผ๋‹ˆ ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉ
  • ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค๊ณ  → ์–ธ์ œ๋“  ๊ฐˆ์•„ ๋ผ์šฐ๋ฉด ๋œ๋‹ค!!

ํšŒ์› ๋„๋ฉ”์ธ ์„ค๊ณ„

 

- ํšŒ์›์„ ๊ฐ€์ž…, ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Œ
- ํšŒ์›์€ ์ผ๋ฐ˜ ํšŒ์›/ VIP ํšŒ์› ๋‘ ๊ฐ€์ง€ ๋“ฑ๊ธ‰์ด ์žˆ์Œ
- ํšŒ์› ๋ฐ์ดํ„ฐ๋Š” ์ž์ฒด DB๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Œ, ์™ธ๋ถ€ ์‹œ์Šคํ…œ๊ณผ ์—ฐ๋™ํ•  ์ˆ˜ ์žˆ์Œ(๋ฏธํ™•์ •)

ํšŒ์› ๋„๋ฉ”์ธ ํ˜‘๋ ฅ ๊ด€๊ณ„

  • ํšŒ์› ์ €์žฅ์†Œ๋Š” ์•„์ง ๊ฒฐ์ • X
  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํšŒ์› ์„œ๋น„์Šค๋ฅผ ํ˜ธ์ถœ 
  • ํšŒ์›์ €์žฅ์†Œ(์ธํ„ฐํŽ˜์ด์Šค)๋ฅผ ๋ณ„๋„๋กœ ๋งŒ๋“ฆ - ํšŒ์› ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๋Š” ๊ณ„์ธต์„ ๋”ฐ๋กœ ๋งŒ๋“ฆ
  • ํด๋ผ์ด์–ธํŠธ, ํšŒ์›์„œ๋น„์Šค, ํšŒ์›์ €์žฅ์†Œ โžก๏ธ "์—ญํ• "
  • ๋ฉ”๋ชจ๋ฆฌ, DB, ์™ธ๋ถ€ ์‹œ์Šคํ…œ ์—ฐ๋™ ํšŒ์› ์ €์žฅ์†Œ โžก๏ธ "๊ตฌํ˜„์ฒด"
  • ๋ฉ”๋ชจ๋ฆฌ ํšŒ์› ์ €์žฅ์†Œ : ๊ฐ„๋‹จํ•˜๊ฒŒ ์ž๋ฐ”์ฝ”๋“œ๋กœ๋งŒ ๋ฉ”๋ชจ๋ฆฌ๋กœ ํšŒ์›๊ฐ์ฒด๋ฅผ ๋„ฃ๊ณ  ๋นผ๊ณ ๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค์–ด ์ผ๋‹จ์€ ๊ฐœ๋ฐœ์„ ์ง„ํ–‰, ํ…Œ์ŠคํŠธ - ๋กœ์ปฌ์—์„œ ๊ฐœ๋ฐœ์‹œ์—๋งŒ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค (โ— ์„œ๋ฒ„๊ฐ€ ์žฌ๋ถ€ํŒ…๋˜๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ๋‚ ๋ผ๊ฐ)  - ๋‚˜์ค‘์— DB๋‚˜ ์™ธ๋ถ€ ์‹œ์Šคํ…œ์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋„๋ก ๊ต์ฒด๋งŒ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค
  • ๊ธฐํš์ž๋“ค๋„ ๋ณผ ์ˆ˜ ์žˆ์Œ 

ํšŒ์› ํด๋ž˜์Šค ๋‹ค์ด์–ด๊ทธ๋žจ

  • Impl : ๊ตฌํ˜„์ฒด
  • MemberRepository = ํšŒ์›์ €์žฅ์†Œ ์—ญํ• 
  • ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ตฌ์ฒดํ™” ํ•จ 
  • ์‹ค์ œ ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ํด๋ž˜์Šค๋“ค๋งŒ ๋ถ„์„ํ•ด์„œ ๋ณผ ์ˆ˜ ์žˆ์Œ
  • ์ •์ ์ธ ๊ฒƒ 

  • ๊ฐ์ฒด๊ฐ„์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฐธ์กฐ๋Š” ์–ด๋–ป๊ฒŒ ๋˜๋Š”์ง€ 
  • ํšŒ์› ์„œ๋น„์Šค : MemberServiceImpl
  • ๋™์ ์ธ ๊ฒƒ
ํšŒ์› ๋„๋ฉ”์ธ ๊ฐœ๋ฐœ

 

- ํšŒ์› ๋“ฑ๊ธ‰(enum์œผ๋กœ ๋งŒ๋“ฆ)

package hello.core.member;

public enum Grade {

    BASIC,
    VIP
}

 

- Member (ํšŒ์› ์—”ํ‹ฐํ‹ฐ)

public class Member {

    private Long id;
    private String name;
    private Grade grade;

    public Member(Long id, String name, Grade grade) {
        this.id = id;
        this.name = name;
        this.grade = grade;
    }

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

    public Grade getGrade() {
        return grade;
    }

    public void setGrade(Grade grade) {
        this.grade = grade;
    }
}

 

- MemberRepository (ํšŒ์› ์ €์žฅ์†Œ)  

public interface MemberRepository {

    void save(Member member); // ํšŒ์›์„ ์ €์žฅ

    Member findById(Long memberId); // ํšŒ์›์„ ์กฐํšŒ
}
  • save : ์ €์žฅ
  • findById : ํšŒ์›์˜ id๋กœ ํšŒ์›์„ ์กฐ

- MemoryMemberRepository (๋ฉ”๋ชจ๋ฆฌ ํšŒ์› ์ €์žฅ์†Œ ๊ตฌํ˜„์ฒด)

public class MemoryMemberRepository implements MemberRepository{

    private static Map<Long, Member> store = new HashMap<>();

    @Override
    public void save(Member member) {
        store.put(member.getId(), member);
    }

    @Override
    public Member findById(Long memberId) {
        return store.get(memberId);
    }
}
  • โญ ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ตฌํ˜„์ฒด๋ฅผ ํ•œ ๊ณณ์— ๋„ฃ๋Š” ๊ฒƒ์€ ์ข‹์ง€ x ์ด ์˜ˆ์ œ์—์„œ๋Š” ๋ณต์žกํ•œ ๊ฒƒ์„ ์ค„์ด๋ ค๊ณ  ๊ฐ™์ด ๋„ฃ์Œ 
  • ์ €์žฅ์†Œ → Map์ด ํ•„์š”!
  • ์˜ค๋ฅ˜์ฒ˜๋ฆฌ๋Š” ๊ฐ„ํŽธํ•˜๊ฒŒ ํ•˜๋Š” ์˜ˆ์ œ์ด๋ฏ€๋กœ ์ƒ๋žต 
  • ์‹ค๋ฌด์—์„œ HashMap ์€ ๋™์‹œ์„ฑ ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ(์—ฌ๋Ÿฌ ๊ตฐ๋ฐ์—์„œ ์ ‘๊ทผ์„ ํ•˜๋ ค๊ณ  ํ•˜๋ฉด) โžก๏ธ ConcurrentHashMap์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค
  • DB๊ฐ€ ์•„์ง ํ™•์ • x → ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ๋ฉ”๋ชจ๋ฆฌ ํšŒ์› ์ €์žฅ์†Œ๋ฅผ ๊ตฌํ˜„ํ•ด ์šฐ์„  ๊ฐœ๋ฐœ ์ง„ํ–‰

- MemberService

public interface MemberService { // ํšŒ์› ๊ฐ€์ž…, ์กฐํšŒ

    void join(Member member); // ๊ฐ€์ž…

    Member findMember(Long memberId); // ์กฐํšŒ

}
  • ํšŒ์› ๊ฐ€์ž…, ์กฐํšŒ ๋‘๊ฐ€์ง€!

- MemberServiceImpl

public class MemberServiceImpl implements MemberService {

    private final MemberRepository memberRepository = new MemoryMemberRepository();

    @Override
    public void join(Member member) {
        memberRepository.save(member);
    }

    @Override
    public Member findMember(Long memberId) {
        return memberRepository.findById(memberId);
    }
}
  • ๊ด€๋ก€ : ๊ตฌํ˜„์ฒด๊ฐ€ ํ•˜๋‚˜๋งŒ ์žˆ์„ ๊ฒฝ์šฐ → ์ธํ„ฐํŽ˜์ด์Šค๋ช… ๋’ค์— Impl์ด๋ผ๊ณ  ๋งŽ์ด ์“ด๋‹ค
  • ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ๊ฐ€์ง€๊ณ  ์ ์œผ๋ฉด nullPointException๋ฐœ์ƒ 
  • join() ์—์„œ save()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด? → ๋‹คํ˜•์„ฑ์— ์˜ํ•ด MemoryMemberRepository์— ์žˆ๋Š” save()๊ฐ€ ํ˜ธ์ถœ 
ํšŒ์› ๋„๋ฉ”์ธ ์‹คํ–‰๊ณผ ํ…Œ์ŠคํŠธ

 

- MemberApp

public class MemberApp {

    public static void main(String[] args) {
        MemberService memberService = new MemberServiceImpl();
        Member member = new Member(1L, "memberA", Grade.VIP);
        memberService.join(member);

        Member findMember = memberService.findMember(1L);
        System.out.println("new Member = " + member.getName());
        System.out.println("find Member = " + findMember.getName());
    }
}
  • ์ˆœ์ˆ˜ํ•œ ์ž๋ฐ”์ฝ”๋“œ - ์Šคํ”„๋ง ๊ด€๋ จ x 
  • ๊ทธ๋Ÿฌ๋‚˜ ์ด๋ ‡๊ฒŒ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์€ ํ•œ๊ณ„๊ฐ€ ์žˆ์Œ - ์ข‹์€ ๋ฐฉ๋ฒ• x
  • main ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ๋Š” - ๋ˆˆ์œผ๋กœ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ์Œ 

- MemberServiceTest

public class MemberServiceTest {

    MemberService memberService = new MemberServiceImpl();

    @Test
    void join() {
        //given
        Member member = new Member(1L, "memberA", Grade.VIP);

        //when  
        memberService.join(member);
        Member findMember = memberService.findMember(1L);

        //then(๊ฒ€์ฆ)
        Assertions.assertThat(member).isEqualTo(findMember);
    }
}
  • ๋ฐฐํฌ์‹œ์—๋Š” main์— ๋Œ€ํ•œ ์ฝ”๋“œ๋งŒ ๋‚˜๊ฐ€๊ณ  test ์ฝ”๋“œ๋Š” x  - ๋นŒ๋“œ๋  ๋•Œ ๋น ์ง„๋‹ค 
  • ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผํ•˜๋Š” ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ
  • ํ…Œ์ŠคํŠธ ์‹คํŒจ → ์–ด๋–ป๊ฒŒํ•ด์„œ ์˜ค๋ฅ˜๊ฐ€ ๋‚ฌ๋Š”์ง€ ํ™•์ธ ๊ฐ€๋Šฅ, ๋‹ค๋ฅธ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ ์‹คํŒจ๊ฐ€ ๋‚˜๋Š” ๊ฒƒ๋„ ๋น ๋ฅด๊ฒŒ ์žก์„ ์ˆ˜ ์žˆ์Œ
  • โ—ํ…Œ์ŠคํŠธ ์ž‘์„ฑ ๋ฐฉ๋ฒ•์€ ํ•„์ˆ˜๋กœ ์•Œ์•„์•ผ ํ•œ๋‹ค!!

 

๐Ÿ”… ํšŒ์› ๋„๋ฉ”์ธ ์„ค๊ณ„์˜ ๋ฌธ์ œ์ !?

 ์˜์กด ๊ด€๊ณ„๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ตฌํ˜„๊นŒ์ง€ ๋ชจ๋‘ ์˜์กดํ•˜๋Š” ๋ฌธ์ œ์ ์ด ์žˆ๋‹ค
โžก๏ธ ์ฃผ๋ฌธ๊นŒ์ง€ ๋งŒ๋“ค๊ณ ๋‚˜์„œ ๋ฌธ์ œ์ ๊ณผ ํ•ด๊ฒฐ ๋ฐฉ์•ˆ์„ ์„ค๋ช…ํ•  ๊ฒƒ์ž„ 

- ์‹ค์ œ ํ• ๋‹ฌํ•˜๋Š” ๋ถ€๋ถ„์ด ๊ตฌํ˜„์ฒด๋ฅผ ์˜์กดํ•จ 
MemberServiceImpl → MemberRepository, MemoryMemberRepository ๋‘๊ฐœ๋‹ค ์˜์กดํ•จ
→ ์ถ”์ƒํ™” + ๊ตฌ์ฒดํ™”์— ์˜์กด (๋ณ€๊ฒฝ์ด ์žˆ์„ ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋œ๋‹ค)
→ โ— DIP๋ฅผ ์œ„๋ฐ˜  

 

 

 

 

 

 


<์ถœ์ฒ˜ - ์ธํ”„๋Ÿฐ(์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ) , ๊น€์˜ํ•œ >

- https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard

 

์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ - ์ธํ”„๋Ÿฐ | ๊ฐ•์˜

์Šคํ”„๋ง ์ž…๋ฌธ์ž๊ฐ€ ์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค์–ด๊ฐ€๋ฉด์„œ ์Šคํ”„๋ง์˜ ํ•ต์‹ฌ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๊ณ , ์Šคํ”„๋ง ๊ธฐ๋ณธ๊ธฐ๋ฅผ ํ™•์‹คํžˆ ๋‹ค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค., - ๊ฐ•์˜ ์†Œ๊ฐœ | ์ธํ”„๋Ÿฐ

www.inflearn.com

 

- (์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ) ๊ฐ•์˜๋ฅผ ๋“ฃ๊ณ  ํ•™์Šต์„ ์œ„ํ•ด ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

'๊ฐœ๋ฐœ ์ผ์ง€ > TIL' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

23.02.27  (0) 2023.03.05
23.02.24  (0) 2023.02.28
23.02.22  (2) 2023.02.26
23.02.21  (0) 2023.02.26
23.02.20  (0) 2023.02.25