[Spring핵심기본편] 주문과 할인도메인 설계

KwangYong·2021년 10월 6일
0

Spring

목록 보기
7/16

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

회원 도메인 실행과 테스트

enum

커뮤니티 질문
🙆🏻‍♂️ enum은 선언된 순서에 따라 0, 1, 2 .. 의 순차적으로 증가된 값을 가집니다.
예시를 들자면,

enum Season{

	spring, summer, fall, winter
}
spring == 0 

summer == 1
fall ==2
winter ==3

따라서 수업 시간에 사용한 enum Grade안에 선언한
BASIC라는 코드는 0값을 가지는 상수입니다.
VIP라는 코드는 1값을 가지는 상수입니다.

❓ 1) Member member = new Member(1L, “이유진”, Grade.VIP);
System.out.println(member.getGrade()); 로 출력한다면 1이라는 상수가 나와야 할 것 같다고 추정했습니다.
하지만 결과는 VIP가 나왔습니다.

❗ 답변 :
Member member = new Member(1L, “이유진”, Grade.VIP);
여기서 member.getGrade() 메소드는 Grade.VIP의 주소값을 반환합니다.

member의 grade 필드는 Grade 클래스의 VIP라는 필드의 주소값을 알고 있는 것 입니다.
그런데 Grade의 필드 VIP는 그 자체로서 Grade 객체입니다.
Grade가 Enum이라는 열거형 객체이기 때문입니다.

주소를 따라가서 객체 이름을 출력하므로 VIP 가 출력됩니다.
Enum 열거형 클래스 Grade 가 선언된 순간, Grade 클래스를 상수처럼 사용할 수 있습니다.

Grade.VIP의 주소값은 컴파일타임에 정해지는 상수 객체이기 때문에 프로그램이 동작하는 동안 변할 수 없고 똑같습니다.

다시 말하면, Grade의 필드 VIP는 public static final 필드이면서 동시에 Grade객체입니다.

❓ 2) System.out.println(member,getGrade() == 1);은 int와 비교 시 에러가 난다는 문구가 나왔습니다.

❗ 답변: 맞습니다. 자료형이 다르니까 비교할 수 없어서 컴파일 에러가 발생합니다.
왜냐하면 1은 int라는 기본 자료형(primitive type)이고,
member.getGrade()는 enum 참조형(reference type) 즉, 객체형입니다.

❓ 3) equals로 Grade.VIP와 비교 했을 경우만 true가 나오고,
equals(“VIP”)는 false, ==를 통한 비교는 에러가 나게됩니다.

❗ 답변 : equals 는 메소드입니다. == 는 연산자 입니다.
메소드는 ‘값’을 비교합니다. 연산자는 대상의 ‘주소값’을 비교합니다.

call by value와 call by reference 차이를 떠올리시면 될 것 같습니다.
member.getGrade() 를 equals(Grade.VIP) 로 비교하면 true가 나옵니다.
둘다 주소값을 알고 있고 둘 다 객체가 상수객체이므로 주소가 같습니다.

모든 Grade 타입의 객체의 VIP는 같은 주소값을 가집니다.
그래서 Grade.VIP와 비교하면 true가 나옵니다.
member.getGrade() 를 equals(“VIP”) 로 비교하면 false가 나옵니다.
equals 메소드는 String객체 “VIP”와 컴파일 타임에 주소값이 정해진 객체 Grade.VIP 은 서로 다르기 때문입니다.
member.getGrade() == “VIP” 는 에러가 납니다.
member.getGrade() 는 컴파일 타임에 힙 영역에 주소값이 정해진 객체 Grade.VIP의 주소값을 참조합니다.

“VIP” 는 동적으로 생성한 객체의 주소값입니다. (프로그램 실행 도중 주소가 정해짐)
이미 할당된 주소값과 동적으로 생성하는 주소값은 비교할 수 없기 때문에 컴파일 에러가 납니다.


회원 도메인 설계의 문제점

  • 이 코드의 설계상 문제점은 무엇일까요?
  • 다른 저장소로 변경할 때 OCP 원칙을 잘 준수할까요?
  • DIP를 잘 지키고 있을까요?
  • 의존관계가 인터페이스 뿐만 아니라 구현까지 모두 의존하는 문제점이 있음
public class MemberServiceImpl implements MemberService {

    private final MemberRepository memberRepository = new MemoryMemberRepository();

추상화 (MemberService,인터페이스)에도 의존하고 구체화 (MemoryMemberRepository,구현)에도 의존한다.

주문과 할인도메인 설계



profile
바른 자세로 코딩합니다 👦🏻💻

0개의 댓글