@Condotional 어노테이션이란 ?

컴포넌트의 Bean 등록 여부에 조건을 달 수 있게 해주는 어노테이션

 

스프링은 IOC컨테이너에 객체를 Bean으로 등록하여 사용하는데,

@Component로 선언된 클래스는 모두 Bean으로 등록되는데 여기에 조건부를 달 수 있다

ex. A경우에 등록을 하되, B경우에는 등록하지 않도록 설정 가능

 

Spring에서 추가기능의 설정파일을 읽고 해당되는 POJO에서 bean을 IOC컨테이너에 등록한다

이때 설절파일을 조건부로 읽는다면 필요할 때만 IOC컨테이너에 Bean 등록 가능하다

@Condotional 사용해야하는데 Condition 인터페이스의 구현체를 만들어야 한다

 

ex.

@Conditional(TomcatWebServerConfig.TomcatCondition.class)
public class TomcatWebServerConfig {
    @Bean("tomcatWebServerFactory")
    public ServletWebServerFactory servletWebServerFactory(){
        return new TomcatServletWebServerFactory();
    }

    static class TomcatCondition implements Condition {
        @Override
        public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
            return true;
        }
    }
}
@MyAutoConfiguration
@Conditional(JettyWebServerConfig.JettyCondition.class)
public class JettyWebServerConfig {
    // 톰캣과 두 개 이름이 동일할 경우 충동한다고 스프링 컨테이너가 초기화할 때 에러 발생 할 수 있으므로
    // 이름 구분해주기
    @Bean("JettyWebServerFactory")
    public ServletWebServerFactory servletWebServerFactory(){
        return new JettyServletWebServerFactory();
    }

    static public class JettyCondition implements Condition {
        @Override
        public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
            return false;
        }
    }
}

@Condition은 엘리먼트를 꼭 하나 등록해줘야하는데

그 엘리먼트 타입은 무조건 condition이라는 인터페이스를 구현한 클래스여야한다.

 

@Condition(xxxCondition.class)는 xxxCondition의 matches 메소드의 return값을 받아 컴포넌트 스캔 여부 판단

Boolean으로 return 해주면 되는데 true면 bean으로 등록 false면 IOC컨테이너에 Bean으로 등록되지 않는다

 

예시를 보면 Tomcat은 true를 반납하고 Jetty는 false를 반납하고 있으므로 Tomcat 서버가 실행된다.

 

 

 

이 외.

@SpringBootApplication : Component Scan 기능을 가지고 있음

@ComponentScan : 하위 디렉토리에 위치한 @Component로 명시된 Bean으로 등록하는 기능

@Configration : 이것 또한 @Component. 하위디렉토리에 설정 클래스를 위치시킨다

 

 

 

 

 

 

 

 

 

 

의존성 확인하는 방법

 

1. Terminal에서 확인

 

Terminal에서 스프링부트 프로젝트가 있는 경로로 이동

아래 명령어를 입력하여 의존  확인

 

./gradlew dependencies

 

 

2. 인텔리제이 IDEA에서 확인

 

인텔리제이 맨 우쯕 코끼리모양 아이콘(Gradle) 클릭하면 확인이 가능합니다.

Terminal 보다는 IDEA가 보기 편해 IDEA로 확인하는걸 추천

1.META-INF에 Jetty 추가

이 구성들은 자동 구성 방식에 의해 AutoConfiguration의 imports 파일에 기술

 

2. 잘 올라갔는지 grale에서 확인

 

3. 톰캣과 마찬가지로 config 파일 생성

Tomcat Seblet Container 말고 Jetty Seblet Container 사용할 수 있도록 스타터 추가 후

Configuration 클래스를 만들어 Jetty 사용하는 웹서버 Factory bean이 만들어지도록 등록

 

이 구성들은 자동 구성 방식에 의해 AutoConfiguration의 imports 파일에 기술

 

톰캣과 두 개 이름이 동일할 경우 충동한다고 스프링 컨테이너가 초기화할 때 에러 발생 할 수 있으므로 이름 구분해주기

TomcatWebServerConfig 파일에서도 이름 지정

@Bean("tomcatWebServerFactory")

 

4. 설정만 해줬을때는 아래와 같은 오류 발생

2개 있다고 안됨

Unable to start ServletWebServerApplicationContext due to multiple ServletWebServerFactory beans : tomcatWebServerFactory,JettyWebServerFactory

 

 조건을 달아서 어떤 구성 정보를 활용할건지 알려줘야함

 

5.JettyWebServerConfig에 @Condition 추가

@Conditional(JettyWebServerConfig.JettyCondition.class)
static public class JettyCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        return false;    // true 반환하면 이 빈 구성 정보를 사용하겠다는 뜻, tomcat 말고 jetty 사용
    }
}

 

true 반환하면 이 빈 구성 정보를 사용하겠다는 뜻

jetty 사용하고 싶으면JettyWebServerConfig에서 반환값 true 설정해주고

나머지 TomcatWebServerConfig은 false 반환

 

Tomcat을 사용하고 싶으면 반대로 설정해주면 됨

 

 

6. 실행하고 console 확인

'SpringBoot > 프로젝트' 카테고리의 다른 글

자동 구성 정보 대체하기  (0) 2023.11.30
@Conditional 학습 테스트  (0) 2023.11.30
Test Code 작성  (0) 2023.11.27
DI를 이용한 Decorator  (2) 2023.11.27
섹션2. 스프링 부트 시작하기  (0) 2023.11.21

Test Code 란 ?

의도된 대로 정확히 작동하는지 검증하는 절차

 

  • 작성한 코드가 제대로된 기능을 수행하는지 검증
  • 빠른 시간에 테스트 가능

 

성공하는 경우 Test

@Test
void helloApi(){
    TestRestTemplate rest = new TestRestTemplate();

    ResponseEntity<String> res =
            rest.getForEntity("http://localhost:8080/hello?name={name}", String.class, "Spring");


    assertThat(res.getStatusCode()).isEqualTo(HttpStatus.OK);
    assertThat(res.getHeaders().getFirst(HttpHeaders.CONTENT_TYPE)).startsWith(MediaType.TEXT_PLAIN_VALUE);
    assertThat(res.getBody()).isEqualTo("*HelloSpring*");
}

 

TestRestTemplate rest = new TestRestTemplate();
  • RestTemplate : 오류나면 예외를 던짐
  • TestRestTemplate : 오류나도 해당 결과값을 보내줌

 응답 검증 3가지

assertThat(res.getStatusCode()).isEqualTo(HttpStatus.OK);

  1.statis code 200 ,enum값과 일치하는 지 학인 -> HttpStatus.OK
        static + import 단축키 alt + Enter

 

assertThat(res.getHeaders().getFirst(HttpHeaders.CONTENT_TYPE)).startsWith(MediaType.TEXT_PLAIN_VALUE);


  2. header(content-type) text/plain

 

assertThat(res.getBody()).isEqualTo("*HelloSpring*");


  3. body Hello Spring

 

 

실패하는 경우


//실패하는 테스트
@Test
void failHelloApi(){
    TestRestTemplate rest = new TestRestTemplate();

    ResponseEntity<String> res =
            rest.getForEntity("http://localhost:8080/hello?name=", String.class);

    assertThat(res.getStatusCode()).isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR);
}

 

'SpringBoot > 프로젝트' 카테고리의 다른 글

자동 구성 정보 대체하기  (0) 2023.11.30
@Conditional 학습 테스트  (0) 2023.11.30
[Spring Boot] jetty 서버 구성 추가하기  (0) 2023.11.29
DI를 이용한 Decorator  (2) 2023.11.27
섹션2. 스프링 부트 시작하기  (0) 2023.11.21

+ Recent posts