스프링/기본편 (9) 썸네일형 리스트형 빈 스코프 빈 스코프란 컴포넌트 스캔 자동 등록 @Scope("prototype") @Component public class HelloBean {} 수동 등록 @Scope("prototype") @Bean PrototypeBean HelloBean() { return new HelloBean(); } 프로토타입 스코프 싱글톤 스코프의 빈을 조회하면 스프링 컨테이너는 항상 같은 인스턴스의 스프링 빈을 반환한다. 반면에 프로토타입 스코프를 스프링 컨테이너에 조회하면 스프링 컨테이너는 항상 새로운 인스턴스를 생성해서 반환한다. 1. 싱글톤 스코프의 빈을 스프링 컨테이너에 요청한다. 2. 스프링 컨테이너는 본인이 관리하는 스프링 빈을 반환한다. 3. 이후에 스프링 컨테이너에 같은 요청이 와도 같은 객체 인스턴스의 스프링.. 빈 생명주기 콜백 스프링 빈이 생성되거나 죽기 직전에 스프링이 메서드를 호출할 수 있는 기능 생성되서 초기화 될 때 호출하고, 빈이 사라지기 직전에 안전하게 종료할 수 있는 메서드를 호출 빈 생명주기 콜백 public class NetworkClient { private String url; public NetworkClient(){ System.out.println("생성자 호출, url = "+url); connect(); call("초기화 연결 메세제"); } public void setUrl(String url){ this.url = url; } //서비스 시작시 호출 public void connect(){ System.out.println("connect: "+url); } public void call(Str.. 의존관계 자동 주입 다양한 의존관계 주입 방법 의존관계 주입은 크게 4가지 방법이 있다. 1. 생성자 주입 2. 수정자 주입(setter 주입) 3. 필드 주입 4. 일반 메서드 주입 생성자 주입 @Component public class OrderServiceImpl implements OrderService{ private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; @Autowired public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) { this.memberRepository = memberReposi.. 컴포넌트 스캔 컴포넌트 스캔과 의존관계 자동 주입 시작하기 AutoAppConfig.java @Configuration @ComponentScan( //Configuration 빼주는 이유는 AppConfig에 붙어있기 때문 - 예제를 실행하기 위해서 설정한 것 excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class) ) public class AutoAppConfig { } - 구현체들에 붙여주면 된다. @Component public class MemoryMemberRepository implements MemberRepository{ @Component public class RateDisco.. 싱글톤 컨테이너 웹 애플리케이션과 싱글톤 지금 고객에게서 요청이 올 때마다 같은 요청에 대해서도 하나하나 객체를 따로 만들어서 응답을 해주고 있다. 이점이 문제점이라고 볼 수 있음 그리고 이 방식이 이전까지 우리가 만들었던 DI 컨테이너 스프링이 없는 순수 DI 컨테이너 public class SingletonTest { @Test @DisplayName("스프링 없는 순수한 DI 컨테이너") void pureContainer(){ AppConfig appConfig = new AppConfig(); //1. 조회 : 호출할 때 마다 객체를 생성 MemberService memberService1 = appConfig.memberService(); //2. 조회 : 호출할 때 마다 객체를 생성 MemberService .. 스프링 컨테이너와 스프링 빈 스프링 컨테이너 생성 ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class); 스프링 컨테이너 생성 과정 키는 빈의 이름이 되고, 값은 빈의 객체가 됨 @Bean이 붙은걸 모두 호출하여 메서드 이름은 빈 이름으로, 리턴 값은 빈 객체로 등록 빈 이름은 보통 메서드 이름을 사용하지만 @Bean(name="memberService2") 이런 형식으로 직접 부여할 수도 있다. 빈의 이름은 항상 다른 이름을 부여해야 한다. 위처럼 객체를 생성한 다음에는 여기에 의존관계를 넣어줘야 한다. 동적인 객체 인스턴스 의존관계를 스프링이 다 연결을 해줌 설정 정보를 참조한다는 의미는 코드에서 설정한 파라미터.. 스프링 핵심 원리 이해2 - 객체 지향 원리 적용 새로운 할인 정책 개발 - 역할과 구현을 분리해서 만들었었음 - 객체지향 원칙 준수 했는가? RateDiscountPolicy 추가 - 정률할인 RateDiscountPolicy //정률할인 public class RateDiscountPolicy implements DiscountPolicy{ private int discountPercent = 10; @Override public int discount(Member member, int price) { if(member.getGrade()== Grade.Vip){ return price * discountPercent / 100; }else{ return 0; } } } 여기서 ctrl + shift + t 하면 자동으로 테스트 파일 만들어줌 Rat.. 스프링 핵심 원리 이해1 - 예제 만들기 프로젝트 생성 start.spring.io에 가서 스프링 부트 생성 인텔리제이 - open file - 만든 폴더 안에 있는 build.gradle 가져와서 open as project 비즈니스 요구사항과 설계 회원 도메인 설계 회원 도메인 협력 관계 - 클라, 서비스, 저장소는 역할 - 아직 저장소가 정해지지 않았기 때문에 메모리 저장소를 만들어서 사용 회원 클래스 다이어그램 회원 객체 다이어그램 - 회원 서비스의 구현체는 MemberServiceImpl 회원 도메인 개발 회원 엔티티 회원 등급 //회원 등급 public enum Grade { Basic, Vip } 회원 엔티티 //회원 엔티티 public class Member { private Long id; private String name; .. 이전 1 2 다음