Spring 기본편 (12) 썸네일형 리스트형 [JAVA 8] 스트림(Stream) 이란 ? 스트림이란 ? 스트림이란 데이터 처리 연산을 지원하도록 소스에서 추출된 연속된 요소로 정의할 수 있다. 컬렉션의 주제는 데이터고, 스트림의 주제는 계산이다. - 스트림은 filter, sorted, map 처럼 표현 계산식이 주를 이룬다. - filter, map, reduce, find, match, sort 등으로 데이터를 조작할 수 있다. - 스트림 연산은 순차적으로 또는 병렬로 실행할 수 있다. filter : 람다를 인수로 받아 스트림에서 특정 요소를 제외시킨다. 예제에서는 d -> d.getCalories() > 300 이라는 람다를 전달해서 300 칼로리 이상의 요리를 선택한다. map : 람다를 이용해서 한 요소를 다른 요소로 변환하거나 정보를 추출한다. 예제에서는 메서드 참조 Dish::.. 빈 스코프란 ? 빈스코프란? 지금까지 스프링 빈이 컨테이너의 시작과 함께 생성되어서 스프링 컨테이너가 종료될 때까지 유지된다고 학습했다. 이것은 스프링 빈이 기본적으로 싱글톤 스레드로 생성되기 때문이다. 스코프는 번역 그대로 빈이 존재할 수 있는 범위를 뜻한다. "스프링은 다음과 같은 다양한 스코프를 지원한다." (중요) "싱글톤" : 기본 스코프, 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프이다. (중요) "프로토타입" : 스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는 매우 짧은 범위의 스코프이다. "웹 관련 스코프" - (중요) "request" : 웹 요청이 들어오고 나갈때까지 유지되는 스코프이다. - "session" : 웹 세션이 생성되고 종료될.. @Configuration과 싱글톤 사실 @Configuration은 싱글톤 때문에 있는 것이다. 다음 AppConfig 코드를 보자. (이상한 것이 있다) public class AppConfig { // @Bean memberService --> new MemoryMemberRepository() // @Bean orderService --> new MemoryMemberRepository() @Bean public MemberService memberService() { return new MemberServiceImpl(new memberRepository()); } @Bean public MemberRepository memberRepository() { return new MemoryMemberRepository(); } @Be.. 웹 애플리케이션과 싱글톤 웹 애플리케이션과 싱글톤 웹 애플리케이션과 싱글톤 - 스프링은 태생이 기업용 온라인 서비스 기술을 지원하기 위해 탄생했다. - 대부분의 스프링 애플리케이션은 웹 애플리케이션이다. 물론 웹이 아닌 애플리케이션 개발도 얼마든지 개발할 수 있다. - 웹 애플리케이션은 보통 여러 고객이 동시에 요청을 한다. public class SingletonTest { @Test @DisplayName("스프링 없는 순수한 DI 컨테이너") void pureContainer() { AppConfig appConfig = new AppConfig(); // 1. 조회: 호출할 때 마다 객체를 생성 MemberService memberService1 = appConfig.memberService(); // 2. 조회: 호출할.. 4장-(8). 스프링 빈 설정 메타정보 - BeanDefinition 스프링 빈 설정 메타 정보 - BeanDefinition - 스프링은 어떻게 이런 다양한 설정 형식을 지원하는 것일까? 그 중심에는 'BeanDefinition' 이라는 추상화가 있습니다. - 쉽게 이야기해서 '역할과 구현을 개념적으로 나눈 것' 입니다.!! - XML을 읽어서 BeanDefinition을 만들면 됩니다. - 자바 코드를 읽어서 BeanDefinition을 만들면 됩니다. - 스프링 컨테이너는 자바 코드인지, XML인지 몰라도 됩니다. 오직 BeanDefinition만 알면 됩니다. - BeanDefinition을 빈 설정 메타정보라고 합니다. - @Bean, 당 각각 하나씩 메타 정보가 생성됩니다. - 스프링 컨테이너는 이 메타정보를 기반으로 스프링 빈을 생성합니다. 정리 - BeanD.. 4장-(7). 다양한 설정 형식 지원 - 자바코드,XML 다양한 설정 형식 지원 - 자바 코드 , XML - 스프링 컨테이너는 다양한 형식의 설정 정보를 받아드릴 수 있게 유연하게 설계되어 있습니다. - 자바 코드, XML, Groovy 등등 애노테이션 기반 자바 코드 설정 사용 - 지금까지 했던 것이다. - 'new AnnotationsConfigApplicationContext(AppConfig.class)' - AnnotationConfigApplicationContext 클래스를 사용하면서 자바 코드로 된 설정 정보를 넘기면 됩니다. XML 설정 사용 - 최근에는 스프링 부트를 많이 사용하면서 XML 기반의 설정은 잘 사용하지 않는다. 아직 많은 레거시 프로젝트들이 XML로 되어있고, 또 XML을 사용하면 컴파일 없이 빈 설정 정보를 변경할 수 있는 장.. 전체 흐름 정리 지금까지의 흐름을 정리해보자 - 새로운 할인 정책 개발 - 새로운 할인 정책 적용과 문제점 - 관심사의 분리 - AppConfig 리팩터링 - 새로운 구조와 할인 정책 적용 "새로운 할인 정책 개발" 다형성 덕분에 새로운 정률 할인 정책 코드를 추가로 개발하는 것 자체는 아무 문제가 없음 "새로운 할인 정책 적용과 문제점" 새로 개발한 정률 할인 정책을 적용하려고 하니 "클라이언트 코드"인 주문 서비스 구현체도 함께 변경해야함 주문 서비스 클라이언트가 인터페이스인 "DiscountPolicy" 뿐만 아니라, 구체 클레스인 "FixDiscountPolicy" 도 함께 의존 -> "DIP 위반" "관심사의 분리" - 애플리케이션을 하나의 공연으로 생각 - 기존에는 클라이언트가 의존하는 서버 구현 객체를 직접.. 5. [Spring] AppConfig 리팩터링 현재 AppConfig를 보면 "중복"이 있고, "역할"에 따른 "구현"이 잘 안보인다. "기대하는 그림" "리팩터링 전" package hello.core; import hello.core.discount.FixDiscountPolicy; import hello.core.member.MemberService; import hello.core.member.MemberServiceImpl; import hello.core.member.MemoryMemberRepository; import hello.core.order.OrderService; import hello.core.order.OrderServiceImpl; public class AppConfig { public MemberService memb.. 4. [Spring] 관심사의 분리 (객체 지향 원리의 적용) 관심사의 분리 - 애플리케이션을 하나의 공연이라 생각해보자. 각각의 인터페이스를 배역(배우 역할)이라 생각하자. 그런데 실제 배역이 맞는 배우를 선택하는 것은 누가 하는가? - 로미오와 줄리엣 공연을 하면 로미오 역할을 누가 할지 줄리엣 역할을 누가 할지는 배우들이 정하는게 아니다. 이전 코드는 마치 로미오 역할(인터페이스)을 하는 레오나르도 디카프리오(구현체, 배우)가 줄리엣 역할(인터페이스)을 하는 여자 주인공(구현체, 배우)을 직접 초빙하는 것과 같다. 디카프리오는 공연도 해야하고 동시에 여자 주인공도 공연에 직접 초빙해야하는 "다양한 책임"을 가지고 있다. "관심사를 분리하자" - 배우는 본인의 역할인 배역을 수행하는 것에만 집중해야 한다. - 디카프리오는 어떤 여자 주인공이 선택되더라도 똑같이 .. 3. [Spring] 새로운 할인 정책 설계 및 개발 새로운 할인 정책 개발 "새로운 할인 정책을 확장해보자." - 악덕기획자: 서비스 오픈 직전에 할인 정책을 지금처럼 고정 금액 할인이 아니라 좀 더 합리적인 주문 금액당 할인하는 정률%할인으로 변경하고 싶어요. 예를 들어서 기존 정책은 VIP가 10000원을 주문하든 20000원을 주문하든 항상 1000원을 할인했는데, 이번에 새로 나온 정책은 10%로 지정해두면 고객이 10000원 주문시 1000원을 할인해주고, 20000원 주문시에 2000원을 할인해주는거에요! - 순진 개발자: 제가 처음부터 고정 금액 할인은 아니라고 했잖아요. - 악덕 기획자: 애자일 소프트웨어 개발 선언 몰라요? "계획을 따르기보다 변화에 대응하기를" - 순진 개발자: .....(하지만 난 유연한 설계가 가능하도록 객체지향 설계.. 이전 1 2 다음