Spring 숙련주차/1주차

1. Bean을 수동으로 등록하는 방법

note994 2024. 8. 19. 22:31

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 클래스 생성

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이다.

 

첫번째의 인수로 평문을 넣고, 두번째 인수로 암호화된 암호문을 넣는다.

테스트 실행 결과 정상적으로 작동하는것을 확인했다.