본문 바로가기
Back-End/Spring

2.스프링 핵심 원리 이해1 - 예제만들기

by 두두리안 2020. 12. 31.
728x90

2.스프링 핵심 원리 이해1 - 예제만들기

  • 목차
    • 1.회원 도메인 개발
    • 2.회원 도메인 실행과 테스트
    • 3.주문과 할인 도메인 개발
    • 4.주문과 할인 도메인 실행과 테스트

1.회원 도메인 개발

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

}
  • 저장,아이디조회 를 인터페이스로 만든다

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);
    }
}
  • 메모리 리포지토리 구현클래스를 만들고 인터페이스 상속한다

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);
    }
}
  • 메모리 리포지토리 구현클래스를 가져온다
  • memberRepository 를 이용해서 save,와 findById를 이용

2.회원 도메인 실행과 테스트

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("findMember = " + findMember.getName());
        System.out.println("member = " + member.getName());
    }

}

image

  • findMember.getName() 과 member.getName() 결과과 같다
  • 메인메소드 이용해서 확인하는것은 번거롭고 일일이 눈으로 확인해야된다.

MemberServiceTest

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
        assertThat(member).isEqualTo(findMember);

    }

}
  • assertThat 을이용해서 검증하기때문에 효율적이다

회원 도메인 설계의 문제점

  • OCP ? DIP?
  • 의존관계가 인터페이스 뿐만 아니라 구현까지 모두 의존하고 있다
  • MemberService memberService = new MemberServiceImpl();

3.주문과 할인 도메인 개발

Order 엔티티

public class Order {

    private Long memberId;
    private String itemName;
    private int itemPrice;
    private int discountPrice;

    public Long getMemberId() {
        return memberId;
    }

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

    public String getItemName() {
        return itemName;
    }

    public void setItemName(String itemName) {
        this.itemName = itemName;
    }

    public int getItemPrice() {
        return itemPrice;
    }

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

    public int getDiscountPrice() {
        return discountPrice;
    }

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

    @Override
    public String toString() {
        return "Order{" +
                "memberId=" + memberId +
                ", itemName='" + itemName + '\'' +
                ", itemPrice=" + itemPrice +
                ", discountPrice=" + discountPrice +
                '}';
    } //객체를 출력할때 toString 출력

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

}
  • Order 의 Getter,Setter,toString 만들어준다
  • calculatePrice 안에서는 할인된 가격을 가져와준다
  • 객체를 출력할때 toString 출력

OrderService 인터페이스

public interface OrderService {
    Order createOrder(Long memberId, String itemName,int itemPrice);
}
  • OrderService 인터페이스를 만든다
  • 주문정보를 가져다주는 createOrder 를 만듬

DiscountPolicy 인터페이스

public interface DiscountPolicy {

    int discount(Member member,int price);

}
  • 할인된 가격

DiscountPolicy 인터페이스

public class FixDiscountPolicy implements DiscountPolicy {

    private  int discountFixAmount =1000;

    @Override
    public int discount(Member member, int price) {
        //enum 타입은 ==
        if(member.getGrade() == Grade.VIP){
            return discountFixAmount;
        }else{
            return 0;
        }
    }
}
  • 맴버등급이 VIP 인 경우 1000원 할인

OrderServiceImpl 구현클래스

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);
    }
}
  • memberRepository 는 MemoryMemberRepository 를 불러온다 (메모리 DB 사용)
  • discountPolicy 는 FixDiscountPolicy 를 사용한다 (고정할인)
  • createOrder 는 맴버의 객체를 찾고 할인 가격을 찾고 Order 생성자에 넣어준다

4.주문과 할인 도메인 실행과 테스트

OrderApp 태스트

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);
        System.out.println("order = " + order);
        System.out.println("order.calculatePrice = " + order.calculatePrice());

    }
}

image

  • OrderApp 에 메인메소드를 만들어서 테스트
  • 할인가격과 할인되 가격이 들어간것을 볼수 있다

OrderServiceTest

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

        assertThat(order.getDiscountPrice()).isEqualTo(1000);

    }
}
  • getDiscountPrice 가 1000원 인것을 확일할수 있다

참고

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 (스프링핵심기술)

728x90

'Back-End > Spring' 카테고리의 다른 글

4.스프링 컨테이너와 스프링 빈  (0) 2021.01.04
3.스프링 핵심 원리 이해2 - 객체지향원리적용  (0) 2021.01.01
1.객체지향설계와 스프링  (0) 2020.12.30
7.AOP  (0) 2020.12.29
6.스프링 DB접근기술  (0) 2020.12.29