spring/스프링 핵심 원리 강의 내용 정리
-
에노테이션 직접 만들기spring/스프링 핵심 원리 강의 내용 정리 2023. 12. 11. 17:21
@Qualifier("mainDiscountPolicy") 이렇게 문자를 적으면 컴파일시 타입 체크가 안된다 다음과 같은 에노테이션을 만들어서 문제를 해결할 수 있다 코드로 확인해 보자 어노테이션을 만들고, 위에 세개를 복붙하여 붙혀 넣는다 (shift + shift 로 검색하여 이동) 그리고 아래와 같이 @Qualifier 에 이름을 붙혀준다 @MainDiscountPolicy를 사용할 때 위의 기능들이 다 동작 한다 이전글에서 @Qualifier 를 사용했을 때를 기억해 보자 이런식으로 이름을 매겼었다 만약 오타가 나거나 했다면 동작은 하지만, 실행시키면 오류가 난다 컴파일시 오류를 잡을 수 없다는 것은 꽤나 까다로운 문제가 될 수 있다는 것이다 이거를 우리가 만든 어노테이션으로 해결하자 이제 찾는 ..
-
@Autowired 필드 명, @Qualifier, @Primaryspring/스프링 핵심 원리 강의 내용 정리 2023. 12. 11. 16:22
코드로 확인해 보자 오류가 해결된 모습 필드 주입도 마찬가지로 파라미터 이름을 원하는 타입으로 입력하면 된다 물론 하나만 있다면 이렇게 할 필요가 없다 여러개가 매칭 됐을 때, @Autowired 가 내부적으로 실행하는 기능에 의해 이렇게 된다 @Autowired 매칭 정리 1. 타입 매칭 2. 타입 매칭의 결과가 2개 이상이 필드 명, 파라미터 명으로 빈 이름 매칭 @Quilifier 사용 - @Quilifier 는 추가 구분자를 붙혀주는 방법이다 주입시 추가적인 방법을 제공하는 것이지, 빈 이름을 변경하는 것은 아니다 코드로 확인해 보자 위 처럼 두 클래스에 @Qualifier 로 이름을 달아준 뒤, 파라미터 앞에서 이런식으로 사용해 주면 매칭이 된다 테스트까지 성공한 모습이다 @Qualifier 로..
-
조회 빈이 2개 이상 - 문제spring/스프링 핵심 원리 강의 내용 정리 2023. 12. 11. 15:34
@Autowired 는 타입으로 조회한다 타입으로 조회하기 때문에 다음 코드와 유사하게 동작한다 (실제로는 더 많은 기능을 제공한다) ac.getBean(DiscountPolicy.class) 스프링 빈 조회에서 학습했듯이, 타입으로 조회하면 선택된 빈이 2개 이상일 때 문제가 발생한다 DiscountPolicy 의 하위 타입인 FixDiscountPolicy , RateDiscountPolicy 둘다 스프링 빈으로 선언해보자 에러가 생기는 모습 메시지를 읽어보면 하나의 빈을 기대했는데, 빈이 두개가 매칭 됐다는 문구가 적혀있다 이때 하위 타입으로 지정할 수 도 있지만, 하위 타입으로 지정하는 것은 DIP를 위배하고 유연성이 떨어진다 그리고 이름만 다르고, 완전히 똑같은 타입의 스프링 빈이 2개 있을 때..
-
롬복과 최신 트렌드spring/스프링 핵심 원리 강의 내용 정리 2023. 12. 11. 15:19
사용 설정 build.gradle 설정 (프로젝트 생성시에 lombok을 등록했다면 자동으로 완성됨) 플러그인에서 아래의 아이콘 모양 설치 아래의 설정 화면에서 어노테이션 처리 활성화 Lombok 의 기능 어노테이션만 붙히면 게터, 세터를 자동으로 완성해 준다 @NoArgsConstructor 같은 생성자도 만들 수 있다 자세한 것은 Lombok을 나중에 따로 공부하도록 하자 @RequiredArgsConstructor 를 붙히면 빨간 줄이 생긴다 드래그 한 영역과 똑같은 역할을 하기 때문이다 final이 붙은것의 생성자를 자동으로 만들어 준다 ctrl + f12 를 누르면 해당 클래스의 메소드 목록을 확인할 수 있다는데... 난 또 안된다 아무튼 확인하면 코드에는 없지만 분명히 생성자 메서드가 존재하는..
-
생성자 주입을 선택해라spring/스프링 핵심 원리 강의 내용 정리 2023. 12. 11. 14:20
과거에는 수정자 주입과 필드 주입을 많이 사용했지만, 최근에는 스프링을 포함한 DI 프레임워크 대부분이 생성자 주입을 권장한다 그 이유는 다음과 같다 불변 - 대부분의 의존관계 주입은 한번 일어나면 애플리케이션 종료시점까지 의존관계를 변경할 일이 없다 오히려 대부분의 의존관계는 애플리케이션 종료 전까지 변하면 안된다 (불변해야 한다) - 수정자 주입을 사용하면, setXxx 메서드를 public으로 열어두어야 한다 - 누군가가 실수로 변경할 수도 있고, 변경하면 안되는 메서드를 열어두는 것은 좋은 설계 방법이 아니다 - 생성자 주입은 객체를 생성할 때 딱 1번만 호출되므로, 이후에 호출되는 일이 없다 따라서 불변하게 설계할 수 있다 누락 - 프레임워크 없이 순수한 자바 코드를 단위 테스트 하는 경우에 다..
-
옵션 처리spring/스프링 핵심 원리 강의 내용 정리 2023. 12. 11. 13:22
옵션 처리 - 주입할 스프링 빈이 없어도 동작해야 할 때가 있다 그런데 @Autowired 만 사용하면 required 옵션의 기본값이 true 로 되어 있어서 자동 주입 대상이 없으면 오류가 발생한다 자동 주입 대상을 옵션으로 처리하는 방법은 다음과 같다 - @Autowired(required=false) : 자동 주입할 대상이 없으면 수정자 메서드 자체가 호출 안됨 - org.springframework.lang.@Nullable : 자동 주입할 대상이 없으면 null이 입력된다 - Optional : 자동 주입할 대상이 없으면 Optional.empty 가 입력된다 테스트 해보자 Member는 스프링 빈에 등록하지 않은 아무 상관없는 객체이다 그러니 당연히 null 이 들어갈 것이고, 3개의 메서드..
-
다양한 의존관계 주입 방법spring/스프링 핵심 원리 강의 내용 정리 2023. 12. 10. 20:48
다양한 의존관계 주입 방법 의존관계 주입은 크게 4가지 방법이 있다 - 생성자 주입 - 수정자 주입(setter 주입) - 필드 주입 - 일반 메서드 주입 생성자 주입 - 이름 그대로 생성자를 통해서 의존관계를 주입 받는 방법이다 - 지금까지 우리가 진행했던 방법이 바로 생성자 주입이다 특징 - 생성자 호출시점에 딱 1번만 호출되는 것이 보장된다 - 불변, 필수 의존관계에 사용 생성자가 딱 1개만 있으면 @Autowired를 생략해도 자동 주입 된다 물론 스프링 빈에만 해당한다 테스트 해보자 생성자에 @Autowired 를 제거했다 테스트 결과 @Autowired 가 있을 때 처럼 알아서 생성자 주입이 되는 모습이다 수정자 주입 - setter라 불리는 필드의 값을 변경하는 수정자 메서드를 통해서 주입하..
-
중복 등록과 충돌spring/스프링 핵심 원리 강의 내용 정리 2023. 12. 9. 23:12
컴포넌트 스캔에서 같은 빈 이름을 등록하면 어떻게 될까? 다음 두가지 상황이 있다 1. 자동 빈 등록 vs 자동 빈 등록 2. 수동 빈 등록 vs 자동 빈 등록 자동 빈 등록 vs 자동 빈 등록 - 컴포넌트 스캔에 의해 자동의로 스프링 빈이 등록되는데, 그 이름이 같은 경우 스프링은 오류를 발생시킨다 - ConflictingBeanDefinitionException 예외 발생 실험해 보자 두 서비스 구현체에 service라는 동일한 이름을 주었다 에러가 나는 모습 아래는 오류 메시지의 일부다 Annotation-specified bean name 'service' for bean class 어노테이션인 '서비스'가 문제를 일으켰다고 한다 확인했으면 다시 원상 복구... 이와같이 자동 빈 등록 vs 자동 ..