티스토리 뷰

  본 포스팅은 인프런 김영한 강사님의 스프링 부트 핵심 원리 강의 섹션 2를 수강하고 배운 점을 정리했습니다.

 

스프링 핵심 원리 - 기본편 - 인프런 | 강의

스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., 스프링 핵심 원리를 이해하고, 성장하는 백엔드 개발자가 되어보세요! 📢

www.inflearn.com

 

0. 프로젝트 생성

입문 강의 때와 마찬가지로 Spring Initializer를 사용해서 프로젝트를 생성했다.

위와 같이 설정하는데, 이때 강의는 Java 11 버전을 기반으로 제작되었으므로 나도 똑같이 버전을 맞췄다.

자바 11 버전은 스프링부트 2.x.x 버전에서 호완성이 좋으므로 스프링부트 버전도 2점대로 맞췄다. 

 

또한 설정에 들어가서 Gradle 항목의 빌드와 런의 설정을 위와 같이 변경한다. 기본 설정은 gradle이었던 것 같은데 위와 같이 인텔리제이로 변경해 준다.

 

 

 

1. 회원 도메인 설계

 

회원 클래스 다이어그램은 아래와 같다.

회원 데이터는 자체 DB를 구축할 수 있고(MemoryMemberRepository) 혹은 외부 시스템(DbMemberRepository)과 연결할 수도 있다. 그러므로 역할 즉, 인터페이스 MemberRepository를 고정해 두고, 구현체를 열어둬서 추후에 유연하게 변경할 수 있도록 구성했다.

 

 

MemberRepository 인터페이스 코드

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

 

 

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

 

회원 도메인 - 회원 가입 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());
 	}
}

이 코드는 메인 패키지에 작성한 애플리케이션 로직의 테스트 코드이다. 이 방법은 좋지 않고 테스트할 때는 JUnit 테스트를 사용하는 것을 추천한다고 한다. 

 

아래와 같이 테스트 패키지에 given / when /then 세 가지 파트로 구성한 테스트 코드가 실무에서 좀 더 유용하게 쓰일 것이라고 한다.

package hello.core.member;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

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

 

-회원 도메인 설계의 문제점
의존관계가 인터페이스뿐만 아니라 구현까지 모두 의존하는 문제점이 있음

 

 

3. 주문과 할인 도메인 설계

 

주문 도메인 전체: 역할과 구현을 분리해서 자유롭게 구현 객체를 조립할 수 있게 설계했다. 덕분에 회원 저장소는 물론이고, 할인 정책도 유연하게 변경할 수 있다

회원 저장소때와 마찬가지로 할인 정책도 역할(인터페이스)과 구현체를 분리해서 현재는 '정액 할인 정책'을 사용하지만, 추후에 '정률 할인 정책'으로 변경할 때 유연하게 변경할 수 있도록 역할과 구현을 구분해서 구성했다.

 

할인 정책 인터페이스

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; //1000원 할인
    
 	@Override
 	public int discount(Member member, int price) {
 		if (member.getGrade() == Grade.VIP) {
 			return discountFixAmount;
 		} else {
 			return 0;
 		}
 	}
}

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함