목록Spring (293)
코드 그라데이션
컴포넌트 스캔과 의존관계 자동 주입 시작하기 지금까지 스프링 빈을 등록할 때는 자바 코드의 @Bean이나 XML의 등을 통해서 설정 정보에 직접 등록할 스프링 빈을 나열했다. 예제에서는 몇개가 안되었지만, 이렇게 등록해야 할 스프링 빈이 수십, 수백개가 되면 일일이 등록하기도 귀찮고, 설정 정보도 커지고, 누락하는 문제도 발생한다. 역시 개발자는 반복을 싫어한다. 그래서 스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔이라는 기능을 제공한다. 의존관계도 자동으로 주입하는 `@Autowired` 라는 기능도 제공한다. AutoAppConfig.java @Configuration @ComponentScan( excludeFilters = @Filter(type = FilterType...
@Configuration과 바이트코드 조작의 마법 스프링 컨테이너는 싱글톤 레지스트리다. 따라서 스프링 빈이 싱글톤이 되도록 보장해주어야 한다. 그런데 스프링이 자바 코드까지 어떻게 하기는 어렵다. 앞선 자바 코드를 보면 분명 3번 호출되어야 하는 것이 맞다. 그래서 스프링은 클래스의 바이트코드를 조작하는 라이브러리를 사용한다. 모든 비밀은 `@Configuration` 을 적용한 `AppConfig` 에 있다. 테스트 코드 추가 package inflearn.spring_core.singleton; import inflearn.spring_core.config.AppConfig; import inflearn.spring_core.member.MemberRepository; import inflearn..
@Configuration과 싱글톤 AppConfig 코드를 보면 @Configuration public class AppConfig { @Bean public MemberService memberService() { return new MemberServiceImpl(memberRepository()); } @Bean public OrderService orderService() { return new OrderServiceImpl( memberRepository(), discountPolicy()); } @Bean public MemberRepository memberRepository() { return new MemoryMemberRepository(); } @Bean public Discount..
싱글톤 방식의 주의점 상태를 유지할 경우 발생하는 문제점 예시* StatefulService public class StatefulService { private int price; //상태를 유지하는 필드 public void order(String name, int price) { System.out.println("name = " + name + " price = " + price); this.price = price; //여기가 문제! } public int getPrice() { return price; } } 상태를 유지할 경우 발생하는 문제점 예시** StatefulServiceTest 먼저 static클래스 만들어서 빈 등록 // 스태틱 클래스 만들어서 빈 등록 static class Te..
싱글톤 컨테이너 스프링 컨테이너는 싱글톤 패턴의 문제점을 해결하면서, 객체 인스턴스를 싱글톤(1개만 생성)으로 관리한다. 지금까지 여기서 다뤄왔던 스프링 빈이 바로 싱글톤으로 관리되는 빈이다. 싱글톤 컨테이너 스프링 컨테이너를 사용하는 테스트 코드 SingletonTest - 테스트 추가 package inflearn.spring_core.singleton; import inflearn.spring_core.config.AppConfig; import inflearn.spring_core.member.MemberService; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframew..
스프링 입문 핵심 원리 테스트 코드 공부하다가 두 개를 각각 써봤는데 다 통과해서, 한 번 찾아보았다. 1) isNotSameAs 이 메서드는 두 개의 객체가 물리적으로 동일한 객체가 아님을 확인한다. 즉, 두 객체가 메모리 상에서 서로 다른 인스턴스를 가리키는 경우에만 성공한다. 객체의 참조(메모리 주소)를 비교하므로, 두 객체가 다른 인스턴스라면 true를 반환하고, 동일한 인스턴스라면 false를 반환. == 연산자와 유사한 기능을 수행 2) isNotEqualTo 이 메서드는 두 객체가 논리적으로 다른 값을 나타내는지 확인합니다 *논리적 동등성 객체의 equals 메서드를 사용하여 두 객체 간의 동등성을 확인 두 객체가 내용적으로 다르면 true를 반환하고, 내용이 동일하면 false를 반환 따라..
싱글톤 패턴 SingletonService package inflearn.spring_core.singleton; public class SingletonService { //1. static 영역에 객체를 딱 1개만 생성해둔다. // 자기자신을 내부에 딱 하나 가지고 있는 상황인 것. (); 이거까지 한 번에 입력됨 */ @DisplayName("스프링 없는 순수한 DI 컨테이너") @Test void pureContainer() { AppConfig appConfig = new AppConfig(); //1. 조회: 호출할 때마다 객체를 생성 MemberService memberService1 = appConfig.memberService(); //2. 조회: 호출할 때마다 객체를 생성 MemberS..
웹 애플리케이션과 싱글톤 # 스프링은 태생이 기업용 온라인 서비스 기술을 지원하기 위해 탄생했다. # 대부분의 스프링 애플리케이션은 웹 애플리케이션이다. 물론 웹이 아닌 애플리케이션 개발도 얼마든지 개발할 수 있다. # 웹 애플리케이션은 보통 여러 고객이 동시에 요청을 한다. 스프링 없는 순수한 DI 컨테이너 테스트 SingletonTest (test 패키지) package inflearn.spring_core.singleton; import inflearn.spring_core.config.AppConfig; import inflearn.spring_core.member.MemberService; import org.junit.jupiter.api.DisplayName; import org.junit...