본문 바로가기

스프링

(17)
빈 스코프 빈 스코프란 컴포넌트 스캔 자동 등록 @Scope("prototype") @Component public class HelloBean {} 수동 등록 @Scope("prototype") @Bean PrototypeBean HelloBean() { return new HelloBean(); } 프로토타입 스코프 싱글톤 스코프의 빈을 조회하면 스프링 컨테이너는 항상 같은 인스턴스의 스프링 빈을 반환한다. 반면에 프로토타입 스코프를 스프링 컨테이너에 조회하면 스프링 컨테이너는 항상 새로운 인스턴스를 생성해서 반환한다. 1. 싱글톤 스코프의 빈을 스프링 컨테이너에 요청한다. 2. 스프링 컨테이너는 본인이 관리하는 스프링 빈을 반환한다. 3. 이후에 스프링 컨테이너에 같은 요청이 와도 같은 객체 인스턴스의 스프링..
타임리프 기본 기능 타임리프 사용 선언 텍스트 - text, utext 타임리프의 가장 기본 기능인 텍스트를 출력하는 기능 타임리프는 기본적으로 HTML 테그의 속성에 기능을 정의해서 동작한다. HTML의 콘텐츠(content)에 데이터를 출력할 때는 다음과 같이 th:text 를 사용하면 된다. HTML 테그의 속성이 아니라 HTML 콘텐츠 영역안에서 직접 데이터를 출력하고 싶으면 다음과 같이 [[...]] 를 사용하면 된다. 컨텐츠 안에서 직접 출력하기 = [[${data}]] 컨트롤러 @Controller @RequestMapping("/basic") public class BasicController { @GetMapping("text-unescaped") public String textUnescaped(Model..
빈 생명주기 콜백 스프링 빈이 생성되거나 죽기 직전에 스프링이 메서드를 호출할 수 있는 기능 생성되서 초기화 될 때 호출하고, 빈이 사라지기 직전에 안전하게 종료할 수 있는 메서드를 호출 빈 생명주기 콜백 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..