Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

밤빵's 개발일지

[TIL]20240705 @Autowired 본문

개발Article

[TIL]20240705 @Autowired

최밤빵 2024. 7. 6. 02:58

"@Autowired : Spring FrameWork에서 종속성 주입 프로세스를 단순화 하는 어노테이션. 

불변성과 테스트 측면에서 생성자 주입 권장. "

 

이걸 본인이 이해하고 있어요? 라는 질문에 솔직히 아니요 라고 할 수 밖에 없어서 강의 듣다가 틈틈이

내가 이해할 수 있게 찾아 봤다. GPT고 구글이고 어려운말이 많아서 바보가 된 것 같다. 

 

종속성이란? 

→ Data Dependency. 프로그램의 구조가 데이터의 구조에 영향을 받는 것을 의미한다. 

데이터의 종속성 때문에 데이터의 구조가 변경되면 프로그램까지 같이 바뀌는 비용이 들어서 프로그램 개발과 

유지보수가 어려워진다. 

 

데이터의 구조가 프로그램의 저장방식을 결정 하고, 프로그램의 데이터 저장방식에 따라 데이터의 저장방식이 바뀌는 것...

이라는데 데이터의 구조가 뭔지 저장방식이 바뀐다는건 뭔지 설명하기가 힘들다는건 내가 이해 하지 못했다는 거라 

계속 찾아봤다. 

 

스프링 시작하고 계속 강의 날림으로 듣고있는것 같은데.... 

@SpringBootTest // 이걸 걸어야 Bean주입받아오는거 DI사용 가능
public class BeanTest {
    // @Autowired // 기본적으로 Bean의 타입을 기준으로 DI지원. 연결이 되지않으면 Bean의 이름으로 찾는다
    // Food pizza; // 같은타입의 콩이 하나 이상 있다
    // 첫 번째 방법, 등록이 된 Bean이름 명시
    // @Autowired
    // Food chicken;
    // 두 번쨰 방법, Primary추가. 같은 타입의 Bean이 여러개 있더라도 , 우선적으로 Primary가 적용되어있는 Bean객체를 주입
    @Autowired
    @Qualifier("pizza") // 세 번째 방법, Qualifier 로 지정해준다
            // 같은 타입의 콩이 여러개 있을 때는 범용적으로 사용 되는 콩 객체에는 primary를
            // 지역적으로 사용되는 콩 객체에는 Qualifier를 사용해주는게 좋다
            // Spring에서 우선순위를 결정할 때는 큰 범위가 우선순위가 낮다 . 좁은법위의 설정이 우선순위가 더 높다
            Food food;

    @Test
    @DisplayName("Primary 와 Qualifier 우선순위 확인")
        // Primary 와 Qualirier 이 동시에 걸려있는 경우, Qualifier의 우선순위가 더 높다
    void test1() {
//        pizza.eat();
//        chicken.eat();
        food.eat();
    }

}

 

숙련 주차 1강에서 Bean 수동 등록을 배우면서 아 나 이거 제대로 모르는구나를 너무 느껴서 강의 다 듣고 이해하기 위해 열심히 찾아봤다. 

 

예시코드를 보면,

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;


public void roll() {
    System.out.println("Wheels are rolling!");
    }
}

private Wheels wheels;

@Autowired
public ToyCar(Wheels wheels) {
    this.wheels = wheels;
}

public void drive() {
    wheels.roll();
    System.out.println("ToyCar is driving!");
    }
}

 

이 예제에서 ToyCar 를 운전하려면 바퀴가 필요한데,  @Autowired를 이용해서 Spring에 필요하다고 알려준다.

그러면 Spring은 자동으로 ToyCar에 Wheels를 제공한다. 

 

종속성 주입 작동 방식으로 설명을하면,

장난감자동차를 만드는 기계가 자동차를 만들려면 바퀴가 필요한데,

중앙 시스템에서 이걸 알고 기계에 자동차 바퀴를 전달해준다. 

 

코드를 보면.

클래스 (장난감 자동차를 만드는 기계)에는 다른 클래스(바퀴)가 필요하다.

바퀴 자체를 생성하는 클래스 대신 Spring(중앙 시스템)이 바퀴를 제공한다. 

 

중앙시스템은 Spring 자체이고, @Autowired는 Spring에 요구 사항을 알리는 방법이다. 

Spring 에게 이 클래스에 다른 클래스의 객체가 필요하다고 알리고 , 

Spring은 객체를 찾거나 생성해서 자동으로 전달한다.

 

종속성은 클래스에 필요한 것, 장난감 자동차의 바퀴인거고,

주입은 클래스가 스스로 필요한걸 얻는 대신 Spring이 종속성을 제공한다. 

@Autowired 는 클래스의 요구사항을 Spring에 알려줘서 Spring이 자동으로 필요한 개체를 전달할 수있다. 

중앙 전달시스템을 둬서 스스로 가져오지않고도 얻을 수 있도록 하는 것과 같다. 

이렇게 하면 코드가 더 깔끔하고 관리가 쉬워진다. 

 

🤓오늘의 회고 

시간이 지날수록 부캠사람들하고 친해지면서 많은 도움도 받게되고 공부방법에 대해서도 조언을 받고있다. 

사실 혼난다는 말이 더 맞는데, 너무 뒤늦게 조언을 알아듣기 시작해서 매일 바뀌려고 노력하는 중이다. 

깊게 파고드는것 보다는 이런거구나 하고 넘어가면 뒷 내용에서 이해하는게 더 많다는걸 느끼고도 가끔 예전 

방법처럼 무식하게 파고드는 걸 또 하고 있어서 공부하면서 긴장을 바짝 하는 중. 요샌 과제해본다고 거의 

잠을 안자고있는데 자려고 누우면 과제 걱정에 또 일어나서 코드를 보고있다..... 과제는 어려운데 제출해서 

피드백은 받고싶다. 아직은 질문에 대답도 잘 못해서 알아봐야하는 부분만, 알아본다 해도 이해못하는 부분들이

훨씬 많은 지금이지만, 그런방법이 확실히 학습에 도움이 된다는걸 체감 해버려서 그런 지적도 즐기고 있는 중!