이 글의 코드와 정보들은 강의를 들으며 정리한 내용을 토대로 작성하였습니다.
이 글의 코드와 정보들은 강의를 들으며 정리한 내용을 토대로 작성하였습니다.
이 글의 코드와 정보들은 강의를 들으며 정리한 내용을 토대로 작성하였습니다.
지금까지 스프링 빈을 등록할 때는 자바 코드의 @Bean을 통해서 설정 정보에 직접 등록할 스프링 빈을 나열했다면, 이번에는 자동으로 스프링 빈을 등록하는 컴포넌트 스캔
에 대해서 알아보자.
코드로 컴포넌트 스캔과 의존관계 자동 주입을 알아보자.
기존
AppConfig.java
는 과거 코드와 테스트를 유지하기 위해 남겨두고 새로운AutoAppConfig.java
를 만들었다.
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 = Configuration.class)
)
public class AutoAppConfig {
}
컴포넌트 스캔을 사용하기 위해서는 @ComponentScan
을 설정 정보에 입력하면 된다.
여기서 excludeFilters
는 사용한 이유는 앞서 AppConfig.java
에서 만든 설정 정보들과 등록이 겹치기 때문이다.
따라서 겹치지 않기 위해 excludeFilters
사용하여 컴포넌트 스캔 대상에서 제외하는 방법으로 설정했다.
이제 각 클래스가 컴포넌트 스캔의 대상이 되도록 @Component
애노테이션을 붙여주면 된다.
MemoryMemberRepository @Component 추가
RateDiscountPolicy @Component 추가
@Component
public class MemberServiceImpl implements MemberService {
private final MemberRepository memberRepository;
@Autowired
public MemberServiceImpl(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}
@Autowired
는 의존관계를 자동으로 주입해준다.
그리고 @Autowired
를 사용하면 생성자에서 여러 의존관계도 한번에 주입받을 수 있다.
@Component
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy
discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
}
@ComponentScan(
basePackages = "hello.core",
}
backPackages
: 탐색할 패키지의 시작 위치를 지정한다.
해석하자면, “hello.core” 패키지를 포함해서 하위 패키지를 모두 탐색한다는 의미이다.
basePackages = {"hello.core", "hello.service"}
처럼 여러 시작 위치를 지정할 수도 있다.@ComponentScan(
basePackageClasses = AutoAppConfig.class,
}
basePackageClasses
: 지정한 클래스의 패키지를 탐색 시작 위치로 지정한다.
패키지의 시작 위치를 지정하지 않으면 @ComponentScan
이 붙은 설정 정보 클래스의 패키지가 시작 위치가 된다.
권장하는 방법은 패키지의 위치를 지정하지 않고, 설정 정보 클래스의 위치를 프로젝트 최상단에 두는 것이다. 스프링 부트도 이 방법을 기본으로 제공한다.
예를 들어 프로젝트가 다음과 같은 구조로 되어 있으면
com.hello
com.hello.service
com.hello.repository
com.hello
를 프로젝트 시작 루트로 하고, 여기에 AppConfig와 같은 메인 설정 정보를 두고, @ComponentScan 애노테이션을 붙이고, basePackages
지정은 생략한다.
그러면 com.hello
를 포함한 하위 패키지 모두 자동으로 컴포넌트 스캔의 대상이 된다.
컴포넌트 스캔은 Component
뿐만 아니라 다음과 같은 내용도 추가로 대상에 포함한다.
@Contoller
: 스프링 MVC 컨트롤러에서 사용
@Service
: 스프링 비즈니스 로직에서 사용
@Repository
: 스프링 데이터 접근 계층에서 사용
@Configuration
: 스프링 설정 정보에서 사용
메모리: 72.9 MB, 시간: 0.28 ms
코딩테스트 연습 > 2021 카카오 채용연계형 인턴십
class Solution {
public int solution(String s) {
String[] strArr = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
for(int i = 0; i < strArr.length; i++) {
s = s.replaceAll(strArr[i], Integer.toString(i));
}
return Integer.parseInt(s);
}
}
Integer.toString(i)
: 숫자를 문자로 변환하는 형 변환 방법이다.
String replaceAll(String regex, String replacement)
: replace() 함수와 같이 첫번째 인자값은 변환하고자 하는 대상이 되는 문자열이며, 두번째 인자 값은 변환할 문자 값입니다.
s.replaceAll(strArr[i], Integer.toString(i));
: strArr[i]을 Integer.toString(i)으로 변환한다는 의미이다.그리고 result가 숫자로 출력되어야하므로 Integer.parseInt()
를 쓴 것이다.
Integer.toString()
잊어버리지 말자.메모리: 75 MB, 시간: 0.03 ms
코딩테스트 연습 > 2018 KAKAO BLIND RECRUITMENT
class Solution {
public String[] solution(int n, int[] arr1, int[] arr2) {
String[] answer = new String[n];
for(int i = 0; i < n; i++) {
answer[i] = Integer.toBinaryString(arr1[i] | arr2[i]);
answer[i] = answer[i].replace('0', ' ');
answer[i] = answer[i].replace('1', '#');
while(answer[i].length() < n) {
answer[i] = ' ' + answer[i];
}
}
return answer;
}
}