일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- inflearn
- 우아한 테크 세미나
- Four Squares
- HTTP
- TCP/IP
- 제프리리처
- Operating System
- n타일링2
- FIFO paging
- Operating System.
- 이펙티브코틀린
- C++
- 운영체제
- C#
- 윤성우 저자
- OS
- 김영한
- 스프링 입문
- Window-Via-c/c++
- redis
- 스프링 핵심 원리
- Spring
- 에러핸들링
- 열혈 TCP/IP 소켓 프로그래밍
- 10026번
- 토마토
- BOJ
- 2475번
- 열혈 tcp/ip 프로그래밍
- 우아한레디스
- Today
- Total
목록스프링 핵심 원리 (21)
나의 브을로오그으

생성자 주입을 선택해라 최근 DI 프레임워크에서는 대부분 생성자 주입을 권장한다. 불변 - 대부분의 의존관계 주입은 한번 일어나면 어플리케이션 종료시점까지 의존관계를 변경할 일이 없다. 오히려 대부분의 의존관계는 어플리케이션 종료 전까지 변하면 안된다. - 수정자 주입을 사용하면 누군가 실수로 변경될 수도 있다. 이것은 좋은 설계 방법이 아니다. - 생성자 주입은 객체 생성시 1회 호출되므로 불변 설계가 가능하다. 누락 - 순수 자바 코드를 단위 테스트 하는 경우, public class OrderServiceImpl implements OrderService { private MemberRepository memberRepository; private DiscountPolicy discountPolic..

옵션 처리 주입할 스프링 빈이 없어도 동작해야 할 때가 있다. 그런데 @Autowired만 사용하면 required옵션의 기본값이 true로 되어 있어서 자동 주입 대상이 없으면 오류가 발생한다. - 자동 주입 대상을 옵션으로 처리하는 방법 * @Autowired(required = false) : 자동 주입할 대상이 없으면 수정자 메서드 자체가 호출 안됨. * org.springframework.lang.@Nullable : 자동 주입할 대상이 없으면 null 입력 * Optional : 자동 주입할 대상이 없으면 Optional.empty가 입력됨. @Autowired(required = false) public void setNoBean1(Member member) { System.out.print..

다양한 의존관계 주입 방법 - 생성자 주입 - 수정자 주입(setter 주입) - 필드 주입 - 일반 메서드 주입 생성자 주입 @Component public class OrderServiceImpl implements OrderService { private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; @Autowired public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) { this.memberRepository = memberRepository; this.discountPolicy =..

컴포넌트 스캔과 의존관계 자동 주입 시작하기 - 지금까지 스프링 빈을 등록할 때는 자바 코드의 @Bean이나 XML의 등을 통해서 설정 정보에 직접 등록할 스프링 빈을 나열했다. - 예제에서는 몉개가 안되었지만, 이렇게 등록해야 할 스프링 빈이 수십, 수백개가 되면 일일이 등록하기도 귀찮고, 설정 정보도 커지고, 누락하는 문제도 발생한다. - 그래서 스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔이라는 기능을 제공한다. - 또 의존관계도 자동으로 주입하는 @Autowired라는 기능도 제공한다. [AutoAppConfig] package hello.core; import org.springframework.context.annotation.ComponentScan; import ..

AppConfig 클래스의 메소드를 보면 싱글턴이 깨질지 안깨질지를 확인해보자. 예를 들어 memberService()를 호출하면 MemberServiceImpl() 인스턴스를 반환할 때 memberRepository() 메소드를 호출한다. 여기서 MemoryMemberRepository() 인스턴스를 반환하는데 orderService() 에서도 MemoryMemberRepository() 인스턴스를 반환한다. 그렇다면, memberService()와 orderService() 모두 MemoryMemberRepository() 메소드를 중복 호출하기에 싱글톤 인스턴스를 생성해서 반환하는게 아니라, 각각 개별적인 인스턴스를 반환하는 거 아닐까? package hello.core.singleton; impo..

웹 애플리케이션과 싱글톤 - 스프링은 태생이 기업용 온라인 서비스 기술 지원을 위해 탄생했다. - 대부분의 스프링 앱은 웹 앱이다. 물론 웹이 아닌 애플리케이션 개발도 얼마든지 가능하다. - 웹 앱은 보통 여러 고객이 동시 요청을 한다. [BeanDefinitionTest] package hello.core.beandefinition; import hello.core.order.AppConfig; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.contex..

스프링 빈 설정 메타 정보 - BeanDefinition - 스프링은 어떻게 이런 다양한 설정 형식을 지원하는 것일까? 그 중심에는 BeanDefinition이라는 추상화가 있다. - 쉽게 말하면 역할과 구현을 나눈것. * XML을 읽어서 BeanDefinition을 만든다. * 자바 코드를 읽어서 BeanDefinition을 만든다. * 스프링 컨테이너는 자바 코드인지, XML인지 몰라도 된다. 오직 BeanDefinition만 알면 된다. - BeanDefinition을 빈 설정 메타정보라 한다. * @Bean 당 각각 하나의 메타 정보가 생성된다. - 스프링 컨테이너는 이 메타정보를 기반으로 스프링 빈을 생성한다. - ApplicationContext를 구현한 AnnotationConfigAppli..

다양한 설정 형식 - JAVA, XML - 애노테이션 기반 자바 코드 설정 사용 * 가장 많이 사용하는 방식 * new AnnotationConfigApplicationContext(AppConfig.class); * AnnotationConfigApplicationContext 클래스를 사용하면서 자바 코드로된 설정 정보를 넘기면 된다. - XML 설정 사용 - 최근에는 스프링 부트를 많이 사용하면서 XML기반의 설정은 잘 사용하지 않는다. 아직 많은 레거시 프로젝트 들이 XML로 되어 있고, 또 XML을 사용하면 컴파일 없이 빈 설정 정보를 변경할 수 있는 장점도 있으므로 한번쯤 배워두는 것도 좋다. - GenericXmlApplicationContext를 사용하면서 xml 설정 파일을 넘기면 된다...

BeanFactory와 ApplicationContext BeanFactory - BeanFactory는 스프링 컨테이너의 최상위 인터페이스다. - 스프링 빈을 관리하고 조회하는 역할을 담당한다. - getBean()을 제공한다. - 지금까지 우리가 사용했던 기능들 대부분이 BeanFactory에서 제공하는 기능이다. ApplicationContext - BeanFactory 기능을 모두 상속받아서 제공한다. - 빈을 관리하고 검색하는 기능을 BeanFactory가 제공해주는데, 그러면 둘의 차이가 뭘까? - 애플리케이션을 개발할 때는 빈은 관리하고 조회하는 기능은 물론이고, 수 많은 부가기능이 필요하다. (환경에는 3 + 1가지 환경이 있다. 로컬에서 개발하는 로컬환경, 테스트 서버에서 테스트 목적으로..

스프링 빈 조회 기본 스프링 컨테이너에서 스프링 빈을 찾는 가장 기본적인 조회 바업ㅂ * ac.getBean("빈 이름", 타입); * ac.getBean(타입); * 조회 대상 스프링 빈이 없으면 예외 발생 * NoSuchBeanDefinitionException : No bean named 'xxxxx' avaliable package hello.core.beanfind; import hello.core.member.MemberService; import hello.core.member.MemberServiceImpl; import hello.core.order.AppConfig; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter...