스프링 공부 52

2-8. 주문과 할인 도메인 실행과 테스트

이번 회차에서는 저번 회차에서 만든 기능들을 일단 쌩으로 한 번 실행해보고, 그 다음에 테스트도 돌려본다. 2-5에서 했던 것과 동일하다. 그 전에 생각할 점이 하나 있다! 주문과 할인 도메인을 어떻게 설계했는지 떠올려보자 2-6. 주문과 할인 도메인 설계 저번 회차까지, 회원 정보를 어떻게 새로 저장하고 찾아올지와 관련된 구현 및 테스트를 했다. 지금부터는 할인 적용 기능에 대한 작업이 시작된다. 주문이 들어왔을 때 주문을 한 회원 정보 및 blowupmomo.tistory.com 클라이언트가 서비스에게 요청을 보내면 서비스가 MemberRepository와 DiscountPolicy에게 할 일을 던져주어 할인 적용 결과를 알아내 클라이언트에게 리턴해주는 방식으로 설계하였다. 그럼 오늘 만드는 실행 코..

2-7. 주문과 할인 도메인 개발

이번 회차에서는 저번 회차에 설계한 대로 개발을 한다. 일단 할인 정책 관련 DiscountPolicy 인터페이스 클래스와 정액할인의 내용을 담은 구현체 클래스부터 만들고, 주문의 정보를 저장하는 객체의 설계도가 될 Order 클래스를 만들고, 그 다음 주문을 받아 할인 결과를 알아내는 역할의 서비스 OrderService 인터페이스와 그 구현체 클래스를 만든다. 그러므로 다음과 같이 회원 정보 관리와 관련된 코드들이 들어있는 member 패키지와 같은 레벨에 discount 패키지와 order 패키지를 새로 만들어두고 시작하자. 할인 정책 관련 요소 개발 매우! 간단하다. 일단 인터페이스부터 만든다. 이렇게 하면 끝이다. 회원 객체와 원래 가격을 받아와서 얼마나 할인하면 되는지를 반환하는 메소드 하나만..

2-6. 주문과 할인 도메인 설계

저번 회차까지, 회원 정보를 어떻게 새로 저장하고 찾아올지와 관련된 구현 및 테스트를 했다. 지금부터는 할인 적용 기능에 대한 작업이 시작된다. 주문이 들어왔을 때 주문을 한 회원 정보 및 현재 이 회사의 할인 정책에 맞추어 할인 결과를 반환하는 시스템을 만들 것이다. 이번 회차에서는 아직 코드를 쓰지는 않고 이 기능을 구현하기 위한 도메인 설계만 해본다. 강의 영상과 자료에 이해를 돕는 다이어그램들이 있지만 이 게시글에 복붙하지는 않을 것이다. 복습 시에는 노트 정리와 강의자료를 함께 보자. 현재 상황 현재 상황을 한 마디로 설명하자면, 할인 정책이 언제 변경되어도 이상하지 않은 상황이다. 일반 회원과 VIP 회원 중 VIP 회원에게 1000원이라는 정액 할인을 적용할 것이라고 일단 이야기하고는! 있으..

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

저번 시간까지 회원 정보 관리와 관련된 도메인, 리포지토리, 서비스를 간단하게 만들었다. 아직 주문과 할인에 관련된 코드는 짜지 않았다. 이번 회차에서는 저번 시간까지 짠 것이 잘 동작하는지 테스트를 해본다. 먼저 순수 자바 코드로 테스트를 해보고, 그 다음에는 테스트를 돕는 프레임워크인 JUnit과, JUnit을 사용한 테스트 코드를 더 편리하게 해주는 라이브러리인 AssertJ를 사용하여 테스트할 것이다. 순수 자바 코드로 테스트해보기 junit과 assertj를 사용하지 않고 그냥 main에 순수하게 자바 코드를 적어서 실제 프로그램을 돌려본다. test가 아닌 main 폴더 내의 hello.core 안에 MemberApp 클래스를 만든다. 이 클래스에 main 메소드를 만들어주면 되는데 강사님께서..

2-4. 회원 도메인 개발

Grade Enum 만들기 회원 등급을 열거하는 enum인 Grade를 만들자. hello.core 하위에 member 패키지를 만든다. 그리고 그 안에 Grade라는 Enum을 만들어준다. Enum... 처음 써본다... 떨린다. 회원 등급은 일반 회원과 VIP 회원 두 가지이므로 이렇게 채워주면 된다. 회원 엔티티 클래스 만들기 회원 정보라는 것의 구조를 정의하는 회원 엔티티 클래스를 만든다. member 패키지 안에 Member 클래스를 만든다. 회원 정보에 포함되는 세 가지 필드인 id, name, grade를 적어준 다음, generate 기능 (윈도우 버전 Alt + Insert 단축키) 을 이용해 Member의 생성자를 만들고 세 가지 필드의 getter, setter도 모두 만들어준다. M..

2-3. 회원 도메인 설계

프로그램의 구성요소들이 어떻게 생겼고 서로 어떻게 연결되는지 다이어그램을 통해 살펴보는 시간이다. 다이어그램들을 보며 설명을 들으면 아주 이해가 쏙쏙 된다. 강의자료에 있는 다이어그램을 여기에 복붙해오는 것은 양심에 찔리므로, 다이어그램이 보고 싶을 땐 강의자료를 열어 살펴보기로 하고 여기에는 그렇게 다이어그램을 보며 복습을 할 때 필요한 내용을 간단하게 적어둬야겠다. 회원 도메인 협력 관계 익숙한 그림이다. 클라이언트는 회원 서비스에 의존한다. (입문 강의에서 배웠듯이, 서비스는 비즈니스 관점에서 필요한 기능을 정의한 클래스라는 것을 잊지 말자!) 회원 서비스는 회원가입, 회원조회 기능을 가지고 있다. 이 회원 서비스가 작동하려면 데이터 저장소가 필요하다. 우리는 하나의 데이터 저장소 인터페이스를 만들..

2-2. 비즈니스 요구사항과 설계

시작하기 전에 잡담 하나 하자면... (접은글) 더보기 스프링 입문 강의에 수강평을 적었더니 김영한 강사님께 하트와 답글을 받았다. 와우 자기 분야에서 매우 뛰어난 사람에게 응원을 전한 뒤 그 사람이 응원을 확인했다는 증거를 보는 것은 언제나 행복한 일이다. 무엇보다도... 굉장히 많은 수강평들을 하나하나 주기적으로 읽으신다는 게 존경스럽다. 거의 모든 수강평에 하루 이틀 내로 답글을 다셨던데... 어떻게 그러실 수가 있는지... 대단하시다. 이제 수업 내용을 보자. 이 회차는 앞으로 만들 예제의 비즈니스 요구사항 및 설계를 쫙 살피는 회차이다. 어떤 기능이 들어갈지, 그 기능에서 지켜야 할 것은 무엇인지 등을 본다. 우리에게 사이트 개발을 의뢰한 클라이언트가 요구한 사항은 다음과 같다. 회원정보 관련 ..

2-1. 프로젝트 생성

예제 실습을 시작한다. 입문 강의 때 회원 정보 관리 기능만 있는 예제를 제작했었는데, 이번에는 상품과 주문 정보까지 관리하는 프로그램을 만들 것이다. 저번처럼 간단한 예제이다. 이번 회차에서는 스프링 부트를 사용하여 프로젝트 생성까지만 진행한다. 스프링 부트 저번 입문 강의 때와 같이 https://start.spring.io/에 들어간다. 스프링 부트를 통해 프로젝트 준비를 끝낸 파일을 만들어주는 곳이다. 프로젝트: Gradle Project 언어: Java 스프링 부트 버전: 가장 최신의 정식 버전 (괄호가 붙지 않은 것) 프로젝트 메타데이터: 그룹 이름은 hello, 아티팩트는 core로 바꾸어주면 나머지는 자동으로 설정된다. 패키징: Jar Java: 건드리지 않고 기본 설정을 유지했다. 저번과..

1-5. 객체 지향 설계와 스프링

그래서 스프링과 객체 지향이 무슨 상관이 있는지 간단히 설명해주는 회차이다. 스프링 강의에 왜 객체 지향 이야기가 나오는가? 다형성에다가 OCP와 DIP까지 모두 가능하게 만들어주는 것이 스프링이기 때문이다. DI(의존성 주입), DI 컨테이너 제공 등의 기술을 통해 그렇게 한다. 덕분에 클라이언트 코드를 변경하지 않고 기능을 확장할 수 있으며, 부품을 교체하듯이 쉽게 개발할 수 있다. 어떤 불편함 때문에 스프링을 만들었는가? 스프링이라는 놈을 만들지 않더라도, 자바 코드를 아주 잘 짜서 스프링이 제공하는 그런 기술들을 직접 구현하면 OCP와 DIP를 준수할 수 있다. 그러나! 그러려면 할 것이 너무 많아진다. 개발을 좀더 편하고 깔끔하게 하려는 것 뿐인데, 이를 위해 본래의 핵심 코드보다 더 많은 양의..

1-4. 좋은 객체 지향 설계의 5가지 원칙(SOLID)

면접에서 물어볼 수도 있는 내용이라고 한다. SOLID란 저서 《클린 코드》로 유명한 로버트 마틴이 정리한 좋은 객체 지향 설계의 5가지 원칙. 좋은 객체 지향 설계가 어떤 것인지에 대한 개념은 이전에도 있었지만, 로버트 마틴이 이를 SOLID로 깔끔하게 정리해주었다. 1. SRP (Single Responsibility Principle): 단일 책임 원칙 2. OCP (Open/Closed Principle): 개방-폐쇄 원칙 3. LSP (Liskov Substitution Principle): 리스코프 치환 원칙 4. ISP (Interface Segregation Principle): 인터페이스 분리 원칙 5. DIP (Dependency Inversion Principle): 의존관계 역전 원..