FrameWork/Spring&Spring-boot
-
Spring 기본 4 - 관심사의 분리FrameWork/Spring&Spring-boot 2023. 11. 9. 13:01
관심사의 분리 *관심사를 분리하자* 배우는 본인의 역할인 배역을 수행하는 것에만 집중해야 한다. 배우는 상대 배역이 어떤 배우가 되더라도 똑같이 공연할 수 있어야 한다. 공연을 구성하고, 담당 배우를 섭외하고, 역할에 맞는 배우를 지정하는 책임을 담당하는 별도의 *공연 기획자*가 나올시점이다. 공연기획자를 만들고, 배우와 공연 기획자의 책임을 확실히 분리하자. AppConfig 등장 애플리케이션 전체 동작 방식을 구성(config)하기 위해 구현 객체를 생성 하고, 연결 하는 책임을 가지는 별도의 설정 클래스를 만들자 *AppConfig* package com.hello.core; import com.hello.core.discount.FixDiscountPolicy; import com.hello.co..
-
Spring 기본3 - 객체 지향 원리 적용, OCP,DIP 위반의 문제FrameWork/Spring&Spring-boot 2023. 11. 9. 11:21
객체 지향 원리 적용3 새로운 할인 정책 개발 *새로운 할인 정책을 확장해 보자* https://agilemanifesto.org/iso/ko/manifesto.html 애자일 소프트웨어 개발 선언 애자일 소프트웨어 개발 선언 우리는 소프트웨어를 개발하고, 또 다른 사람의 개발을 도와주면서 소프트웨어 개발의 더 나은 방법들을 찾아가고 있다. 이 작업을 통해 우리는 다음을 가치 있게 agilemanifesto.org RateDiscountPolicy추가 새로운 할인 정책 적용과 문제점 *방금 추가한 할인 정책을 적용해 보자 할인 정책을 어플리케이션에 적용해보자 할인 정책을 변경하려면 클라이언트인 OrderServiceImpl 코드를 수정해야 한다. public class OrderServiceImpl im..
-
Spring 기본2 - 주문 할인 도메인 설계FrameWork/Spring&Spring-boot 2023. 11. 7. 18:08
주문과 할인 도메인 설계 주문과 할인 정책 회원은 상품을 주문할 수 있다. 회원은 등급에 따라 할인 정책을 적용할 수 있다. 할인 정책은 모든 VIP는 1000원은 할인해주는 고정 금액 할인을 적용해달라.(나중에 변경 될 수 있다.) 할인 정책은 변경 가능성이 높다. 회사의 할인 정책은 아직 확정되지 않았고, 오픈 직전까지 고민을 미루고 싶다. 최악의 경우 할인을 적용하지 않을 수 도 있다. 주문 도메인 협력,역할,책임 1. 주문생성: 클라이언트는 주문 서비스에 주문 생성을 요청한다. 2. 회원 조회 : 할인을 위해서는 회원 등급이 필요하다. 그래서 주문 서비스는 회우너 저장소에서 회원을 조회한다. 3. 할인 적용 : 주문 서비스는 회원 등급에 따른 할인 여부를 할인 정책에 위임한다. 4. 주문 결과 반..
-
Spring 기본1 - 회원 도메인 설계, SOLID 원칙FrameWork/Spring&Spring-boot 2023. 11. 7. 15:37
회원 도메인 설계 회원 도메인 요구사항 회원가입을 하고 조회할 수 있다. 회원은 일반과 VIP 두 가지 등급이 있다. 회원 데이터는 자체 DB를 구축할 수 있고, 외부 시스템과 연동할 수 있다.(미확정) 회원 도메인 협력 관계(역할) *기획자들도 볼수 있는 그림 회원 저장소라는 레이어를 별도로 만든다. 회원 DB를 자체 구축할 수도 있고 외부 시스템과 연동할 수도 있기 때문이다. 그래서 회원 데이터에 접근하는 계층을 따로 만드는 것이다. 회원 데이터를 어디서 끌어다 쓸지 결정이 되지 않았기때문 일단 메모리를 사용한 회원 저장소를 이용해 개발을 진행하기로 하였다. 메모리 회원 저장소는 test할때도 쓰이고 로컬에서 개발할 때도 쓰이고 할것이다. 이후에 어떤 회원 저장소를 쓸질 결정되면 그 부분만 빠르게 개..
-
@Configuration과 싱글톤FrameWork/Spring&Spring-boot 2022. 1. 11. 16:59
그런데 이상한점이 있다. 다음 AppConfig 코드를 보자 @Configuration public class AppConfig { //@Bean memberService -> new MemoryMemberRepository() //@Bean orderService -> new Memory/memberRepository() @Bean public MemberService memberService() { return new MemberServiceImpl(memberRepository()); } @Bean public OrderService orderService() { return new OrderServiceImpl(memberRepository(), discountPolicy()); } @Bean p..
-
싱글톤 방식의 주의점FrameWork/Spring&Spring-boot 2022. 1. 11. 14:22
싱클톤 패턴이든, 스프링 같은 싱글톤 컨테이너를 사용하든, 객체 인스턴스를 하나만 생성해서, 공유하는 싱글톤 방식은 여러 클라이언트가 하나의 같은 객체 인스턴스를 공유하기 때문에 싱글톤 객체는 상태를 유지(stateful)하게 설계하면 안된다. 무상태(stateless)로 설계해야 한다. - 특정 클라이언트에 의존적인 필드가 있으면 안된다. - 특정 클라이언트가 값을 변경할 수 있는 필드가 있으면 된다. - 가급적 읽기만 가능해야 한다.(가급적 값을 수정하면 안된다.) - 필드 대신에 자바에서 공유되지 않는, 지역변수, 파라미터, ThreadLocal 등을 사용해야 한다. 스프링 빈의 필드에 공유 값을 설정하면 정말 큰 장애가 발생할 수 있다. *상태를 유지할 경우 발생하는 문제점 예시* @Test vo..
-
싱글톤 컨테이너FrameWork/Spring&Spring-boot 2022. 1. 10. 18:28
스프링 컨테이너는 싱글톤 패턴의 문제점을 해결하면서, 객체 인스턴스를 싱글톤(1개만 생성)으로 관리한다. 지금까지 우리가 학습한 스프링빈이 바로 싱글톤으로 관리되는 빈이다. 싱글톤 컨테이너 스프링 컨테이너는 싱글톤 패턴을 적용하지 않아도, 객체 인스턴스를 싱글톤으로 관리한다. - 이전에 설명한 컨테이너는 생성 과정을 자세히 보자 컨테이너는 객체를 하나 생성해서 관리한다. 스프링 컨테이너는 싱글톤 컨테이너 역할을 한다. 이렇게 싱글톤 객체를 생성하고 관리하는 기능을 싱글톤 레지스트리라 한다. 스프링 컨테이너의 이런 기능 덕분에 싱글턴 패턴의 모든 단점을 해결하면서 객체를 싱글톤으로 유지할 수 있다. - 싱글톤 패턴을 위한 지저분한 코드가 들어가지 않아도 된다. - DIP, OCP, 테스트 private 생..
-
싱글톤 패턴FrameWork/Spring&Spring-boot 2022. 1. 10. 16:28
클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴이다. +한 JVM 즉 하나의 java 서버 안에서는 객체 인스턴스가 딱 하나만, 생성 되도록 하는 것 그래서 객체 인스턴스를 2개 이상 생성하지 못하도록 막아야 한다. private생성자를 사용해서 외부에서 임의로 new 키워드르 사용하지 못하도록 막아야 한다. public class SingletonService { private static final SingletonService instance = new SingletonService(); } static을 붙여서 필드 변수로 만들면, class 레벨에 올라가기 때문에, 딱 하나만 존재 하게 된다. public class SingletonService { private static ..