해당 강의는 김영한 강사님의 유료 강의로, 아주 간략하게 배운 부분들을 짚고 넘어가는 식으로 작성하였습니다.
생략된 부분이 많습니다. 전체 소스코드 공개도 금지이므로 블로그에 부분적으로만 올릴 생각입니다.
강의를 보며 포스트잇을 붙이는 느낌으로 제가 보기 위해 작성하는 글이니
학습을 위해서라면 아래 링크의 강의를 직접 들으시는 것을 추천합니다!
스프링 핵심 원리 - 기본편 - 인프런 | 강의
스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., - 강의 소개 | 인프런...
www.inflearn.com
설정
최근 InteliJ 버전이 Gradle을 통해 실행하는 것보다 자바로 바로 실행하는 것이 속도가 더 빠르기 때문에
다음과 같은 설정을 먼저 해준다.
비즈니스 요구사항과 설계
회원, 주문, 할인 이렇게 3가지 요구 사항이 있다.
회원
...
주문과 할인 정책
...
요구사항을 보면 회원 데이터, 할인 정책 같은 부분은 지금 결정하기가 어려운 부분인데,
이런 정책이 결정될 때 가지 개발을 무기한 연기할 수도 없는 노릇이다.
따라서 객체 지향 설계 방법을 사용해야한다.
인터페이스를 만들고 구현체를 언제든지 갈아끼울 수 있도록 설계해보자
회원 도메인 설계
회원 도메인 요구사항
...
> 회원 도메인 협력 관계
여기서 메모리 회원 저장소, DB 회원 저장소가 있는데,
메모리 회원 저장소는 간단하게 그냥 자바 코드로(메모리로) 회원 객체를 넣었다 뺐다(저장하고 불러오기) 할 수 있는
메모리 회원 저장소를 일단 만들어서 진행하기로 한 것이다.
이 메모리 회원 저장소는 테스트할 때도 쓰이고, 로컬에서 개발할 때도 쓰이고 할 것이다.
하지만 메모리이기 때문에 컴퓨터가 껐다 켜지면(서버가 재부팅되면) 데이터가 다 날아간다.
그래서 딱 개발용으로만 쓰는 것이다.
쓰다가 DB 회원저장소나 외부 회원 저장소가 구현이되면 그것으로 갈아끼우면 된다.
(역할[인터페이스]과 구현[Impl], 구현을 딱 갈아끼우는 것이다.)
> 회원 클래스 다이어그램
MemberRepository(인터페이스)에 대한 구현 클래스로 MemoryMemberRepository, DbMemberRepository
> 회원 객체 다이어그램
여기서 회원서비스 옆에 Impl 생략되어 있는데 Impl이다. ( 회원 서비스 : MemberServiceImpl )
이게 뭐냐면, 실제 서버에 올라오면
객체간에 어떤, 메모리간에 참조들이 어떻게되는지 보여주는 것이다.
클라이언트는 회원 서비스(Impl)를 바라보고, 회원 서비스(Impl)는 메모리 회원 저장소를 바라보게 된다.
즉, 실제 객체 간의 메모리 참조를 보여주는 것이다.
서버가 떠서 클라이언트 객체가 실제 사용하는(참조하는) 주소값에 있는 인스턴스는 회원서비스(Impl)이다.
참고로,
회원 도메인 협력 관계 는 기획자들도 볼 수 있는 그림이다.
이걸 바탕으로 개발자들이 구체화해서 클래스 다이어그램을 만들어낸다.
객체 다이어그램 에서는 클래스 다이어그램에서 동적으로 결정(서버가 뜰때 new해서 뭘 넣을거야) 되는
MemoryMemberRepository를 넣을지 DbMemberRepository를 넣을지와 같은 경우
클래스 다이어그램만으로 판단하기 어렵다.
그래서 이 객체다이어그램이라는 것이 따로 있다.
서버가 떠서 클라이언트가 실제로 사용하는 즉, 실제 new한 인스턴스 끼리의 참조라고 보면 된다.
회원 도메인 개발
(소스코드 작성 파트)
회원 엔티티
>우선 회원 등급을 설정한다. enum으로 BASIC과 VIP를 만든다.
> 이제 회원 엔티티를 클래스로 만든다.
id, name, grade의 세 가지 속성을 가지고 있다.
생성자도 만든다. 그리고 getter, setter도 만든다.
회원 저장소
> MemberRepository 인터페이스를 만든다.
여기다 회원을 저장(save)하고 찾는 기능(findById)을 만든다.
> MemberRepository 에 대한 구현체를 만든다. (MemoryMemberRepository)
우선 memberId와 Member를 담을 Map (저장소)를 만든다.
(실무에서는 동시성 이슈가 있을 수 있기 때문에 여기서 Map을 쓰지 않는다.)
static으로 생성하는 이유는 싱글톤을 사용하는 것처럼 메모리 DB하나를 계속 공유해야해서 하나만 생성되게 만든 것이다.
그리고 우클릭 - Generate - Implement Methods
회원 서비스
> 이제 MemberService 인터페이스를 만든다.
회원가입(join)과 회원조회(findMember) 기능을 만든다.
> MemberService 구현체를 만든다. (MemberServiceImpl)
가입하고 회원을 찾으려면 MemberRepository 인터페이스가 필요하니 작성해준다.
Final 키워드 사용은 불변 객체로 선언하기 위해서다.
생성자 주입 이후에 변경이 불가능하도록 하여 추후 변경 여지를 막는 것이다.
회원가입(join)과 회원조회(findMember) @Override하고 코드를 작성한다.
여기서 이제 join해서 save를 호출하면, 다형성에 의해서
MemberRepository 인터페이스가 아니라 MemoryMemberRepository에 있는 save(Override한 save)가 호출된다.
(다형성 :
하나의 객체가 여러 가지 타입을 가질 수 있는 것을 의미한다.
상위 클래스가 동일한 메시지로 하위 클래스들을 서로 다르게 동작시키는 객체 지향 원리이다.
다형성을 활용하면 부모 클래스가 자식 클래스의 동작 방식을 알 수 없어도
오버라이딩을 통해 자식 클래스를 접근할 수 있다. )
다음 글에선 회원 도메인 - 회원 가입 main을 이어서 작성하겠다!
'김영한님의 스프링 강의 학습 > 스프링 핵심 원리' 카테고리의 다른 글
#3 스프링 핵심 원리 이해2 - 객체지향 원리 적용2 (0) | 2022.10.01 |
---|---|
#3 스프링 핵심 원리 이해2 - 객체지향 원리 적용1 (1) | 2022.09.30 |
#2 스프링 핵심 원리 이해 - 예제 만들기2 (0) | 2022.09.29 |
#1 객체 지향 설계와 스프링 (0) | 2022.07.07 |
#0 스프링 핵심 원리 - 기본편 목차 (0) | 2022.07.06 |