EEALL@ONCE

๐ŸŒฑ๋งˆ์Œ์„ ์ •ํ•˜์ง€ ์•Š์€ ์‚ฌ์žฅ๊ณผ Spring์„ ์‚ฌ์šฉํ•ด์„œ ์œ ์—ฐํ•˜๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๊ฐœ๋ฐœ์ž ๋ณธ๋ฌธ

Spring๐ŸŒฑ

๐ŸŒฑ๋งˆ์Œ์„ ์ •ํ•˜์ง€ ์•Š์€ ์‚ฌ์žฅ๊ณผ Spring์„ ์‚ฌ์šฉํ•ด์„œ ์œ ์—ฐํ•˜๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๊ฐœ๋ฐœ์ž

์˜ฌ์—ฃ์›์Šค 2023. 6. 23. 17:40
728x90

1. ์ƒํ™ฉ

ํ• ์ธ ์ •์ฑ… ๋งˆ์Œ์„ ์•ˆ ์ •ํ•œ ์‚ฌ์žฅ๊ณผ ๋จธ๋ฆฌ๊ฐ€ ์•„ํ”ˆ ๊ฐœ๋ฐœ์ž

ํ˜„ ์ƒํ™ฉ์€ vip์—๊ฒŒ ๊ณ ์ • ํ• ์ธ or ํšŒ์› ๋“ฑ๊ธ‰์— ๋”ฐ๋ผ ํ• ์ธ ๋“ฑ์„ ๊ณ ๋ฏผ์ค‘์ด๋‹ค.

 


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

 

 ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ฃผ๋ฌธ์„ ํ•˜๋ฉด,
 ์„œ๋น„์Šค๋Š” ํšŒ์› ์กฐํšŒ๋ฅผ ํ•˜๊ณ  ๊ทธ์— ๋”ฐ๋ฅธ ํ• ์ธ์„ ์ ์šฉํ•˜๊ณ  ํ• ์ธ ๊ฒฐ๊ณผ๋ฅผ ํฌํ•จํ•œ ์ฃผ๋ฌธ ๊ฒฐ๊ณผ๋ฅผ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋Œ๋ ค์ค€๋‹ค. 

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


3. ๊ณ ์ • ํ• ์ธ ์ฝ”๋“œ ์„ค๊ณ„

member ํŒจํ‚ค์ง€๋Š” ํšŒ์› ์ •๋ณด ๋กœ์ง์ด / discount ํŽ˜ํ‚ค์ง€์—๋Š” ํ• ์ธ ๋กœ์ง์ด  / order ํŽ˜ํ‚ค์ง€์—๋Š” ์ฃผ๋ฌธ ๋กœ์ง์ด ๋‹ด๊ฒจ์žˆ๋‹ค.

์ˆœ์„œ๋Š” ๊ฐ ํŒจํ‚ค์ง€๋งˆ๋‹ค DTO/Repository /Service/Main์ˆœ์„œ๋กœ ์ฝ”๋“œ๋ฅผ ๋ณด์—ฌ์ฃผ๊ฒ ๋‹ค.

๐Ÿฅ‘ member ํŒจํ‚ค์ง€


๐Ÿ”ป member ๊ฐ์ฒด (DTO)

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

๐Ÿ”ป member Grade(enum)[๊ณ ๊ฐ ๋“ฑ๊ธ‰]

package hello.core.member;

public enum Grade {
    BASIC,
    VIP
}

๐Ÿ”ป MemberRepository (interface)

package hello.core.member;

public interface MemberRepository {
    void save(Member member);

    Member findById(Long memberId);
}

๐Ÿ”ป MemoryMemberRepository (๊ตฌํ˜„์ฒด)

package hello.core.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);
    }
}

๐Ÿ”ป MemberService(์ธํ„ฐํŽ˜์ด์Šค)

package hello.core.member;

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

๐Ÿ”ป MemberServiceImpl(๊ตฌํ˜„์ฒด)

package hello.core.member;

public class MemberServiceImpl implements MemberService {
    MemberRepository memberRepository=new MemoryMemberRepository();

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

    @Override
    public Member findMember(Long memberId) {
        
        return memberRepository.findById(memberId);
    }
}

๐Ÿ”ป MemberApp(๋ฉ”์ธํด๋ ˆ์Šค)

package hello.core;

import hello.core.member.*;

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

๐Ÿ”ป TestCode

package hello.core.Member;


import hello.core.member.Grade;
import hello.core.member.Member;
import hello.core.member.MemberService;
import hello.core.member.MemberServiceImpl;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;

public class MemberServiceTest {
    MemberService memberService=new MemberServiceImpl();
    
    @Test
    void join(){
        Member member = new Member(1L,"easy", Grade.VIP);
        
        memberService.join(member);
        Member findMember= memberService.findMember(1L);

        Assertions.assertThat(member).isEqualTo(findMember);
    }
}

๐Ÿฅ‘ DiscountํŒจํ‚ค์ง€

 


๐Ÿ”ป DiscountPolicy (์ธํ„ฐํŽ˜์ด์Šค)

package hello.core.discount;

import hello.core.member.Member;

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

๐Ÿ”ป FixDiscountPolicy(fixํ• ์ธ๋ฅ  ๊ตฌํ˜„์ฒด)

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ํŒจํ‚ค์ง€

๐Ÿ”ป Order(DTO)

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

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

๐Ÿ”ป orderService(์ธํ„ฐํŽ˜์ด์Šค)

package hello.core.order;

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

๐Ÿ”ป orderServiceImpl

package hello.core.order;

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

public class OrderServiceImpl implements OrderService{

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

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

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

๐Ÿฅ‘ Main


package hello.core;

import hello.core.member.Grade;
import hello.core.member.Member;
import hello.core.member.MemberService;
import hello.core.member.MemberServiceImpl;
import hello.core.order.Order;
import hello.core.order.OrderService;
import hello.core.order.OrderServiceImpl;

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

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

        Order order=orderService.createOrder(memberId,"itemA",10000);

    }
}

๐Ÿฅ‘ Test

package hello.core.order;

import hello.core.member.Grade;
import hello.core.member.Member;
import hello.core.member.MemberService;
import hello.core.member.MemberServiceImpl;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;

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

class OrderServiceTest {

    MemberService memberService=new MemberServiceImpl();
    OrderService orderService=new OrderServiceImpl();

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

        Order order= orderService.createOrder(memberId,"ItemA",10000);
        Assertions.assertThat(order.getDiscountPrice()).isEqualTo(1000);

    }

}

์‚ฌ์‹ค์ƒ.. ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด์„œ ํ™•์ธํ•ด๋ณด๋Š” ์Šต๊ด€์„ ๊ฐ€์ง€๋Š”๊ฒŒ ์ข‹๋‹ค.. !!

 


4. ์„œ๋น„์Šค ์ •์ฑ… ์ „ํ™˜..

 

์ด๋ ‡๊ฒŒ ์ฝ”๋“œ๋ฅผ ์™„์„ฑํ•ด๋ดค๋Š”๋ฐ...๋งŒ์•ฝ... ํ• ์ธ ์ •์ฑ…์ด ๋ฐ”๋€Œ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ..???

๋งŒ์•ฝ ํŠน์ •ํ•œ ๊ธˆ์•ก์ด ์•„๋‹ˆ๋ผ, % ๋งŒํผ ํ• ์ธ์„ ํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด....???

์–ด๋–ค ์ฝ”๋“œ๋“ค์„ ๋” ์ถ”๊ฐ€ํ•ด์•ผํ• ๊นŒ..?

๋‹ค์Œ๊ธ€์—์„œ ์ด์–ด์„œ ์ž‘์„ฑํ•˜๊ฒ ๋‹ค!

728x90