본문 바로가기
백엔드/스프링 부트세부 공부

BOOT의 기능

by 임지혁코딩 2023. 12. 30.

1. BOOT PROPERTIES 

-> 대부분의 기능을 제어할 수 있다. 

혹시 진행하다가보니, 계속 자바의 PROPERTIES를 사용한다? 재 확인이 필요하다 .

 

application properties의

debug = True : debug log를 추가한다 .

빈임을 등록해줄때는 @Configuration이 필요하다. dlfmf 

@Component로 알아서 찾게끔 해주면, 기본적으로 controller,service,repository등을 모두 찾아줄 수 있다.

cache등도 지원한다. 

data 관련에서는 enable등을 사용 가능하다.

상황에 따라 검색하고, properties를 검색하여 사용하자 .

 

#component or service, controller등의 어노테이션을 쓴다.

dto나 entity는 component로 설정하지 않는것이 일반적이다(component수를 최소화하고)

각 component에서 사용하게만 활용하자 .

 

2.@SpringBootApplication

 

 

상세부, component를 scan하는 기능이 있음을 볼수있다.

@EnableAutoConfiguration 으로 정의한 라이브러리 등록이 가능하다 .

세팅 1) exclude=WebMbcAutoConfiguration.class 를 springbootapplication에 추가하면, 

webMvc를 제외할 수 있다. 

 

#webMvc?

mvc는 모델,뷰,컨트롤러의 형태로 나누어 각 코드를 개발하는 디자인 패턴을 의미한다 .

spring webmvc는 handler를 mapiing하고, controlle가 요청을 처리하고, 뷰가 응답을 생성하는 등의 역할을 한다.

즉, HTTP request를 처리하는 기능또한 담당한다. 

잘 안끄는 type이긴 하다 .

 

세팅 2) scanBasePackage = "com.~~~경로") -> 어디서부터 scan을 진행하겠다. 

부록) spring application을 인스턴스화 하여, 여러가지 기능을 추가할 수 있다. 

Tomcatserver를 내부에서도 실행시킨다. 

 

부록 2 : 프로젝트 기본 구조 생성법:

initalizer를 해줌에도 불구하고, mainapplication은 그 세팅대로 root패키지에 놓는 것을 권장한다. 

 

3.@Component Vs @Configuration

 

굉장히 헷갈리는 경우가 존재한다. 

Component -> custom bean이다 라는 것을 표현하는 것. (내가 짯다)

사용 흐름 : componentscan으로 coponent를 다찾는다. 그러면서 의존성 주입하고, 컨테이너에 등록해 주는 방식이다. 

java에서는 @component,@bean모두 생성 가능하다 .

 

COnfig 파일? 

 

1.@Component이후, @Override 로 사용한다(config파일 없이)

 

2. configuration package + class 생성. @Configuration 이후, 그 안에 bean으로 기타 기능 추가.

(해당 기능은 직접 사용한다 ex) bubblesort() . 이때 bean으로 설정하고 사용한다.) 

 

3.@component 이후, bean으로 기능 추가 . 이것도 가능하다 .lightbean(가벼운 빈이다)

왜 둘다 가능하지? 

spring bean들은 porxy bean(나중에 사용 가능하게) .

light bean은 호출할때마다 instance로 나와서, 조금더 빠르고 가볍다. 

proxy bean의 기능을 사용할수 없다 (AOP기능을 사용할 수 없다.)

->안 좋은 경우이다. 확실하게 proxy를 사용하지 않을때가능하다

이러다 갑자기 오류 터질수도 있다. component이후 bean은 목적이 다르다는것 명심

 

@COmponent는 class레벨, 내가 등 록할때 사용 , 자동으로 빈 등록

@bean , 빈에서도 등록. 다만 method에 붙인다. 

-> 직접 new를 생성해서 인스턴스를 만들어야 한다.  + 구현과 instance화 코드의 위치가 다르다. 

외부 라이브러리를 가져올때 이를 사용한다. 

 

질문 : 어차피 service layer, controller ,뭐 다 component로 자동 어노테이션되는데

Config파일 안에 bean을 따로 자동 생성하는 경우가 있을까?

 

바로 이런 경우. 외부 라이브러리를 사용하는데 만약 해당 라이브러리를 conponent를 사용하지 않는다면?

내가 직접 configuration을 활용하여 bean으로 주입해준다. 

<특히, import 되지 않은것을 쓸때 유용하다>

 

controller,service,repository 모두 다 component가 내부에 있다. 

 

그러면 configuration은 뭘까?

 : "이 class는, 빈 설정을 가지고 있다" .  -> 특별한 따로 사용하는 bean을 모아주는 <무소속애들 모아주는 박스>

-> 그러면 즉 스프링의 설정 또한 가능하다 .

 

Configuration은, 따로 사용할 method들을 bean 설정해서 이를 모아주는 0component의 일종이다.

즉, 기타 등등의 COmponent이다.(설정 또한 가능하다)

 

4. properties 설정을 유려하게 하는 방법

 

java코드 바깥에서 설정해두고 활용하는것을 외부 설정이라 한다. 

같은 설정을 다른곳에서 주입할수도 있다 (위에서 configguration에서 할수도있고 기타 등등)

 

1.default property 2.configuration에서 설정 3. applicationproperties 순으로 설정이 세팅된다.

 

관리할때는, 중복을 application properties에, 나머지들을 분리해서 관리할 수 있다. 

Properties의 위치가 굉장히 많기 떄문에 문제가 발생할 수 있다. 

이후 내용을 얻어내는것 중 유명한 방법이

@Value 방법이다. 

 

1.@Value

spel을 사용해서 property 명을 받아온다. -> 문자열 방식으로 받기 때문에 문제가 될 수있다.

fianl을 사용할 수 없다 -> 인스턴스 주입 이후 생성된 후에 주입된다.

 

실제 사용 : 

 

application properties에 myheight= 179를 넣으면, 이렇게  읽어옴을 기대할수 있다.

허나 , 실제 값은 0이 나와버린다. 왜냐하면 필드주입이고, 인스턴스 생성후에 대입되기 때문이다!

그러므로, @POSTCONSTRUCT를 MYHEIGHT에 붙여줘, 주입순서를 앞으로 땡겨준다. 

 

2. Environment

 

의존성 주입시, @Autowired보다는 @ REQUIREDARGSCONSTRUCTOR를 주로 활용하자.

 

3, Configuration properties ,annotation 

 

1. annotation은, bean으로 특정 method를 bean설정하는것 

2.properties는, 앞선 my height처럼 값을 불러오는것

 

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

    @Bean
    public MyBean myBean() {
        return new MyBean();
    }

    // 다른 빈 설정 등...
}

my.property=value-from-properties-file

이렇게 값은 따로 분리할 수 있다. 

 

원래는, 둘이 같이 정의되어야한다. 즉 값을 properties에서 사용하려면, 이는 configuration파일에 저장되어 사용되어야 한다.

@Configuration
public class MyConfiguration {

    @Value("${my.property}")
    private String myProperty;

    @Bean
    public MyBean myBean() {
        // myProperty를 사용하여 MyBean을 생성 또는 설정
        return new MyBean(myProperty);
    }

}
 

그 예시, properties의 값을 가져오는것과, 다른 외부 method를 사용하는 것 모두 configuration에 묶여서 사용되어야 한다. 

(기본적으로는) 

 

 

--갑자기 든 질문 --

CONFIGUREATION에서 , 값을 가져왔다 (MYHEIGHT)

이를 SERIVCE LAYER에서 사용하고 싶다면? 

 

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "my")
public class MyProperties {
    private String property1;
    private int property2;

    // getter, setter 생략


-> CONFGURATION파일 대신, PROPERTIE를 설정해주는 것. GETTER SETTER가 필수적이다.

 

 

@Service
public class MyService {

    private final MyProperties myProperties;

    @Autowired
    public MyService(MyProperties myProperties) {
        this.myProperties = myProperties;
    }

    public void someMethod() {
        // myProperties 사용
        String property1 = myProperties.getProperty1();
        int property2 = myProperties.getProperty2();

        // 다른 로직...
    }
}

-> SERVICE영역에서 , 해당 CLASS를 받아서 사용한다. 

(AUTOWIRED는 대체 될 수 있따 . ) 

 

my.property1=value1 my.property2=42 를 APPLICATION,PROPERTIES에

 

1. @ConfigurationProperties(PREFIX="MY)/ GETTER,SETTER를 통해 

CONFIGURATION이 아니고 따로 값을 가져오는걸 분리한다.

2.SERVICE LAYER에서 해당 CLASS를 의존성 주입받는다

3. APPLICATIONPLAYER에서 , MY.VALUENAME 으로 VALUE명을 변경시킨다.