FrameWork
-
스프링 기본 21 - 의존관계 자동 주입FrameWork/Spring&Spring-boot 2023. 11. 21. 10:50
다양한 의존관계 주입 방법 의존관계 주입은 크게 4가지 방법이 있다. 생성자 주입 수정자 주입(setter 주입) 필드 주입 일반 메서드 주입 생성자 주입 이름 그대로 생성자를 통새서 의존 관계를 주입 받는 방법이다. 앞선 게시물에서 진행했던 방법이 생성자 주입이다. 특징 생성자 호출시점에 딱 1번만 호출되는 것이 보장된다.(이후에 다시 setting X) ⭐불변,필수 의존관계에 사용 package com.hello.core.order; import com.hello.core.discount.DiscountPolicy; import com.hello.core.discount.FixDiscountPolicy; import com.hello.core.member.Member; import com.hello...
-
Spring 기본 20 - 중복 등록과 충돌FrameWork/Spring&Spring-boot 2023. 11. 14. 15:28
중복 등록과 충돌 컴포넌트 스캔에서 같은 빈 이름을 등록하려면 어떻게 될까? 수 빈 등록 vs 자동 빈 등록 컴포넌트 스캔에 의해 자동으로 스프링 빈이 등록되는데, 그 이름이 같은 경우 스프링은 오류를 발생시킨다. ConflictingBeanDefinitionException 예외 발생 수 빈 등록 vs 자동 빈 등록 만약 수동 빈 등록과 자동빈 등록에서 빈 이름이 충돌이 되면 어떻게 될까? @Component public class MemoryMemberRepository implements MemberRepository{} @Configuration @ComponentScan{ excludeFilter = @Filter(type = Filtertype.ANNOTATION, classes = Confi..
-
Spring 기본 19 - 필터FrameWork/Spring&Spring-boot 2023. 11. 14. 13:06
includeFilters : 컴포넌트 스캔 대상을 추가로 지정한다. excludeFilters: 컴포넌트 스캔에서 지외할 대상을 지정한다. @Target(), @Retention, @Documented, @Indexed 해당 어노테이션에 Type레벨에 붙을 것인지 Field레벨에 붙을 것인지 지정하는 것이다. 위 어노테이션이 붙은 것은 컴포넌트 스캔에 추가 할 것 이라는 의미이다. 두개의 어노테이션 생성 생성한 어노테이션을 사용하는 Java 설정 클래와 테스트 public class ComponentFilterAppConfigTest { @Test void filterScan(){ AnnotationConfigApplicationContext ac = new AnnotationConfigApplicat..
-
Spring 기본 18 - 탐색 위치와 기본 스캔 대상FrameWork/Spring&Spring-boot 2023. 11. 14. 10:36
탐색 위치와 기본 스캔 대상 탐색 위치와 기본 스캔 대상 모든 자바 클래스를 다 컴포넌트 스캔 하면 오래 걸린다. 그래서 꼭 필요한 위치부터 탐색하도록 시작 위치를 지정할 수 있다. basePackages = "hello.core.member" @Configuration @ComponentScan( basePackages = "hello.core.member", excludeFilters = @ComponentScan.Filter( type = FilterType.ANNOTATION, classes = Configuration.class) ) public class AutoAppConfig { } 위와 같이 설정하면 member 패키지만 컴포넌트 스캔에 대상이된다. @ComponentScan( baseP..
-
스프링 기본 17 - 컴포넌트 스캔FrameWork/Spring&Spring-boot 2023. 11. 13. 14:22
컴포넌트 스캔과 의존관계 자동 주입 시작하기 지금까지 스프링 빈을 등록할 때 는 자바 코드의 @Bean이나 XML의 등을 통해서 설정 정보에 직접 등록할 스프링 빈을 나열했다. 예제에서는 몇개가 안되었지만, 이렇게 등록해야 할 스프링 빈이 수십, 수백개가 되면 일이이 등록하기도 힘들고, 설정정보 파일의 크기도 커질 뿐더러, 등록되어야 할 메서드가 누락되는 문제도 발생한다. 그래서 스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔이라는 기능을 제공한다. 또 의존관계도 자동으로 주입하는 @Autowired라는 기능도 제공한다. 코드로 컴포넌트 스캔과 의존관계 자동 주입을 알아 보자 먼저 기존 AppConfig.java는 과거 코드와 테스트를 유지하기 위해 남겨두고, 새로운 AutoAp..
-
Spring 기본 15 - @Configuration과 싱글FrameWork/Spring&Spring-boot 2023. 11. 13. 10:16
다음 AppConfig코드르 살펴보자 @Configurable public class AppConfig { //@Bean memberService() -> new MemoryMemberRepository() //@Bean orderService() -> new MemoryMemberRepository() //new MemoryMemberRepository()가 두번 호출 되었는데 //그러면 싱글톤이 깨진거 아닐까? @Bean public MemberService memberService(){ return new MemberServiceImpl(memberRepository()); } @Bean public OrderService orderService(){ return new OrderServiceImp..
-
Spring 기본 15 - 싱글톤 방식의 주의점FrameWork/Spring&Spring-boot 2023. 11. 13. 09:25
싱글톤 방식의 주의점 싱글톤 패턴이든, 스프링 같은 싱글톤 컨테이너를 사용하든, 객체 인스턴스를 하나마 생성해서 공유하는 싱글톤 방식은 여러 클라이언트가 하나의 같은 객체 인스턴스를 공유하기 때문에 싱글톤 객체는 상태를 유지(stateful)하게 설계하면 안된다. ⭐무상태(stateless)로 설계해야 한다. 특정 클라이언트에 의존적인 필드가 있으면 안된다. 특정 클라이언트가 값을 변경할 수 있는 필드가 있으면 안된다. 가급적 읽기만 해야 한다. 필드 대신에 자에서 공유되지 않는, 지역변수, 파라미터, ThreadLocal등을 사용해야 한다. 스프링 빈 필드에 공유 값을 설정하면 정말 ⛔큰 장애가 발생할 수 있다. 상태를 유지할 경우 발생하는 문제점 예 클라이언트 의도 주문한다음에 price에 값을 저장..
-
Spring 기본 14 - 싱글톤 컨테이너FrameWork/Spring&Spring-boot 2023. 11. 12. 17:30
싱클톤 컨테이너 웹 애플리케이션과 싱글톤 스프링은 태생이 기업용 온라인 서비스 기술을 지원하기 위해 탄생했다. 대부분 스프링 애플리케이션은 웹 애플리케이션이다. 물론 웹이 아닌 애플리케이션 개발도 얼마든지 할 수 있다. 웹 애플리케이션은 보통 여러 고객이 동시에 요청을 한다. 객체 인스턴스가 해당 프로젝트의 JVM에 하나만 있어야 하는 패턴을 의미한다. 앞서 게시물에 작성한 코드를 기반으로 위 그림과 같이 고객이 요청을 3번을 하면 3개의 memberService 객체가 만들어진다. 즉 요청이 올때 마다 객체 인스턴스가 만들어 지고 있는 것이다. package com.hello.core.singleton; import com.hello.core.AppConfig; import com.hello.core...