일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 | 31 |
- Today
- Total
- 스프링 Configuration
- 도커
- 빈 중복 오류
- 의존관계 주입
- DI
- 스프링 싱글톤
- RequiredArgsConstructor
- 라즈베리파이
- Spring interceptor
- Autowired 옵션
- UsernamePasswordAuthenticationFilter
- Servlet Filter
- 스프링
- ComponentScan
- 스프링 빈
- 생성자 주입
- HandlerMethodArgumentResolver
- 스프링 빈 조회
- 객체지향
- Spring
- 롬복 Qualifier
- qualifier
- DI컨테이너
- docker
- beandefinition
- 스프링 컨테이너
- autowired
- 싱글톤 컨테이너
- 라즈베리파이4
- springsecurity
목록분류 전체보기 (35)
그날그날 공부기록
public class SingletonTest { @Test @DisplayName("스프링 없는 순수한 DI 컨테이너") void pureContainer(){ AppConfig appConfig = new AppConfig(); //1. 조회: 호출할 때 마다 객체를 생성 MemberService memberService = appConfig.memberService(); //2. 조회: 호출할 때 마다 객체를 생성 MemberService memberService2 = appConfig.memberService(); //참조값이 다른 것을 확인 System.out.println("memberService = " + memberService); System.out.println("memberServ..
이 전 포스팅에서 java와 xml을 이용하여 스프링 빈 정보를 작성하였다. 스프링은 어떻게 다양한 방법으로 작성된 설정 정보를 읽고 이해할 수 있을까? XML로 작성하든 java로 작성하든 BeanDefinition으로 추상화하기 때문이다. BeanDefinition은 빈 설정 메타정보이다. 스프링 컨테이너를 생성하는 자바 코드를 확인해 보면 다음과 같이 형식에 맞는 BeanDefinitionReader를 생성한다. 그리고 reader는 코드를 읽고 BeanDefinition을 생성한다. 스프링 컨테이너는 java나 xml을 읽고 생성된 BeanDefinition을 이용하여 스프링 빈을 생성한다. 어떤 언어로 작성되었든 BeanDefinitionReader를 통해 생성된 BeanDefinition만 있..
BeanFactory와 ApplicationContext를 스프링 컨테이너라고 한다. BeanFactory(Interface) ↑ ApplicationContext(Interface) ↑ AnnotationConfigApplicationContext 다음과 같은 계층으로 이루어져 있다. BeanFactory 스프링 컨테이너의 최상위 인터페이스 스프링 빈을 관리, 조회하는 역할 → getBean() 제공 ApplicationContext BeanFactory를 상속 여러 부가기능을 위해 BeanFactory뿐만 아니라 다음과 같은 인터페이스를 상속받고 있다. 스프링 컨테이너는 자바 코드, XML, Groovy 등 다양한 형식의 설정 정보를 받을 수 있도록 유연하게 설계되어 있다. 자바 코드 → Annota..
생성된 스프링 빈을 여러가지 방법으로 조회할 수 있다. 기본적으로 getBean(”빈 이름", “타입”)으로 조회하면 된다. 1. 빈 이름과 타입으로 조회 AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class); @Test @DisplayName("빈 조회 - 이름, 타입") void findBeanByName(){ MemberService memberService = ac.getBean("memberService", MemberService.class); assertThat(memberService).isInstanceOf(MemberServiceImpl.class); } “memberS..
스프링 컨테이너 생성 과정 ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class); ApplicationContext를 스프링 컨테이너라고 한다.(정확히는 BeanFactory와 ApplicationContext로 구분) ApplicationContext는 인터페이스이고, 애노테이션에 기반하여 설정 클래스를 생성했기 때문에 AnnotationConfigApplicationContext라는 구현체를 사용한다. 스프링이 생성되는 과정은 다음과 같다. 하지만 생성자를 호출하며 의존관계 설정도 한번에 이루어지기 때문에 개념적인 단계라고 한다. 스프링 컨테이너 생성 new AnnotationConf..
public class OrderServiceImpl implements OrderService{ //어떤 인터페이스에 의존하는지 알 수 있다. //하지만 어떤 구현체가 들어올진 실행 시점에서 결졍된다. private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) { this.memberRepository = memberRepository; this.discountPolicy = discountPolicy; } @Override public..
스프링의 원리를 이해하기 위해 스프링을 사용하지 않고 자바로 구현해보았다. public class OrderServiceImpl implements OrderService{ private final MemberRepository memberRepository = new MemoryMemberRepository(); private final DiscountPolicy discountPolicy = new RateDiscountPolicy(); // private final DiscountPolicy discountPolicy = new FixDiscountPolicy(); @Override public Order createOrder(Long memberId, String itemName, int item..
0630 공부 좋은 객체지향 설계의 5가지 원칙 - SOLID SRP: 단일 책임 원칙(Single Responsibility Principle) 한 클래스는 하나의 책임만 가져야 한다. 하나의 책임이라는 것은 모호하다. 클 수 있고, 작을 수 있다. 문맥과 상황에 따라 다르다. 중요한 기준은 변경. 변경 시 파급 효과가 적으면 SRP를 잘 따른것 OCP: 개방-폐쇄 원칙(Open/Closed Principle) 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다. 다형성을 활용한다면 가능 인터페이스를 구현한 새로운 클래스를 하나 만들어서 새로운 기능을 구현 LSP: 리스코프 치환 원칙(Liskov Substitution Principle) 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않..