while(1) work();
Spring Core 핥아먹기
핥다[할따]
물, 불, 빛, 시선 따위가 물체의 표면을 부드럽게 스치거나 비추거나 머무르다.


Spring 6 릴리즈를 기념해, Spring 공식 문서를 읽으며 정리한 시리즈입니다.
Spring Core와 Spring Context에 대해 살펴봅니다.
반응형

1. @Qualifier

@Qualifier 어노테이션을 통해 같은 타입의 빈이 여러개인 경우 주입받을 빈을 지정할 수 있다.

<code />
package com.sample.spring.repository; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Repository; @Repository @Qualifier("primaryRepository") public class SampleRepositoryImpl2 implements SampleRepository { public int getLastUserId() { return 200; } }
<code />
package com.sample.spring; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; import com.sample.spring.repository.SampleRepository; @Component public class Application { private final SampleRepository sampleRepository; public Application(@Qualifier("primaryRepository") SampleRepository sampleRepository) { this.sampleRepository = sampleRepository; } public void run() { System.out.println(sampleRepository.getLastUserId()); } }

동일한 Qualifier를 가진 빈을 찾아 등록해준다.

SampleRepositoryImpl1에 @Primary 어노테이션을 붙이더라도 @Qualifier 어노테이션 우선순위가 더 높기 때문에 @Primary 어노테이션은 무시된다.

<code />
package com.sample.spring.repository; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Repository; @Repository @Primary public class SampleRepositoryImpl1 implements SampleRepository { public int getLastUserId() { return 100; } }
<code />
결과 200

아래와 같이 클래스명을 camelCase로 나타낸 문자열은 자동으로 Qualifier로 등록되므로, @Qualifier(”sampleRepositoryImpl2”) 없이 사용 가능하다. 그러나 구체 클래스명에 강하게 의존하므로 좋은 방법은 아니다.

<code />
public Application(@Qualifier("sampleRepositoryImpl2") SampleRepository sampleRepository) { this.sampleRepository = sampleRepository; }

2. @PropertySource

설정 클래스에 @PropertySource 어노테이션을 지정하면 외부 설정 파일을 읽어올 수 있다.

<code />
@Configuration @ComponentScan @PropertySource("classpath:application.properties") public class Config { }
<code />
# src/main/resources/application.properties group.key = value
<code />
package com.sample.spring; import org.springframework.core.env.Environment; import org.springframework.stereotype.Component; import com.sample.spring.repository.SampleRepository; @Component public class Application { private final SampleRepository sampleRepository; private final Environment env; public Application(SampleRepository sampleRepository, Environment env) { this.sampleRepository = sampleRepository; this.env = env; } public void run() { System.out.println(env.getProperty("group.key")); //value System.out.println(sampleRepository.getLastUserId()); //200 } }

또는 SpEL과 @Value 어노테이션을 이용해 Environment 객체 주입 없이 값을 가져올 수도 있다.

<code />
package com.sample.spring; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import com.sample.spring.repository.SampleRepository; @Component public class Application { private final SampleRepository sampleRepository; @Value("${group.key}") //SpEL 이용해 application.properties의 값을 가져옴 private String test; public Application(SampleRepository sampleRepository) { this.sampleRepository = sampleRepository; } public void run() { System.out.println(test); System.out.println(sampleRepository.getLastUserId()); } }

3. @Profile

설정 클래스에 @Profile 어노테이션을 붙여 특정 프로파일에서만 설정 클래스가 유효하도록(특정 프로파일이 아니면 무시됨) 할 수 있다.

<code />
package com.sample.spring; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; @Configuration @ComponentScan @Profile("prod") public class ProdConfig { }

JVM 실행 시 -Dspring.profiles.active=”dev” 옵션을 통해 프로파일을 지정할 수 있다.

4. Laze load

@Component 어노테이션을 가진 클래스에 @Lazy 어노테이션을 추가하면 Lazy-initialized bean으로 지정할 수 있다.

스프링 컨테이너가 생성될 때 빈 객체가 생성되지 않고, 실제 빈 요청이 들어올 때 생성된다.

5. ApplicationContext의 다른 기능

ApplicationContext는 빈과 관련된 기능을 포함해 아래와 같은 기능들을 제공한다.

https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#context-introduction

  • BeanFactory 인터페이스를 통한 빈 생성/주입/관리
  • MessageSource 인터페이스를 통한 국제화
  • ResourceLoader 인터페이스를 통한 URL/파일 등의 리소스 접근
  • ApplicationListener 인터페이스를 통한 Bean 이벤트 발행
  • HierarchicalBeanFactory 인터페이스를 통한 계층적 context 지원

6. 코드

https://github.com/youhogeon/lickTheSpring/tree/ccc3faf4736b12c14a89f3ad1b22b3f89d561dbc

7. PS

여기까지가 Spring framework document - core의 1장 내용이다.

https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans

반응형

'핥아먹기 시리즈 > Spring Core 핥아먹기' 카테고리의 다른 글

13. Null Safety  (0) 2022.12.28
12. Resource 인터페이스  (0) 2022.12.28
10. Component Scan과 생성자 주입  (0) 2022.12.28
9. 의존관계 자동 주입 (@Autowired)  (0) 2022.12.28
8. 빈 생명 주기  (0) 2022.12.28
profile

while(1) work();

@유호건

❤️댓글은 언제나 힘이 됩니다❤️ 궁금한 점이나 잘못된 내용이 있다면 댓글로 남겨주세요.

검색 태그