
오늘은 지난번에 간단하게 구현했던 회원 관리 시스템에서 할인 정책을 추가할 거예요.
앞서 구현한 1탄 먼저 보고 와주세요!
[Java] 회원 관리 시스템 구현하기 - 1탄
오늘은 순수 자바 코드로 간단한 회원 관리 시스템을 구현해볼 거예요!저는 인텔리제이를 사용하고 있습니다. :) 📌 프로젝트 구조 📌 Grade.java (회원 등급) 회원 등급은 일반 등급과 VIP 등
zero-talk.tistory.com
📌 프로젝트 구조

📌 DiscountPolicy.java (할인 정책 인터페이스)
package hello.core.discount;
import hello.core.member.Member;
public interface DiscountPolicy {
// @return 할인 대상 금액 ex. 1000
int discount(Member member, int price);
}
📌 FixDiscountPolicy.java (할인 정책 구현체)
if문을 사용해 회원의 등급이 VIP일 경우 1000원을 할인해주도록 구현합니다.
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.java (주문 객체)
물품 가격에서 할인 가격을 빼는 간단한 비즈니스 로직을 추가합니다. (할인)
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 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 +
'}';
}
}
📌 OrderService.java (주문 인터페이스)
Order 객체를 반환합니다. (memberId, itemName, itemPrice)
package hello.core.order;
public interface OrderService {
Order createOrder(Long memberId, String itemName, int itemPrice);
}
📌 OrderServiceImpl.java (주문 구현체)
memberId로 회원을 찾고 해당 회원이 VIP이면 할인을 해주도록 작성합니다.
할인이 되면 새로운 Order 객체가 생성될 테니 new Order를 반환합니다.
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);
}
}
📌 OrderApp.java
지금까지 작성했던 코드를 실행할 클래스입니다.
package hello.core;
import hello.core.order.Order;
import hello.core.member.Grade;
import hello.core.member.Member;
import hello.core.member.MemberService;
import hello.core.member.MemberServiceImpl;
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.calculatePrice = " + order.calculatePrice());
}
}
회원과 물품, 물품 가격, 등급에 따른 할인 가격이 출력되는 것을 확인할 수 있습니다.

위와 같은 방식으로 java로 테스트를 하는 것보다 (main에서 실행)
api를 사용해 테스트를 하는 게 더 유용하므로 해당 방법으로도 테스트를 해보겠습니다.

기존에 코드를 작성하던 main 디렉토리 말고 test 디렉토리에서 테스트를 할 수 있습니다.
저는 OrderServiceTest 라는 이름으로 테스트용 java 클래스를 생성했어요.
📌 OrderServiceTest.java (JUnit 테스트)
이와 같은 방법으로 단위 테스트를 하는 게 중요합니다.
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;
public 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);
}
}
해당 테스트 파일을 실행하면 실행이 잘 되는 것을 확인할 수 있습니다.

'☁️ 구름 x 카카오 Deep Dive 풀스택 > Java' 카테고리의 다른 글
[Java] 회원 관리 시스템 구현하기 - 1탄 (2) | 2025.02.04 |
---|---|
[Java] 문자열 처리 과정에 있어서 메모리 사용랑과 처리 속도 효율적으로 하기 (0) | 2025.01.14 |