전체 글 133

[스프링 핵심 원리] 섹션 2.7 예제만들기 (주문과 할인 도메인 개발)

2.7.1 할인 도메인 개발 앞선 섹션 2.6의 회원 도메인 설계를 바탕으로 회원 도메인을 개발해보자. 먼저, 할인 정책을 설정하기 위해 main > java > hello.core 에 discount 패키지를 생성하고, DiscountPolicy 인터페이스를 다음과 같이 작성한다. package hello.core.discount; import hello.core.member.Member; public interface DiscountPolicy { /** * @return 할인 대상 금액 */ int discount(Member member, int price); } int discount(Member member, int price) : 파라미터로 멤버 객체와 가격을 넘기는 discount 메소드를..

[스프링 핵심 원리] 섹션 2.6 예제만들기 (주문과 할인 도메인 설계)

2.6.1 주문 / 할인 도메인 설계 앞선 섹션 2.2의 비즈니스 요구사항을 바탕으로 주문 / 할인 도메인을 설계해보자. 주문 / 할 도메인 요구사항은 다음과 같다, 주문 / 할인 도메인 정책 1) 회원은 상품을 주문할 수 있다. 2) 회원 등급에 따라 할인 정책이 다르게 적용된다. 3) 모든 VIP 는 1000원을 할인해주는 고정 금액 할인이 적용된다. (나중에 변경 가능) 4) 할인 정책은 변경 가능하다. 최악의 경우 할인을 적용하지 않을 수 있다. (미확정) 주문 / 할인 도메인 요구사항을 설계해보면 다음과 같다. 클라이언트 : 클라이언트는 주문을 생성할 수 있다. (간단한 예제를 위해 상품 객체가 아닌 상품자체 데이터를 넘기도록 하였다.) 주문 서비스 역할 : 할인을 위해서는 회원 등급이 필요하므..

[스프링 핵심 원리] 섹션 2.5 예제만들기 (회원 도메인 실행과 테스트)

2.5.1 회원 도메인 테스트 - main 메소드 사용 앞선 섹션 2.4에서 작성한 회원 도메인이 정상적으로 작동하는지 테스트 해보자. 먼저, main > java > hello.core 에 order 패키지를 생성하고, MemberApp 클래스를 다음과 같이 작성한다. 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) { MemberServi..

[스프링 핵심 원리] 섹션 2.4 예제만들기 (회원 도메인 개발)

2.4.0 회원 도메인 설계 앞선 섹션 2.3의 회원 도메인 설계를 바탕으로 회원 도메인을 개발해보자. 다음의 인터페이스와 클래스들을 하나씩 만들어보고자 한다. 2.4.1 회원 서비스 개발 먼저, 회원 서비스를 개발하기 전에, 회원 등급을 생성해보자. main > java > hello.core 에 member 패키지를 생성하고, Grade 이름의 enum 파일을 생성한다. package hello.core.member; public enum Grade { BASIC, VIP } public enum Grade : 회원 등급은 BASIC / VIP 2가지로 나뉜다. 다음으로, 회원 정보를 담고 있는 Member 클래스를 만들어보자. member 패키지 아래에 Member 클래스를 생성하고, 다음과 같이 ..

[스프링 핵심 원리] 섹션 2.3 예제만들기 (회원 도메인 설계)

2.3.1 회원 도메인 요구사항 설계 앞선 섹션 2.2의 비즈니스 요구사항을 바탕으로 회원 도메인을 설계해보자. 회원 도메인 요구사항은 다음과 같다, 회원 도메인 요구사항 1) 회원 가입과 조회가 가능해야 한다. 2) 회원 등급은 일반 / VIP 로 나뉜다. 3) 회원 데이터는 자체 DB 를 구축할 수도 있고, 외부 시스템과 연동될 수도 있다. (미확정) 회원 도메인 요구사항을 설계해보면 다음과 같다. 클라이언트 : 클라이언트가 회원 서비스를 호출한다. 회원 서비스 : 회원 서비스는 회원 가입과 조회 기능을 제공한다. 회원 저장소 : 회원 저장소를 별도로 만들어, 회원 데이터에 접근하는 계층을 따로 생성한다. (회원 DB 를 자체 구축할 수도 있고, 외부 시스템과 연동될 수도 있으므로) 앞선 회원 도메인..

[스프링 핵심 원리] 섹션 2.2 예제만들기 (비즈니스 요구사항과 설계)

2.2.1 비즈니스 요구사항 비즈니스 요구사항은 회원/ 주문/ 할인 정책 3가지로 설정하였다. 요구사항을 하나씩 살펴보자. 회원 1) 회원 가입과 조회가 가능해야 한다. 2) 회원 등급은 일반 / VIP 로 나뉜다. 3) 회원 데이터는 자체 DB 를 구축할 수도 있고, 외부 시스템과 연동될 수도 있다. (미확정) 주문 1) 회원은 상품을 주문할 수 있다. 할인 정책 1) 회원 등급에 따라 할인 정책이 다르게 적용된다. 2) 모든 VIP 는 1000원을 할인해주는 고정 금액 할인이 적용된다. (나중에 변경 가능) 3) 할인 정책은 변경 가능하다. 최악의 경우 할인을 적용하지 않을 수 있다. (미확정) 앞선 비즈니스 요구사항에서 회원 데이터, 할인 정책은 미확정이지만, 개발은 진행되어야 하는 상황이다. 따라..

[스프링 핵심 원리] 섹션 2.1 예제만들기 (프로젝트 생성)

2.1.1 프로젝트 생성 (spring initializr 사용) JDK : Java 11 IDE : IntelliJ 사용 앞서 섹션 1에서 공부한 역할과 구현을 이용하여, 스프링 핵심 원리를 이해할 수 있는 간단한 예제를 만들어보고자 한다. 즉, 인터페이스와 이를 구현한 객체를 만들어야 하는데, 스프링을 이용하지 않고, 순수한 자바 코드로만 프로젝트를 만들어 보았다. 하지만 프로젝트 세팅 시에는, 스프링 부트를 이용하면 편리하므로 스프링 부트 스타터 사이트를 이용하여 프로젝트를 생성하였다. https://start.spring.io/ 사이트에 접속한 후, 아래와 같이 프로젝트를 설정한다. (자세한 설명 참조 : https://wlalsu.tistory.com/8) Dependencies 는 아무것도 선..

[이코테 python] Ch.5.2 BFS (+ 미로 탈출 문제)

5.2.1 BFS (Breadth-First-Search) 알고리즘 너비 우선 탐색 : 가까운 노드부터 차례대로 탐색하는 알고리즘 BFS 는 가장 가까운 노드부터 방문한 후, 다시 돌아가 다른 경로를 탐색하는 알고리즘을 말한다. 따라서, BFS 는 큐 자료구조 (선입선출) 를 이용하여 구현할 수 있다. BFS 동작 과정은 다음과 같다. 1) 큐에 탐색 시작 노드를 삽입하고, 방문값을 true 로 바꾼다. 2) 큐에서 방문하지 않은 인접노드를 모두 큐에 넣고, 방문값을 true 로 바꾼다. 4) 더 이상 방문할 노드가 없을 때까지 1, 2 번의 과정을 반복한다. 5.2.2 BFS 알고리즘 특징 BFS 알고리즘은 큐 자료구조를 이용하여 구현된다. 하지만, 실제 알고리즘을 구현할 때, 큐보다 deque 라이브..

[이코테 python] Ch.5.1 DFS (+ 음료수 얼려 먹기 문제)

5.1.1 DFS (Depth-First-Search) 알고리즘 깊이 우선 탐색 : 그래프에서 깊은 부분을 우선적으로 탐색하는 알고리즘 DFS 는 최대한 깊숙이 노드들을 방문한 후, 다시 돌아가 다른 경로를 탐색하는 알고리즘을 말한다. 따라서, DFS 는 스택 자료구조를 이용하여 구현할 수 있다. DFS 동작 과정은 다음과 같다. 1) 스택에 탐색 노드를 삽입하고, 방문값을 true 로 바꾼다. 2) 스택의 최상단 노드에서 방문하지 않은 인접노드를 스택에 넣고, 방문값을 true 로 바꾼다. 3) 스택의 최상단 노드에서 방분하지 않은 인접노드가 없으면, 단순히 최상단 노드를 꺼낸다. 4) 스택에 값이 없을 때까지 2, 3 번의 과정을 반복한다. 5.1.2 DFS 알고리즘 특징 DFS 알고리즘은 스택 자료..

[스프링 핵심 원리] 섹션 1.5 객체 지향 설계와 스프링

1.5.1 객체지향과 스프링 앞서 섹션 1.4에서, 다형성 만으로는 OCP, DIP 원칙일 지키지 못하는 경우가 생김을 알 수 있었다. 따라서, 위의 경우에서도 다형성을 지키기 위해 스프링은 다음 2가지 기술을 제공한다. DI (Dependency Injection) : 의존관계, 의존성을 주입한다. DI 컨테이너 제공 위의 스프링 기술을 사용하면, 클라이언트 코드 변경 없이도, 기능을 확장할 수 있게된다. 1.5.2 객체 지향 설계 정리 객체 지향의 다형성을 구현하기 위해, 모든 설계에서 역할과 구현을 구분해야 한다. 따라서, 모든 설계에 인터페이스를 부여하는 것이 가장 이상적이다. 하지만, 인터페이스를 사용하면 추상화 비용이 발생한다. 따라서, 확장할 가능성이 없으면 구현 클래스를 사용하다가, 필요할..