New Project를 생성한다.
3가지를 Add 해준다.
Create Git을 했으니 생성한 프로젝트를 모두 최초의 커밋을 해준다.
오른쪽에 코끼리모양 Gradle 버튼을 누르고 사진을 따라간다.
그럼 build.gradle로 진입한다.
그리고 이 코드를 작성하고 코끼리 새로고침을 눌러 적용시킨다.
SpringAuthApplication으로 이동
이렇게 작성한다. Spring Security의 일부 기능들을 제외시킨것이다. 학습할 때 방해가 되기 때문이다.
이후에 Spring Security를 배울때 다시 제외한걸 돌려놓을것이다.
Bean 수동 등록이란?
@Component를 사용하면 @ComponentScan에 의해 자동으로 스캔되어 해당 클래스를 Bean으로 등록해준다.
일반적으로 @Component를 사용하여 Bean을 자동으로 등록하는것이 좋다.
프로젝트의 규모가 커질 수록 등록할 Bean들이 많아지기 때문에 자동등록을 사용하면 편리하다.
비즈니스 로직과 관련된 클래스들은 그 수가 많기 때문에 @Controller, @Service와 같은 애너테이션들을 사용해서 Bean으로 등록하고 관리하면 개발 생산성에 유리하다.
그렇다면 Bean 수동 등록은 언제 사용할까?
기술적인 문제나 공통적인 관심사를 처리할 때 사용하는 객체들을 수동으로 등록하는 것이 좋다.
공통 로그처리와 같은 비즈니스 로직을 지원하기 위한 부가적이고 공통적인 기능들을 기술 지원 Bean이라 부르고 수동등록한다.
또한 수동등록된 Bean에서 문제가 발생했을 때 해당 위치를 파악하기 쉽다는 장점이 있다.
Bean 수동 등록하는 방법
config 패키지 생성 -> PasswordConfig 클래스 생성
이것이 수동등록이다. 아직 코드의 내용을 이해할 필요는 없다.
우리가 Bean으로 등록하고자 하는 객체를 반환하는 메서드에 @Bean 을 달아준다. 그리고 클래스에는 @Configuration을 달아줘야 한다.
Spring 서버가 실행될때 IoC 컨테이너에 passwordEncoder 메서드가 반환하는 객체를 Bean화 해준다.
그 객체의 이름은 메서드의 이름과 동일하다.
테스트 해보기
test 폴더에 PasswordEncoderTest 클래스를 만든다.
package com.sparta.springauth;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.security.crypto.password.PasswordEncoder;
@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);
System.out.println("matches = " + matches); // 암호화할 때 사용된 값과 다른 문자열과 비교했기 때문에 false
}
}
이 코드 전체를 복사 붙여넣기 한다.
@Autowired를 통해 아까 우리가 Bean으로 등록했던 PasswordEncoder를 주입받는다.
encodePassword에 password를 암호화한 값을 담을것이다. 진짜로 암호화가 되는지 알아보기 위해 출력도 한다.
inputPassword와 encodePassword가 같은지 확인한다. 물론 다르므로 false가 나올것이다.
passwordEncoder.matches(inputPassword, encodePassword);는 입력받은 평문과 암호화된 암호가 일치하는 문자열인지 확인하는 함수다. 반환형태는 boolean이다.
첫번째의 인수로 평문을 넣고, 두번째 인수로 암호화된 암호문을 넣는다.
테스트 실행 결과 정상적으로 작동하는것을 확인했다.
'Spring 숙련주차 > 1주차' 카테고리의 다른 글
6. JWT 다루기 (0) | 2024.08.23 |
---|---|
5. JWT란 무엇일까? (0) | 2024.08.22 |
4. 쿠키와 세션이란 무엇일까? (0) | 2024.08.21 |
3. 인증과 인가란 무엇일까? (0) | 2024.08.21 |
2. 같은 타입의 Bean이 2개라면? (0) | 2024.08.21 |