Today I Learned_220719

2 분 소요

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 동작

  1. @ComponentScan은 Component가 붙은 모든 클래스를 뒤져 스프링 빈으로 등록한다.
    • 빈의 이름은 클래스명을 사용하며, 앞글자를 소문자로 사용한다.
    • @Component(“빈의 이름”) 과 같이 이름 직접 지정 가능
  2. @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 두번 : 전체 검색

카테고리:

업데이트: