일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 격파르타후기
- sqld자격증합격
- java기본자료형
- 컴파일
- java참조자료형
- 인터프린터언어
- 노베이스부트캠프
- 격파르타비전공자
- javaJRE
- java map 출력
- java set 저장
- java 자료구조 활용
- 비전공자sqld
- 프로그래머스제일작은수
- java list 저장
- java알고리즘문제풀이
- 항해15기
- java set 출력
- 코딩부트캠프후기
- java알고리즘
- 항해99후기
- 작은수제거하기
- java list 출력
- 격파르타장점
- java map 저장
- 격파르타합격후기
- 프로그래머스
- javaJVM
- java map
- java최솟값구하기
- Today
- Total
코딩과 결혼합니다
230703 - Bean 수동 등록 본문
📍 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를 반드시 추가해야 한다.
느낀점
처음 코드를 살펴봤을 때는 이게 무슨 말인지 싶었다. 강사님의 설명을 들어도 와닿지 않는데 역시 이럴 때는 도움을 청해야 해! 함께 공부하는 분이 내 눈높이에서 설명을 잘 해주니 간지러웠던 부분이 사라졌다. 모르는 걸 부끄러워하지 않는 게 좋은 것 같다. 이렇게 다른 비슷한 코드들이 점차 눈에 들어오면서 이해가 빨라지겠지😊 느리더라도 포기하지 말아야겠다.
'2세 > Spring' 카테고리의 다른 글
Spring 회원 가입 구현과 에러 잔치^^ (0) | 2023.07.05 |
---|---|
230704 - annotation 정리 (회원 가입 구현) (0) | 2023.07.04 |
(WIL) 230702 - DI, IoC, Bean (0) | 2023.07.03 |
230701 - Bean, Util Class, Enum (0) | 2023.07.01 |
230628 - Spring 프로젝트 오류 (0) | 2023.06.29 |