코딩과 결혼합니다

230703 - Bean 수동 등록 본문

2세/Spring

230703 - Bean 수동 등록

코딩러버 2023. 7. 3. 23:52
728x90

📍 Bean 수동 등록

@Configuration
public class PasswordConfig {
    @Bean
    public PasswordEncoder passwordEncoder (){ 
        return new BCryptPasswordEncoder(); //비밀번호를 암호화 해주는 Hash함수
    }
}

PasswordConfig 라는 Class에 인터페이스 PasswordEncoder 타입의 passwordEncoder(){ }메서드가 있다.

이 메서드는 Bean 으로 등록하고자 하는 인터페이스 PasswordEncoder 를 상속 받는 것들 중 하나인 BCryptPasswordEncoder() 객체를 생성하여 반환(reurn) 해준다.

그러면 Spring 서버가 뜰 때 Spring IoC Container에 'Bean'으로 저장된다.

Bean에는 passwordEncoder 와 같은 이름으로 저장이된다.

 


 

📍@Autowired  객체에 대한 의존성을 주입시켜 자동으로 값을 할당한다.

@SpringBootTest
public class PasswordEncoderTest {
    @Autowired
    PasswordEncoder passwordEncoder;
    @Test
    @DisplayName("수동 등록한 passwordEncoder를 주입 받아와 문자열 암호화")
    void test1(){
        String password = "Robbie's password";

        //암호화
        String encodePassword = passwordEncoder.encode(password);
        System.out.println("encodePassword = " + encodePassword);

        String inputPassword = "Robbie";

        //복호화를 통해 암호화된 비밀번호와 비교
        boolean matches = passwordEncoder.matches(inputPassword, encodePassword);
             //matches 내부에서 입력받은 내용을 암호화해서 암호화된 패스워드와 비교
        System.out.println("matches = " + matches);
    }
}

위를 테스트 해보기 위한 테스트 코드이다.

Bean으로 등록한 passwordEncoder를 @Autowired 로 주입받아서 사용한다.

🔸의존 관계 주입
  • 클래스 모델이나 코드에는 런타임 시점의 의존관계가 드러나지 않는다. 그러기 위해서는 인터페이스만 의존하고 있어야 한다.
  • 런타임 시점의 의존관계는 컨테이너나 팩토리 같은 제3의 존재가 결정한다.
  • 의존관계는 사용할 오브젝트에 대한 레퍼런스를 외부에서 제공(주입)해줌으로써 만들어진다.

 


📍같은 타입의 Bean이 2개라면?

     @Component  Bean으로 등록해준다.

 

1) 등록된 Bean 이름 명시하기

@Component
@Primary
public class Chicken implements Food {
    @Override
    public void eat() {
        System.out.println("치킨을 먹습니다.");
    }
}

2) @Primary 사용하기

@SpringBootTest
public class BeanTest {

    @Autowired
    Food pizza;
    
    @Autowired
    Food chicken;
    
}

---------

@SpringBootTest
public class BeanTest {
    @Autowired
    Food food;
}

@Primary가 추가되면 같은 타입의 Bean이 여러 개 있더라도 우선 @Primary가 설정된 Bean 객체를 주입

 

3) @Qualifier 사용하기

@Component
@Qualifier("pizza")
public class Pizza implements Food {
    @Override
    public void eat() {
        System.out.println("피자를 먹습니다.");
    }
}

------

@SpringBootTest
public class BeanTest {

    @Autowired
    @Qualifier("pizza")
    Food food;
}

같은 타입의 Bean들에 Qualifier와 Primary가 동시에 적용되어 있다면 Qualifier의 우선순위가 더 높다.

Qualifier는 적용하기 위해서 주입 받고자하는 곳에 해당 Qualifier를 반드시 추가해야 한다.

 

 

느낀점

처음 코드를 살펴봤을 때는 이게 무슨 말인지 싶었다. 강사님의 설명을 들어도 와닿지 않는데 역시 이럴 때는 도움을 청해야 해! 함께 공부하는 분이 내 눈높이에서 설명을 잘 해주니 간지러웠던 부분이 사라졌다. 모르는 걸 부끄러워하지 않는 게 좋은 것 같다. 이렇게 다른 비슷한 코드들이 점차 눈에 들어오면서 이해가 빨라지겠지😊 느리더라도 포기하지 말아야겠다.