반응형
Jake Seo
제이크서 위키 블로그
Jake Seo
전체 방문자
오늘
어제
  • 분류 전체보기 (715)
    • 일상, 일기 (0)
    • 백준 문제풀이 (1)
    • 릿코드 문제풀이 (2)
    • 알고리즘 이론 (10)
      • 기본 이론 (2)
      • 배열과 문자열 (8)
    • 데이터베이스 (15)
      • Planet Scale (1)
      • MSSQL (9)
      • 디비 기본 개념 (1)
      • SQLite 직접 만들어보기 (4)
    • 보안 (7)
    • 설계 (1)
    • 네트워크 (17)
      • HTTP (9)
      • OSI Layers (5)
    • 회고 (31)
      • 연간 회고 (2)
      • 주간 회고 (29)
    • 인프라 (52)
      • 도커 (12)
      • AWS (9)
      • 용어 (21)
      • 웹 성능 (1)
      • 대규모 서비스를 지탱하는 기술 (9)
    • 깃 (7)
    • 빌드 도구 (7)
      • 메이븐 (6)
      • 그레이들 (0)
    • Java (135)
      • 이펙티브 자바 (73)
      • 자바 API (4)
      • 자바 잡지식 (30)
      • 자바 디자인 패턴 (21)
      • 톰캣 (Tomcat) (7)
    • 프레임워크 (64)
      • next.js (14)
      • 스프링 프레임워크 (28)
      • 토비의 스프링 (6)
      • 스프링 부트 (3)
      • JPA (Java Persistence API) (5)
      • Nest.js (8)
    • 프론트엔드 (48)
      • 다크모드 (1)
      • 노드 패키지 관리 매니저 (3)
      • CSS (19)
      • Web API (11)
      • tailwind-css (1)
      • React (5)
      • React 새 공식문서 요약 (1)
      • HTML (Markup Language) (5)
    • 자바스크립트 (108)
      • 모던 자바스크립트 (31)
      • 개념 (31)
      • 정규표현식 (5)
      • 코드 스니펫 (1)
      • 라이브러리 (6)
      • 인터뷰 (24)
      • 웹개발자를 위한 자바스크립트의 모든 것 (6)
      • 팁 (2)
    • Typescript (49)
    • 리눅스와 유닉스 (10)
    • Computer Science (1)
      • Compiler (1)
    • IDE (3)
      • VSCODE (1)
      • IntelliJ (2)
    • 세미나 & 컨퍼런스 (1)
    • 용어 (개발용어) (16)
      • 함수형 프로그래밍 용어들 (1)
    • ORM (2)
      • Prisma (2)
    • NODEJS (2)
    • cypress (1)
    • 리액트 네이티브 (React Native) (31)
    • 러스트 (Rust) (15)
    • 코틀린 (Kotlin) (4)
      • 자바에서 코틀린으로 (4)
    • 정규표현식 (3)
    • 구글 애널리틱스 (GA) (1)
    • SEO (2)
    • UML (2)
    • 맛탐험 (2)
    • 리팩토링 (1)
    • 서평 (2)
    • 소프트웨어 공학 (18)
      • 테스팅 (16)
      • 개발 프로세스 (1)
    • 교육학 (1)
    • 삶의 지혜, 통찰 (1)
    • Chat GPT (2)
    • 쉘스크립트 (1)
    • 컴파일 (2)
    • Dart (12)
    • 코드팩토리의 플러터 프로그래밍 (4)
    • 플러터 (17)
    • 안드로이드 스튜디오 (1)
    • 윈도우즈 (1)
    • 잡다한 백엔드 지식 (1)
    • 디자인 패턴 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 서버리스 컴퓨팅
  • 토비의 스프링
  • 싱글톤 패턴
  • serverless computing
  • 참조 해제
  • item9
  • prerendering
  • bean Validation
  • rust
  • Java
  • 이펙티브 자바
  • MSSQL
  • 메이븐 골
  • 자료구조
  • 메이븐 라이프사이클
  • 알고리즘
  • NEXT JS
  • 빈 검증
  • 자바스크립트
  • 팩터리 메서드 패턴
  • 자바스크립트 인터뷰
  • Next.js
  • next js app
  • 플라이웨이트패턴
  • Javadoc 자바독 자바주석 주석 Comment
  • 디자인패턴
  • 프로그래머의 뇌
  • 추상 팩터리 패턴
  • 러스트
  • 자바 디자인패턴
  • 싱글톤
  • 싱글턴
  • 자바 검증
  • 슬로우 쿼리
  • 객체복사
  • item8
  • Pre-rendering
  • 스프링 검증
  • 작업기억공간
  • 이펙티브 자바 item9
  • 이펙티브자바
  • 느린 쿼리
  • pnpm
  • 자바스크립트 면접
  • 자바
  • 외래키 제약조건
  • 도커공식문서
  • item7
  • 메이븐 페이즈
  • try-with-resources

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Jake Seo

제이크서 위키 블로그

Java/자바 잡지식

스프링 @Configuration 애노테이션 정리

2022. 4. 23. 17:33

@Configuration 애노테이션

적용 범위

@Target(value=TYPE)
@Retention(value=RUNTIME)
@Documented
@Component
public @interface Configuration
  • 클래스에 해당하는 타입에 붙일 수 있다.

설명

  • 클래스에 적용되어 빈을 생성하는 클래스임을 표기한다.
  • 이 클래스는 한개 혹은 그 이상의 @Bean 메서드를 선언함을 표기한다.
  • 런타임 중에 Bean Definition 을 생성하고 해당 빈들에 대한 서비스 요청을 생성한다. 이는 보통 스프링 컨테이너에 의해 처리된다.
@Configuration
public class AppConfig {

    @Bean
    public MyBean myBean() {
        // instantiate, configure and return bean ...
    }
}
  • @Bean 애노테이션을 가진 myBean() 메서드에 의해 빈이 생성되어 스프링 컨테이너에 올라갈 것이다.

@Configuration 클래스, 부트스트래핑 하기

부트스트래핑이란 컴퓨터의 부팅과 비슷한 의미로, 외부의 작용 없이 스스로 시작되는 동작(과정)을 의미한다. (self-starting process) 위키백과 정의
@Configuration 클래스를 부트스트래핑한다는 것은 내부에 정의된 빈을 스프링 컨테이너로 올리는 것을 말한다.

AnnotaitonApplicationContext 를 통해

스프링에서 제공하는 타입인 ApplicationConfigApplicationContext 혹은 ApplicationConfigWebApplicationContext 를 통해 가능하다.

AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(AppConfig.class);
ctx.refresh();
MyBean myBean = ctx.getBean(MyBean.class);
// use myBean ...

AppConfig 는 이전에 정의한 @Configuration 이 붙은 클래스를 말한다.

Spring XML 을 통해

<beans>
   <context:annotation-config/>
   <bean class="com.acme.AppConfig"/>
</beans>

컴포넌트 스캐닝을 통해

@Configuration
public class AppConfig {
    private final SomeBean someBean;

    public AppConfig(SomeBean someBean) {
        this.someBean = someBean;
    }
    // @Bean definition using "SomeBean"
}
  • @Configuration 애노테이션에는 내부적으로 @Component 가 포함되어 컴포넌트 스캐닝의 후보가 된다.
  • 위의 코드는 단일 생성자가 있으며, final 로 선언된 빈 타입의 멤버가 있다.
    • 이 특성에 의해 autowiring 이 적용되어 SomeBean 타입이 스프링 컨테이너에 올라가 있다면, 자동으로 주입될 것이다.
@Configuration
@ComponentScan("com.acme.app.services")
public class AppConfig {
    // various @Bean definitions ...
}
  • 컴포넌트 스캔이 설정되어 있지 않다면, 자동 검출되지 않기 때문에 컴포넌트 스캐닝이 안된다면, 위처럼 컴포넌트 스캔을 설정해주어야 한다.
  • 스프링 부트에서는 자동으로 생성되는 @SpringBootApplication 애노테이션 내부에 @ComponentScan 애노테이션이 포함되어 있어서 따로 설정할 필요 없다.

@Configuraiton 클래스, 외부화된 값 이용하기

외부화된 값을 이용한다는 것은 application.properties 처럼 외부 프로퍼티 등에서 받는 값을 이용한다는 뜻이다.
이렇게 값을 외부로 공개해놓으면, 추가적인 작업이 필요할 때, 빌드 없이 간단히 내가 원하는 환경 값을 변경하거나 프로그램 실행 시 인수를 변경하는 등 유연한 애플리케이션을 구성할 수 있다.
이를테면, 3000 번 포트에서 돌아가는 서버 프로그램을 5000 번 포트에서 돌아가도록 빌드 없이 쉽게 수정할 수 있다.

Environment API 사용하기

@Configuration
public class AppConfig {

    @Autowired Environment env;

    @Bean
    public MyBean myBean() {
        MyBean myBean = new MyBean();
        myBean.setName(env.getProperty("bean.name"));
        return myBean;
    }
}
  • @Autowired 애노테이션을 사용하여, 스프링 Environment 를 주입시킬 수 있다.
    • 이를 이용해 Environment 를 통해 프로퍼티 값을 가져온다.

@PropertySource 애노테이션 사용하기

@Configuration
@PropertySource("classpath:/com/acme/app.properties")
public class AppConfig {

    @Inject Environment env;

    @Bean
    public MyBean myBean() {
        return new MyBean(env.getProperty("bean.name"));
    }
}
  • @PropertySource 를 통해서 프로퍼티의 위치를 특정하여 사용할 수도 있다.

@Value 애노테이션 사용하기

@Configuration
@PropertySource("classpath:/com/acme/app.properties")
public class AppConfig {

    @Value("${bean.name}") String beanName;

    @Bean
    public MyBean myBean() {
        return new MyBean(beanName);
    }
}
  • PropertySourcesPlaceholderConfigurer 와 함께 자주 쓰인다.
    • XML 에서는 <context:property-placeholder/> 처럼 표현된다.

@Configuration 클래스 구성(Composing)하기

@Configuration 클래스를 구성 (Composing) 한다는 것은 내 입맛대로 어떤 @Configuration 조합을 합치거나, 아니면 실행 환경 (로컬, 개발, 프로덕트) 에 따라서 원하는 @Configuration 정보만 가져오거나 하는 것을 말한다.

@Import 애노테이션 이용하기

@Configuration
public class DatabaseConfig {

    @Bean
    public DataSource dataSource() {
        // instantiate, configure and return DataSource
    }
}

@Configuration
@Import(DatabaseConfig.class)
public class AppConfig {

    private final DatabaseConfig dataConfig;

    public AppConfig(DatabaseConfig dataConfig) {
        this.dataConfig = dataConfig;
    }

    @Bean
    public MyBean myBean() {
        // reference the dataSource() bean method
        return new MyBean(dataConfig.dataSource());
    }
}
  • @Import 를 이용해 여러 개의 @Configuration 을 하나로 모을 수 있다.
  • XML 에서는 <import> 가 있다.

@Profile 애노테이션 이용하기

@Profile("development")
@Configuration
public class EmbeddedDatabaseConfig {

    @Bean
    public DataSource dataSource() {
        // instantiate, configure and return embedded DataSource
    }
}

@Profile("production")
@Configuration
public class ProductionDatabaseConfig {

    @Bean
    public DataSource dataSource() {
        // instantiate, configure and return production DataSource
    }
}
  • 실행 환경인 Profile 조건에 따라 다르게 설정할 수 있다.
    • 개발할 때는 개발 DB 를 불러오고 운영 서버에서는 운영 DB 를 불러오는 작업을 별다른 추가적인 소스코드 수정 없이 가능하다.

레퍼런스

스프링 공식문서 - Configuration

반응형
저작자표시 (새창열림)

'Java > 자바 잡지식' 카테고리의 다른 글

Lombok 을 사용할 때 주의해야 하는 점들 정리  (0) 2022.04.23
스프링 @Bean 애노테이션 정리  (0) 2022.04.23
자바 @Retention 애노테이션 정리  (0) 2022.04.23
자바 EE 란?  (0) 2022.04.20
클린 아키텍처 (by Robert C. Martin) 번역  (0) 2022.04.14
    'Java/자바 잡지식' 카테고리의 다른 글
    • Lombok 을 사용할 때 주의해야 하는 점들 정리
    • 스프링 @Bean 애노테이션 정리
    • 자바 @Retention 애노테이션 정리
    • 자바 EE 란?
    Jake Seo
    Jake Seo
    ✔ 잘 보셨다면 광고 한번 클릭해주시면 큰 힘이 됩니다. ✔ 댓글로 틀린 부분을 지적해주시면 기분 나빠하지 않고 수정합니다. ✔ 많은 퇴고를 거친 글이 좋은 글이 된다고 생각합니다. ✔ 간결하고 명료하게 사람들을 이해 시키는 것을 목표로 합니다.

    티스토리툴바