본문 바로가기
spring boot

프로젝트 생성

by hyodev 2024. 7. 23.

비즈니스 요구사항과 설계

회원

- 회원 가입, 조회

- 일반과 VIP 등급

 

클라이언트 ---> 회원서비스(회원가입, 조회) ---> 회원저장소(메모리 회원 저장소, DB 회원저장소, 외부 시스템 연동 회원 저장소)

 

회원서비스: MemberServiceImpl

 

주문과 할인 정책

- 회원은 상품을 주문가능

- 회원 등급에 따라 할인 정책을 적용

- 모든 VIP는 1000원을 할인해주는 고정 금액

 

회원 엔티티

회원등급

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

 

getter: 메소드로 필드값을 가공 후, 외부로 전달

setter: 외부에서 메소드를 통해 데이터에 접근하도록 함

 

회원 저장소

회원 저장소 인터페이스

package hello.core.member;

public interface MemberRepository {

    void save(Member member);

    Member findById(Long memberId);
}

save 메서드는 Member 객체를 저장하기 위한 메서드

findById 메서드는 저장소에서 특정 ID를 가진 회원을 찾기 위해 사용

 

메모리 회원 저장소 구현체

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

}


 

회원 서비스

회원 서비스 인터페이스

package hello.core.member;

public interface MemberService {

    void join(Member member);

    Member findMember(Long memberId);
}

join 메서드는 Member 객체를 받아서 회원으로 등록하는 기능

find는 특정 ID를 가진 회원을 검색하기 위해 사용

 

회원 서비스 구현체

package hello.core.member;

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

 

회원 도메인 실행과 테스트

회원 도메인 -회원 가입 main

package hello.core;

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

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

 

회원 도메인 - 회원 가입 테스트

package hello.core.member;

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

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

    }
}

 

Assertions.assertThat(member).isEqualTo(findMember);를 사용하여 저장한 회원(member)과 찾은 회원(findMember)이 동일한지를 확인합니다. 이 검증이 성공하면 join 메서드가 올바르게 동작한다고 볼 수 있다.

 

join VS save

 

  • join은 비즈니스 로직을 포함한 작업(예: 회원 가입, 유효성 검사 등)을 수행
  • save는 단순히 데이터를 저장소에 저장하는 작업을 수행

주문과 할인 도메인 개발

package hello.core.discount;

import hello.core.member.Member;

public interface DiscountPolicy {
    // @return 이 할인 대상 금액
    int discount(Member member, int price);
}

 

 

 

정액 할인 정책 구현체

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;


        }
    }
    }

 

주문 엔티티

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 calculaterPrice(){
        return itemPrice-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 +
                '}';
    }
}

 

주문 서비스 인터페이스

package hello.core.order;

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

 

주문 서비스 구현체

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

 

주문과 할인 정책 테스트

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

    }
}

 

'spring boot' 카테고리의 다른 글

springboot_JPA_프로젝트 환경설정  (0) 2024.09.17
객체 지향 원리  (0) 2024.07.28
스프링 개념  (1) 2024.07.20
회원관리  (0) 2024.07.04
스프링 웹 개발 기초  (0) 2024.05.23