성실한 사람이 되자

성실하게 글쓰자

This is spear

분류 전체보기 112

SPRING - 스프링 기본 원리 정리를 끝으로 생각 정리

기간 2021-12-12 ~ 2021-12-27 스프링 기본편을 다 듣고나서의 생각 인프런에 있는 김영한님의 스프링 핵심 원리 기본편을 공부하면서 이 강의는 나에게 무엇을 알려주고 싶은건가에 대해 항상 고민했습니다. 무엇을 배웠나? 스프링이 무엇인지, 왜 세상에 나왔는 지에 대해 알 수 있었습니다. 객체 지향 원리를 적용해 프로그래밍하는 방법을 배웠습니다. 스프링 컨테이너와 스프링 빈을 이용해 스프링 프레임워크를 활용하는 방법을 배웠습니다. 위 내용을 이용해 서비스를 활용해 프로젝트를 설계하고 있습니다. 어떤 고민이 남았는가? 강의를 듣고 정리를 하면서 꾸준하게 하기 위해서 나를 믿지 말고 시스템을 믿자는 생각을 많이 했습니다. 어떤 것이 부족했는가? 이 내용들을 활용할 시간이 부족했던 것 같습니다. 스..

JAVA_SPRING 2021.12.28

SPRING - 프록시

@Scope(value = “request”, proxyMode = ScopedProxyMode.TARGET_CLASS) 스프링이 조작해서 만든 빈이 등록이 되어있다. 즉 껍데기 구현체를 집어 넣고, 기능이 실제 호출하는 시점에서 진짜 객체를 찾아 넣는 작업을 한다. CGLIB라는 라이브러리로 내 클래스를 상속 받은 가짜 프록시 객체를 만들어서 주입한다. @Scope 애너테이션의 proxyMode = ScopedProxyMode.TARGET_CLASS 명령어를 설정하면 스프링 컨테이너는 CGLIB 라는 바이트코드를 조작하는 라이브러리를 사용해 MyLogger를 상속받은 가짜 프록시 객체를 생성한다. 결과를 확인하면 우리가 등록한 순수한 MyLogger 클래스가 등록되는 것이 아닌 스프링이 바이트 코드를 ..

JAVA_SPRING 2021.12.28

SPRING - 웹 스코프

웹 스코프 웹 환경에만 동작한다. 프로토타입과 다르게 스프링이 해당 스코프의 종료시점까지 관리한다. 따라서 종료 메서드가 호출된다. 웹 스코프 종류 request HTTP 요청 하나가 들어오고 나갈 때 까지 유지되는 스코프, 각각의 HTTP 요청마다 별도의 빈 인스턴스가 생성되고 관리된다. session HTTP Session과 동일한 생명주기를 가지는 스코프 application 서블릿 컨텍스트(ServletContext)와 동일한 생명주기를 가지는 스코프 websocket 웹 소켓과 동일한 생명주기를 가지는 스코프 request 요청 -> 특정 클라이언트 전용 빈 생성 (request scope) -> http request 가 같으면 전용 빈 (전용 request scope) 에서 활동 즉, Htt..

JAVA_SPRING 2021.12.28

SPRING - 빈 스코프

지금까지 우리는 스프링 빈이 스프링 컨테이너의 시작과 함께 생성되어 스프링 컨테이너가 종료될 때 까지 유지된다. 이것은 스프링 빈이 기본적으로 싱글톤 스코프로 생성되기 때문이다. 스프링은 다음과 같은 스코프를 지원한다. 싱글톤 기본 스코프 스코프 스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는 매우 짧은 범위의 스코프이다. 웹 관련 스코프 request : 웹 요청이 들어오고 나갈때 까지 유지되는 스코프이다. session : 웹 세션이 종료될 떄 까지 유지되는 스코프이다. application : 웹 서블릿 컨텍스와 같은 범위로 유지되는 스코프다. 빈 스코프 지정 컴포넌트 스캔 자동 등록 : @Component 애너테이션을 붙인 구현체 위에 @Scope(“Sco..

JAVA_SPRING 2021.12.28

SPRING - 빈 생명 주기

빈 생명 주기와 콜백 애플리케이션이 시작할 때, 데이터베이스 서버를 많으면 100개 적으면 10개를 미리 잡아 미리 연결해 둬야 안정적으로 돌아간다.위와 같이 데이터베이스 커넥션 풀이나 네트워크 소켓처럼 애플리케이션 시작 시점에 미리 연결하고, 애플리케이션이 종료될 때 안전하게 종료를 해줘야 한다. 즉, 객체의 초기화와 종료 작업이 필요하다. 이러한 정상적으로 종료 처리를 해주는 기능을 스프링이 제공을 한다. 스프링 빈은 객체 생성 후 의존관계 주입의 라이프 사이클을 가진다.(생성자 주입 예외) 스프링 빈은 객체를 생성하고, 의존관계 주입이 다 끝난 다음에 필요한 데이터를 사용할 수 있는 준비가 완료된다. 따라서 초기화 작업은 의존관계 주입이 모두 완료되고 난 다음에 호출해야 한다. 그러면 개발자 시점에..

JAVA_SPRING 2021.12.28

SPRING - 조회한 빈을 모두 사용해야 할 때 (List, Map 이용)

할인 서비스를 제공하는데 클라이언트가 할인의 종류(rate, fix)를 선택할 수 있다고 가정할 때, 스프링을 사용하면 소위 말하는 전략 패턴을 이용해 매우 간단하게 구현할 수 있다. 로직 분석 DiscountService는 Map으로 모든 DiscountPolicy 타입의 구현체를 주입받는다. 이때, fixDiscountPolicy, rateDiscountPolicy 구현체가 주입된다. dicount() 메서드는 dicountCode로 fixDiscountPolicy 구현체가 넘어오면 map에서 fixDiscountPolicy 스프링 빈을 찾아 실행한다. 물론, rateDiscountPolicy 구현체가 넘어오면 rateDiscountPolicy 구현체가 실행된다. 주입 분석 Map map 키에 스프링..

JAVA_SPRING 2021.12.28

SPRING - 애너테이션 직접 만들기

다양한 상황에 놓인 환경에서 아래와 같이 애너테이션을 직접 생성해서 관리하면 코드가 간결해지고 명확해진다. 애너테이션 재정의 @Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented @Qualifier("mainDiscountPolicy") public @interface MainDiscountPolicy {} @Qualifier 애너테이션을 대체해서 사용 @Component @MainDiscountPolicy public class RateDis..

JAVA_SPRING 2021.12.28

SPRING - @Autowired 애너테이션을 이용할 때, 같은 타입 빈이 두 개 이상 조회되면 생기는 문제

@Autowired 애너테이션은 타입으로 조회한다. 그렇기에 getBean(Class class)와 같이 메서드 이름이 제공되지 않은 getBean() 메서드와 유사하게 동작한다. (실제로는 @Autowired 애너테이션이 더 많은 기능을 제공한다.) 스프링 빈 조회하면서 알 수 있듯이 타입으로 조회할 때, 같은 타입이 두개 이상이면 문제가 발생한다.(NoUniqueBeanDefinitionExceptio 예외가 나온다.) 반대로 말하면 스프링은 NoUniqueBeanDefinitionException 빈은 throw해 자동 연결에 둘 이상의 빈을 사용할 수 있음을 나타낸다. 스프링 프레임워크는 어떤 빈을 주입해야 하는지 모르게 때문에 NoUniqueBeanDefinitionException 예외를 던진..

JAVA_SPRING 2021.12.28

SPRING - Option

주입할 스프링 빈이 없어도 동작해야 할 때가 있다. 그런데, @Autowired 애너테이션만 사용하면 ‘required’ 옵션의 기본값이 true로 되어 있어서 자동 주입 대상이 없으면 오류가 발생한다. 자동 주입 대상을 옵션으로 처리하는 방법 ‘@Autowired(required=false)’ 자동 주입할 대상이 없으면 수정자 메서드 자체가 호출이 되지 않지만, ‘required’ 옵션의 기본값이 false로 설정해 자동 주입 대상이 없어도 실행할 수 있도록 설정한다. 그럼 주입 대상이 없으면 오는 값은 아래 와 같다. org.springframework.lang.@Nullable 자동 주입할 대상이 없으면 null이 입력된다. Optional 자동 주입할 대상이 없으면 Optional.empty가 입..

JAVA_SPRING 2021.12.28

SPRING - Filter (FilterType)

필터에는 두가지의 타입이 존재한다. 하나는 포함시키는 명령어(includeFilters)이고, 나머지 하나는 제외시키는 명령어(excludeFilters)다. 이 명령어를 사용하면 스프링이 시작할 때, ComponentScan 애너테이션에 있는 Filter 정보를 들려서 사용자가 지정한 타입을 빈으로 추가하거나 배제할 수 있다. includeFilters excludeFilters FilterType ANNOTATION 기본값, 애너태이션을 인식해 동작한다. ASSIGNABLE_TYPE 지정한 타입과 자식 타입을 인식해서 동작한다. ASPECTJ AspectJ 패턴을 사용한다. REGEX 정규 표현식이다. CUSTOM ‘TypeFilter’ 이라는 인터페이스를 구현해 처리한다. MyIncludeCompo..

JAVA_SPRING 2021.12.28