728x90

spring 13

김영한 (스프링 핵심원리 9) 프로토타입 스코프 - 싱글톤 빈과 함께 사용시 문제점

빈 스코프란? 스프링 빈은 기본적으로 singleton scope로 생성 되기 때문이다. scope는 번역 그대로 빈이 존재할 수 있는 범위를 뜻한다. 싱글톤 = 기본 스코프, 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프이다. 프로토타입 = 스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지않는 매우 짧은 범위의 스코프이다. request = 웹요청이 들어오고 나갈때까지 유지되는 스코프 이다. session = 웹 세션이 생성되고 종료될 때 까지 유지되는 스코프이다. application = 웹의 서블릿 컨텍스 와 같은 범위로 유지되는 스코프이다. 프로토타입 스코프 싱글톤 스코프의 빈을 조회하면 스프링 컨테이너는 항상 같은 인스턴스의 스프링 빈을 반..

WEB/Spring 2021.02.15

김영한 (스프링 핵심원리 8) 빈 생명주기 콜백 시작

빈 생명 주기 콜백 시작 데이터베이스 커넥션 풀이나 , 네트워크 소켓처럼 애플리케이션 시작 시점에 필요한 연결을 미리 해두고, 애플리케이션 종료 시점에 연결을 모두 종료하는 작업을 진행하려면 객체의 초기화와 종료 작업이 필요하다. package hello.core; 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.ou..

WEB/Spring 2021.02.14

김영한 (스프링 핵심 원리 7) 의존관계 자동 주입

다양한 의존관계 주입 방법 스프링 빈을 등록을 하는 단계와 의존관계를 주입하는 단계가 따로 되어있다. 생성자 주입 생성자 호출시점에 딱 1번만 호출되는것이 보장된다. 불변,필수 의존관계에 사용한다. 좋은 코딩 습관은 항상 제약이 있는 것이 좋다. private final 은 값이 무조건 있어야 된다는 뜻이다. 언어적으로 잡은것이다. 안주면 컴파일 에러를 동반한다. 수정자 주입(setter 주입) 관례로 field 값을 조정할때 set을 많이 사용한다. 선택, 변경 가능성이 있는 의존관계에 사용 필드주입 코드가 간결해서 많은 개발자들을 유혹하지만 외부에서 변경이 불가능해서 테스트하기 힘들다는 치명적인 단점 DI 프레임워크가 없으면 아무것도 못함 사용하지말자 @Configuration 같은 곳에서만 특별한 ..

WEB/Spring 2021.02.14

김영한 (스프링 핵심원리 6) 컴포넌트 스캔

컴포넌트 스캔과 의존관계 자동 주입 시작하기 스프링은 설정 정보가 없어도 자동으로 스프링 빈으로 등록하는 컴포넌트 스캔이라는 기능을 제공한다. package hello.core; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.FilterType; @Configuration @ComponentScan( excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configur..

WEB/Spring 2021.02.13

김영한 (스프링 핵심원리 5) 싱글톤 컨테이너

웹 애플리케이션과 싱글톤 현제의 Appconfig.class 의 형식이다. 클라이언트가 서비스를 요구할때마다 새로운 객체를 return 해주는 방식이다. package hello.core.singleton; import hello.core.AppConfig; import hello.core.member.MemberService; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; public class SingletonTest { @Test @DisplayName("스프링 없는 순수한 DI 컨테이너") void pureContainer() { App..

WEB/Spring 2021.02.12

김영한 (스프링 핵심원리 4) 스프링 컨테이너와 스프링 빈

ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class); ApplicationContext는 인터페이스 이고 스프링 컨테이너이다. AnnotationConfigApplcationContext 는 구현체이다. @Bean(name="meberService") 이런식으로 이름을 부여할 수 있지만 절대로 중복이 되면 안된다. 현재까지는 스프링 컨테이너를 생성하고, 설정(구성) 정보를 참고해서 스프링 빈도 등록하고, 의존관계도 설정했다. 이제 Bean 들이 잘 등록이 되었는지 확인을 해보자. package hello.core.beanfind; import hello.core.AppConfig; im..

WEB/Spring 2021.02.12

김영한 (스프링 핵심원리 3) 스프링의 핵심원리이해2 - 객체 지향원리 적용

이미 역할과 구현을 분리해서 설계되었기 때문에 쉽게 정률 discounting을 구현 해주고 적용 시킬 수 있다. package hello.core.discount; import hello.core.member.Grade; import hello.core.member.Member; public class RateDiscountPolicy implements DiscountPolicy { private int discountPrecent = 10; @Override public int discount(Member member, int price) { if (member.getGrade() == Grade.VIP) { return price * discountPrecent / 100; } else { ret..

WEB/Spring 2021.02.10

김영한 (스프링 핵심원리 2) 스프링의 핵심원리이해 1 - 예제 만들기

비즈니스 요구사항과 설계 회원 회원을 가입하고 조회 할 수 있다. 회원은 일반과 VIP 두 가지 등급이 있다. 회원 데이터는 자체 DB를 구축할 수 있고, 외부 시스템과 연동할 수 있다. 주문과 할인정책 회원은 상품을 주문할 수 있다. 회원 등급에 따라 할인 정책을 적용할 수 있다. 할인 정책은 모든 VIP는 1000원을 할인해주는 고정 금액 할인을 적용해달라. 할인 정책은 변경 가능성이 높다. 회사의 기본 할인 정책을 아지 정하지 못헀고, 오픈 직전까지 고민을 미루고 싶다. 최악의 경우 할인을 적용하지 않ㅇ르 수 도 있다. 회원 도메인 설계 package hello.core.member; public class Member { private Long id; private String name; priv..

WEB/Spring 2021.02.09

김영한 (스프링 핵심원리 1) 객체지향설계와 스프링

G스프링 부트 Tomcat 같은 웹 서버를 내장해서 별도의 웹서버를 설치하지 않아도됨. 손쉬운 빌드 구성을 위한 starter 종속성 제공 , 외부 라이브러리 자동구성 == 메이저 라이브러리들은 스프링이 compatiable 한지 다 테스트하고 알맞은 version 을 가지고 온다. 매트릭, 모니터링을 기본적으로 어느정도 제공을 해준다. 내부적으로는 스프링 프레임워크를 다루는 것이다. 다형성 Polymorphism 변경과 수정이 용이하다 == 인터페이스가 있어서 실 구현체가 달라도 된다. 클라이언트는 대상의 역할만 알면 된다. 클라이언트는 구현 대상의 내부 구조를 몰라도 된다. 클라이언트는 구현 대상의 내부 구조가 번경되어도 영향을 받지 않는다. 클라이언트는 구현 대상 자체를 변경해도 영향을 받지 않는다..

WEB/Spring 2021.02.08

김영한 (스프링 부트 5)

AOP 중간 중간에 중요한 비지니스 로직이아닌 일반적인 것들을 끼워 넣을 때 유용하다. package hello.hellospring.aop; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.springframework.stereotype.Component; @Aspect //@Component public class TimeTraceAop { @Around("execution(* hello.hellospring..*(..)) && !target(hello.hellospring.SpringConfig)..

WEB/Spring 2021.02.08
728x90