# Spring / ์ˆœ์ˆ˜ ์ž๋ฐ”๊ธฐ๋ฐ˜ ์˜ˆ์ œ ( spring framework no use )
Study Repository

Spring / ์ˆœ์ˆ˜ ์ž๋ฐ”๊ธฐ๋ฐ˜ ์˜ˆ์ œ ( spring framework no use )

by rlaehddnd0422

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

- Based on Java11 (IntelliJ IDE)

- ์Šคํ”„๋ง ๋ถ€ํŠธ ์Šคํƒ€ํ„ฐ ์‚ฌ์ดํŠธ๋กœ ์Šคํ”„๋ง ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

์ง€๊ธˆ์€ ์Šคํ”„๋ง์—†๋Š” ์ˆœ์ˆ˜ํ•œ ์ž๋ฐ”๋กœ๋งŒ ๊ฐœ๋ฐœํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—  build.gradle์€ ๋”ฐ๋กœ ๊ฑด๋“ค์ง€ ์•Š๋Š”๋‹ค.

 

 

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

ํšŒ์›

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

    -> ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ๊ตฌํ˜„์ฒด๋ฅผ ์–ธ์ œ๋“ ์ง€ ๊ฐˆ์•„๋ผ์šธ ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„ํ•˜๋ฉด ๋œ๋‹ค

์ฃผ๋ฌธ๊ณผ ํ• ์ธ ์ •์ฑ…

  • ํšŒ์›์€ ์ƒํ’ˆ์„ ์ฃผ๋ฌธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํšŒ์› ๋“ฑ๊ธ‰์— ๋”ฐ๋ผ ํ• ์ธ ์ •์ฑ…์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Œ
  • ํ• ์ธ ์ •์ฑ…์€ ์šฐ์„  ๋ชจ๋“  VIP๋Š” 1000์›์„ ํ• ์ธํ•ด์ฃผ๋Š” ๊ณ ์ • ๊ธˆ์•ก ํ• ์ธ์„ ์ ์šฉํ•  ๊ฒƒ์ด๋‹ค
  • ๋‹ค๋ฅธ ํ• ์ธ ์ •์ฑ…์€ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๊ณ  ์•„์ง ๋ฏธํ™•์ •

    -> ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ๊ตฌํ˜„์ฒด๋ฅผ ์–ธ์ œ๋“ ์ง€ ๊ฐˆ์•„๋ผ์šธ ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„ํ•˜๋ฉด ๋œ๋‹ค.

 

3.  ํšŒ์› ๋„๋ฉ”์ธ ์„ค๊ณ„ - ๊ฐœ๋ฐœ - ์‹คํ–‰ - ํ…Œ์ŠคํŠธ (์„ค๊ณ„/๊ฐœ๋ฐœ)

ํšŒ์› ์—”ํ‹ฐํ‹ฐ

ํšŒ์› ๋“ฑ๊ธ‰ 

package hello.core.member;

public enum Grade {
    BASIC,
    VIP
}

ํšŒ์› ์—”ํ‹ฐํ‹ฐ

package hello.core.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 String getName() {
        return name;
    }

    public Grade getGrade() {
        return grade;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }

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

 

ํšŒ์› ์ €์žฅ์†Œ

ํšŒ์›  ์ €์žฅ์†Œ ์ธํ„ฐํŽ˜์ด์Šค

package hello.core;

import hello.core.member.Member;

public interface MemberRepository {

    void save(Member member);
    Member findById(Long memberId);
}

 

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

package hello.core;

import hello.core.member.Member;

import java.util.HashMap;
import java.util.Map;

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

 

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

ํšŒ์› ์„œ๋น„์Šค ์ธํ„ฐํŽ˜์ด์Šค

package hello.core.member;

public interface MemberService {
    void join(Member member);
    Member findMember(Long memberId);
}

 

ํšŒ์› ์„œ๋น„์Šค ๊ตฌํ˜„์ฒด 

package hello.core.member;

import hello.core.MemberRepository;
import hello.core.MemoryMemberRepository;

public class MemberServiceImp 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);
    }
}

3.  ํšŒ์› ๋„๋ฉ”์ธ ์„ค๊ณ„ - ๊ฐœ๋ฐœ - ์‹คํ–‰ - ํ…Œ์ŠคํŠธ (์‹คํ–‰/ํ…Œ์ŠคํŠธ)

ํšŒ์› ๋„๋ฉ”์ธ - ํšŒ์› ๊ฐ€์ž… main

package hello.core.member;

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

        Member findMember = memberService.findMember(1L);
        System.out.println("findMember = " + member.getName());
        System.out.println("findMember = " + findMember.getName());
    }
}

 

์ด๋ ‡๊ฒŒ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์€ ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ๋‹ค. JUnit ํ…Œ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์ž

 

ํšŒ์› ๋„๋ฉ”์ธ - ํšŒ์› ๊ฐ€์ž… ํ…Œ์ŠคํŠธ

 

package hello.core.member;

import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;

public class MemberServiceTest {

    MemberService memberService = new MemberServiceImp();

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

}

 

 

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

1. OCP๋ฅผ ์ž˜ ์ง€ํ‚ค๋Š”๊ฐ€ ?

2. DIP๋ฅผ ์ž˜ ์ง€ํ‚ค๋Š”๊ฐ€? X 

ํšŒ์› ์„œ๋น„์Šค๊ฐ€ MemberRepository Interface์— ์˜์กดํ•˜์ง€๋งŒ ๋˜ํ•œ ๊ตฌํ˜„์ฒด MemoryMemberRepository์—๊ฒŒ ๊นŒ์ง€ ์˜์กดํ•จ.

์˜์กด ๊ด€๊ณ„๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค์—๋„ ์˜์กดํ•˜๋‚˜, ๊ตฌํ˜„์ฒด์—๊ฒŒ๊นŒ์ง€  ์˜์กดํ•˜๋Š” ๋ฌธ์ œ์ ์ด ์žˆ์Œ

 

4. ์ฃผ๋ฌธ, ํ• ์ธ ๋„๋ฉ”์ธ ์„ค๊ณ„ - ๊ฐœ๋ฐœ - ์‹คํ–‰ - ํ…Œ์ŠคํŠธ (์„ค๊ณ„/๊ฐœ๋ฐœ)

์ฃผ๋ฌธ๊ณผ ํ• ์ธ ๋„๋ฉ”์ธ ์„ค๊ณ„

  • ํšŒ์›์€ ์ƒํ’ˆ์„ ์ฃผ๋ฌธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํšŒ์› Grade์— ๋”ฐ๋ผ ํ• ์ธ ์ •์ฑ…์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Œ
  • ํ• ์ธ ์ •์ฑ…์€ ๋ชจ๋“  VIP๋Š” 1000์›์„ ํ• ์ธํ•ด์ฃผ๋Š” Fixed Discount Policy๋ฅผ ์ ์šฉํ•  ๊ฒƒ.
  • ํ• ์ธ ์ •์ฑ…์€ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค. (๋ฏธํ™•์ •)

์ฃผ๋ฌธ ๋„๋ฉ”์ธ ํ˜‘๋ ฅ, ์—ญํ• , ์ฑ…์ž„

1. ์ฃผ๋ฌธ์ƒ์„ฑ : ํด๋ผ์ด์–ธํŠธ๋Š” ์ฃผ๋ฌธ ์„œ๋น„์Šค์— ์ฃผ๋ฌธ ์ƒ์„ฑ์„ ์š”์ฒญํ•œ๋‹ค.

2. ํšŒ์›์กฐํšŒ : ์ฃผ๋ฌธ ์„œ๋น„์Šค์—์„œ MemberRepository๋ฅผ ํ†ตํ•ด ํšŒ์›์— ๋Œ€ํ•œ ๋“ฑ๊ธ‰์„ ์กฐํšŒ

3. ํ• ์ธ์ ์šฉ : ํ™•์ธ๋œ ํšŒ์›๋“ฑ๊ธ‰์„ ํ†ตํ•ด DiscountPolicy๋ฅผ ํ†ตํ•ด ํ• ์ธ ์ ์šฉ

4. ์ฃผ๋ฌธ ๊ฒฐ๊ณผ ๋ฆฌํ„ด : 3์—์„œ ๋ฆฌํ„ด๋œ ํ• ์ธ ๊ฒฐ๊ณผ๋ฅผ ํฌํ•จํ•œ ์ฃผ๋ฌธ ๊ฒฐ๊ณผ๋ฅผ ํด๋ผ์ด์–ธํŠธ์— ๋ฆฌํ„ด

 

 

์ฃผ๋ฌธ ๋„๋ฉ”์ธ ์ „์ฒด

์—ญํ• (์ธํ„ฐํŽ˜์ด์Šค)๊ณผ ๊ตฌํ˜„์„ ๋ถ„๋ฆฌํ•ด์„œ ์ž์œ ๋กญ๊ฒŒ ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ์กฐ๋ฆฝํ•  ์ˆ˜ ์žˆ๊ฒŒ ์„ค๊ณ„ ํ–ˆ์Œ.

์ด๋ ‡๊ฒŒ ์„ค๊ณ„ํ•˜๋ฉด ํ• ์ธ ์ •์ฑ…์ด๋‚˜ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

์ฃผ๋ฌธ ๋„๋ฉ”์ธ ํด๋ž˜์Šค ๋‹ค์ด์–ด๊ทธ๋žจ

Discount Policy (Interface)

package hello.core.discount;

import hello.core.member.Member;

public interface DiscountPolicy {
    int discount(Member member, int price);
}

 

FixDiscountPolicy (๊ตฌํ˜„์ฒด)

package hello.core.discount;

import hello.core.member.Grade;
import hello.core.member.Member;

public class FixDiscountPolicy implements DiscountPolicy{

    private int discountFixAmount = 1000;
    @Override
    public int discount(Member member, int price) {
        if(member.getGrade() == Grade.VIP)
        {
            return discountFixAmount;
        }
        else
        {
            return 0;
        }
    }
}

 

 

 

Order Entity

package hello.core.order;

public class Order {
    private Long memberId;
    private String ItemName;
    private int itemPrice;
    private int discountPrice;

    public Order(Long memberId, String itemName, int itemPrice, int discountPrice) {
        this.memberId = memberId;
        this.ItemName = itemName;
        this.itemPrice = itemPrice;
        this.discountPrice = discountPrice;
    }

    public int calculatePrice()
    {
        return itemPrice-discountPrice;
    }

    public Long getMemberId() {
        return memberId;
    }

    public String getItemName() {
        return ItemName;
    }

    public int getItemPrice() {
        return itemPrice;
    }

    public int getDiscountPrice() {
        return discountPrice;
    }

    public void setMemberId(Long memberId) {
        this.memberId = memberId;
    }

    public void setItemName(String itemName) {
        ItemName = itemName;
    }

    public void setItemPrice(int itemPrice) {
        this.itemPrice = itemPrice;
    }

    public void setDiscountPrice(int discountPrice) {
        this.discountPrice = discountPrice;
    }

    @Override
    public String toString() {
        return "Order{" +
                "memberId=" + memberId +
                ", ItemName='" + ItemName + '\'' +
                ", itemPrice=" + itemPrice +
                ", discountPrice=" + discountPrice +
                '}';
    }

}

 

 

OrderService ( Interface )

package hello.core.order;

public interface OrderService {
    Order createOrder(Long memberId, String itemName, int itemPrice);
}

 

OrderServiceImp ( ๊ตฌํ˜„์ฒด )

package hello.core.order;

import hello.core.MemberRepository;
import hello.core.MemoryMemberRepository;
import hello.core.discount.DiscountPolicy;
import hello.core.discount.FixDiscountPolicy;
import hello.core.member.Member;

public class OrderServiceImp implements OrderService{

    private final MemberRepository memberRepository = new MemoryMemberRepository();
    private final DiscountPolicy dp = new FixDiscountPolicy();

    @Override
    public Order createOrder(Long memberId, String itemName, int itemPrice) {
        Member member = memberRepository.findById(memberId);
        int discountPrice = dp.discount(member,itemPrice);

        return new Order(memberId, itemName, itemPrice, discountPrice);
    }
}

 

์ฃผ๋ฌธ ์ƒ์„ฑ ์š”์ฒญ์ด ์˜ค๋ฉด, ํšŒ์› ์ •๋ณด๋ฅผ ์กฐํšŒํ•˜๊ณ , ํ• ์ธ ์ •์ฑ…์„ ์ ์šฉํ•œ ๋‹ค์Œ ์ฃผ๋ฌธ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์„œ ๋ฆฌํ„ดํ•œ๋‹ค.

MemoryMemberRepository์™€ FixDiscountPolicy๋ฅผ ๊ตฌํ˜„์ฒด๋กœ ์ƒ์„ฑํ•œ๋‹ค.

 

4. ์ฃผ๋ฌธ, ํ• ์ธ ๋„๋ฉ”์ธ ์„ค๊ณ„ - ๊ฐœ๋ฐœ - ์‹คํ–‰ - ํ…Œ์ŠคํŠธ (์‹คํ–‰/ํ…Œ์ŠคํŠธ)

์ฃผ๋ฌธ๊ณผ ํ• ์ธ ์ •์ฑ… ์‹คํ–‰

package hello.core.order;

import hello.core.MemberRepository;
import hello.core.member.Grade;
import hello.core.member.Member;
import hello.core.member.MemberService;
import hello.core.member.MemberServiceImp;

public class OrderApp {
    public static void main(String[] args) {
        MemberService memberService = new MemberServiceImp();
        OrderService orderService = new OrderServiceImp();

        Member memberA = new Member(1L, "memberA", Grade.VIP);
        memberService.join(memberA);

        Order order = orderService.createOrder(1L,"itemA",10000);
        System.out.println("order = " + order);
        System.out.println(order.calculatePrice());
    }
}

ํ• ์ธ ๊ธˆ์•ก์ด ์ž˜ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ์ง์œผ๋กœ ์ด๋ ‡๊ฒŒ ํ…Œ์ŠคํŠธ ํ•˜๋Š” ๊ฒƒ์€ ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ๋‹ค. JUnit ํ…Œ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์ž.

 

์ฃผ๋ฌธ๊ณผ ํ• ์ธ ์ •์ฑ… ํ…Œ์ŠคํŠธ

package hello.core;

import hello.core.member.Grade;
import hello.core.member.Member;
import hello.core.member.MemberService;
import hello.core.member.MemberServiceImp;
import hello.core.order.Order;
import hello.core.order.OrderService;
import hello.core.order.OrderServiceImp;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;

public class OrderServiceTest {
    MemberService memberService = new MemberServiceImp();
    OrderService orderService = new OrderServiceImp();

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

        // when
        Order order = orderService.createOrder(memberId, "itemA", 100000);
        // then
        Assertions.assertThat(order.getDiscountPrice()).isEqualTo(1000);
    }

}

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

Study Repository

rlaehddnd0422

ํ™œ๋™ํ•˜๊ธฐ