Today I Learned_220719
Spring Framework
Singleton 방식의 주의점
Singleton 방식 : 여러 클라이언트가 하나의 같은 객체 인스턴스 공유 -> 객체 설계 시 stateless하게 설계해야 한다.
- 특정 클라이언트에 의존적인 필드가 있으면 안 된다.
- 특정 클라이언트가 값을 바꾸게 두면 안 된다.
- 가급적이면 읽기만 가능하고, 값을 수정하면 안 된다.
- 필드 대신 가급적이면 지역변수, 파라미터, ThreadLocal 등을 사용해야 한다.
- ThreadLocal : 스레드 단위로 로컬 변수를 사용할 수 있도록 하는 클래스 장애의 원인이 될 수 있으므로 주의해야 한다. (한 계정으로 로그인 했는데 다른 사용자의 계정 정보가 보이는 등..)
@Configuration
스프링은 컨테이너는 싱글톤 레지스트리 -> 스프링 빈이 싱글톤이 되도록 보장해 주어야 함.
하지만 순수 자바 코드에 대해서 어떻게 싱글톤을 보장하지? -> @Configuration annotation 사용
Spring의 설정파일이 되는 AppConfig(예시)에 @Configuration annotation을 붙여주면, AppConfig@CGLIB라는 AppConfig를 상속받는 클래스가 생성되어, 이 클래스가 싱글톤이 보장되도록 도와준다.
AppConfig에 @Configuration을 붙이지 않아도 스프링 빈으로 등록이 가능하나, 싱글톤 보장이 되지 않는다.
-> 스프링 설정 정보 클래스를 만들 때는 반드시 @Configuration을 사용하자.
Component Scan
등록/관리해야 하는 빈이 많으면 등록 및 관리에 어려움이 있을 수 있음 -> 스프링은 자동으로 스프링 빈을 등록하는 컴포넌트 스캔 기능 제공
컴포넌트 스캔은 스프링 빈에 해당하는 것을 다 긁어 와 스프링 빈으로 끌고 오는 것이다.
ClassPathBeanDefinitionScanner에 의해 컴포넌트 스캔이 이루어짐
excludeFilters : 컴포넌트 스캔 대상에서 제외하는 옵션
@ComponentScan : @Component annotation이 붙은 클래스를 스캔해서 스프링 빈으로 등록함 -> 빈으로 등록할 클래스에 @Component를 붙여 주자.
컴포넌트 스캔 시, AppConfig에서 의존관계를 설정해주는 것이 생략된다 -> @Autowired를 이용해 의존관계 주입을 해야 함. 대상 메소드 위에 @Autowired를 기재해 주자
Component Scan 동작
- @ComponentScan은 Component가 붙은 모든 클래스를 뒤져 스프링 빈으로 등록한다.
- 빈의 이름은 클래스명을 사용하며, 앞글자를 소문자로 사용한다.
- @Component(“빈의 이름”) 과 같이 이름 직접 지정 가능
- @Autowired
- 생성자에 @Autowired를 지정하면 스프링 컨테이너가 타입이 같은 빈을 자동으로 찾아서 주입한다.
Component Scan의 탐색 위치
기본값 : @ComponentScan이 붙은 클래스의 패키지 -> 일반적으로는 설정 정보 클래스에 @ComponentScan을 붙이고 프로젝트 최상단에 둔다.
Component Scan은 라이브러리까지 검색할 수 있으므로, 탐색 속도를 높이려면 범위를 지정해 줘야 한다.
basePackages : 탐색할 패키지의 시작위치를 지정. 이 패키지 기준 하위 패키지를 모두 탐색하며, 상위 패키지는 탐색하지 않는다. 여러 개의 시작위치 지정 가능.
basePackageClasses : 지정한 클래스의 패키지를 탐색 시작 위치로 지정
Component Scan 대상
- @Component
- @Controller : MVC 컨트롤러로 인식
- @Service : 특별한 처리는 하지 않음. 개발자가 비즈니스 계층이라고 인식하는 용도.
- @Repository : JPA, JDBC 등 데이터 접근 계층. 데이터 계층의 예외를 스프링의 예외로 감싸주므로써, DB를 바꾸면 에러 또한 바뀌는데 이를 한번 감싸주는 역할을 한다 (facade같다..?)
- @Configuration
annotation에는 상속관계가 없다. annotation이 특정 annotation을 들고 있는 것을 인식하는 것은 자바가 지원하는 기능이 아니라 스프링이 지원하는 기능이다.
useDefaultFilters : 기본으로 켜져 있는 옵션이며, 이 옵션을 끄면 기본 스캔 대상들이 제외된다.
IntelliJ
command + shift + T : 테스트로 이동, 테스트 생성
option + enter : static import 가능
command + B : 정의로 이동
shift 두번 : 전체 검색