📌 스프링 프레임워크
- 프로젝트 규모가 커질수록 의존성 주입을 관리하기 어려움 → 의존성 주입을 담당하는 컨테이너 필요!
- 스프링 IoC 컨테이너
- 스프링 프레임워크에서 의존성 주입을 담당하는 컨테이너
- 객체 생성 시, 주입해야 하는 객체를 자동으로 주입해줌 (단, Bean으로 등록된 객체여야 함!)
- Bean
- 스프링 컨테이너가 관리하는 객체
- 스프링 컨테이너를 Bean Factory라고 함
📌 Bean
Spring IoC 컨테이너가 관리하는 Java 객체
- Spring에서는 new를 이용해 만들어진 객체가 아니라 Spring에서 관리하는 Bean이라는 객체를 이용함
- 의존성 관리에 용이함
- 똑같은 객체가 여러 번 만들어지는 것이 아니라 하나를 만들면 그것을 재사용함 → 메모리 절약
📣 등록 방법
- @Component
- 스프링이 해당 클래스를 자바 빈으로 등록하도록 함
- 자바 설정 클래스를 직접 만들기
- 설정 클래스를 만들고 @Configuration 이용
- 해당 클래스 안의 메소드에 @Bean 이용
→ Bean으로 등록된 것들을 의존성 주입받아 사용하는 방법 : @Autowired
📌 Annotation
- Annotation(@)은 사전적 의미로 주석
- Java에서 @는 코드 사이에 주석처럼 쓰이며 특별한 의미, 기능을 수행하게 해줌
- 프로그램에서 추가적인 정보를 제공해주는 메타데이터
📣 장점과 사용법
- 장점
- 사용 순서
- @ 를 정의함
- 클래스에서 @를 배치함
- 코드가 실행되는 중 추가 정보를 획득해 기능을 실시함
📣 @Bean
- 개발자가 직접 제어가 불가능한 외부 라이브러리 등을 Bean으로 등록하고자 할 때 사용되는 Annotation
@Configuration
public class ApplicationConfig {
@Bean
public ArrayList<String> array1() {
return new ArrayList<String>();
}
@Bean(name="myarray")
public List<String> array2() {
return new List<String>();
}
}
📣 @Component
- 개발자가 직접 작성한 Class를 Bean으로 등록하기 위한 Annotaion
- 즉, 간단하게 Bean을 등록하기 위해 사용되는 Annotation
@Component
public class Student {
public Student() {
System.out.println("hi");
}
}
📣 @SpringBootApplication
- @Configuration, @EnableAutoConfiguration, @ComponentScan 3가지가 합쳐진 Annotation
- Spring Boot 어플리케이션 실행 초기 진입점에 위치하는 어노테이션
- 해당 어노테이션이 달린 클래스가 있는 패키지를 베이스 패키지로 간주
@SpringBootApplication
public class SesacSpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(SesacSpringBootApplication.class, args);
}
}
📣 @Autowired
- 스프링 컨테이너에 등록한 등록한 Bean에게 의존 관계 주입이 필요할 때, DI(의존성 주입)을 가능하게 하는 어노테이션
- 즉, @Autowired를 사용한 클래스에서 적용된 클래스를 사용할 수 있게 해줌
📌 Spring Security
📣 인증(Authentication) vs. 인가(Authorization)
- 인증(Authentication)
- 사용자의 신원 입증
- ex. 특정 사이트에 로그인 시 누구인지 확인하는 절차를 거침
- 인가(Authorization)
- 인증된 사용자가 요청된 자원에 접근 가능한지 권한 확인
- ex. 일반 유저는 관리자 페이지에 접속할 수 없음
📣 Spring Security
스프링 기반의 애플리케이션 보안(인증, 인가)을 담당하는 스프링 하위 프레임워크
- 프레임워크의 일종으로 반드시 필요한 것은 아님
- 다양한 보안 관련 옵션 제공
- Filter를 기반으로 동작
- Bean으로 설정 가능
Spring MVC
이전에 Spring MVC에 대해 설명한 기록
- MVC 패턴을 지원하고 DispatcherServlet이라는 특수 서블릿을 통해 요청 처리
- 해당 서블릿은 모든 종류의 요청을 받아 적절한 Controller에게 전달하고, 그 결과를 다시 사용자에게 반환

- 즉, HTTP 요청이 Dispatcher Servlet을 거쳐 Controller로 전달됨
📣 Spring Security 동작 과정
- Spring Security는 요청이 Dispatcher Servlet으로 가기 전에 Filter 단에서 인증/인가 처리를 진행

📣 Spring Security Architecture
- 아이디, 비밀번호 기반 폼 로그인 시도 시, Spring Security의 인증 처리 로직

- HTTP Request 수신
- 사용자의 로그인 정보(id, pw)를 입력하면, HTTPServletRequest에 id, pw가 전달됨
- AuthenticationFilter가 넘어온 아이디와 비밀번호 유효성 검사 진행
- 유효성 검사가 끝나면 인증용 객체인 UsernamePasswordAuthenticationToken을 생성
- UsernamePasswordAuthenticationToken을 AuthenticationManager에게 보냄
- UsernamePasswordAuthenticationToken을 AuthenticationProvider에 보냄
- 사용자 아이디를 UserDetailService에 보냄
- DB에 있는 사용자 정보를 가져와 찾아낸 사용자 정보를 UserDetails 객체로 만듦
- 입력된 사용자 정보와 UserDetails 정보를 비교해 실제 인증 처리
- 인증 완료 여부
- 인증 완료: 사용자 정보를 담은 Authentication 객체 반환
- 인증 실패: AuthenticationException 발생
- Authentication 객체가 SecurityContextHolder에 저장됨
📣 Spring Security 사용하기
- build.gradle에 dependencies 추가
implementation 'org.springframework.boot:spring-boot-starter-security'
- 참고. Thymeleaf에서 Spring Security를 사용한다면?
implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6'