반응형
빌더 패턴 이란
복합 객체의 생성 과정과 표현 방법을 분리하여 동일한 생성 절차에서 서로 다른 표현 결과를 만들 수 있게 하는 패턴입니다.
생성패턴 중 하나로 빌더 패턴의 장점은 생성패턴 객체의 인스턴스생성과정을 추상화, 객체생성과 참조과정을 캡슐화하여 → 객체 생성/변경이 프로그램 구조에 영향을 받지 않도록함 → 결국 프로그램 유연해집니다.
스프링에서 사용 예시
대표적인 예시로 spring-security가 있습니다.
docs의 example을 보면 HttpSecurity, UserDeatails객체를 build하여 만들고 사용합니다.
HttpSecurity (spring-security-docs 5.7.4 API)
@Configuration
@EnableWebSecurity
public class FormLoginSecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.authorizeRequests().antMatchers("/**").hasRole("USER").and().formLogin(); // HttpSecurity의 Builder 를 리턴
return http.build(); // HttpSecurity.Builder.build()
}
@Bean
public UserDetailsService userDetailsService() {
UserDetails user = User.withDefaultPasswordEncoder()
.username("user")
.password("password")
.roles("USER")
.build();
return new InMemoryUserDetailsManager(user);
}
}
https://docs.spring.io/spring-security/reference/servlet/configuration/java.html
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.*;
import org.springframework.security.config.annotation.authentication.builders.*;
import org.springframework.security.config.annotation.web.configuration.*;
@EnableWebSecurity
public class WebSecurityConfig {
@Bean
public UserDetailsService userDetailsService() {
InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
manager.createUser(User.withDefaultPasswordEncoder().username("user").password("password").roles("USER").build());
return manager;
}
}
@EnableWebSecurity
public class MultiHttpSecurityConfig {
@Bean
public UserDetailsService userDetailsService() throws Exception {
// ensure the passwords are encoded properly
UserBuilder users = User.withDefaultPasswordEncoder();
InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
manager.createUser(users.username("user").password("password").roles("USER").build());
manager.createUser(users.username("admin").password("password").roles("USER","ADMIN").build());
return manager;
}
@Bean
@Order(1)
public SecurityFilterChain apiFilterChain(HttpSecurity http) throws Exception {
http
.antMatcher("/api/**")
.authorizeHttpRequests(authorize -> authorize
.anyRequest().hasRole("ADMIN")
)
.httpBasic(withDefaults());
return http.build();
}
@Bean
public SecurityFilterChain formLoginFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(authorize -> authorize
.anyRequest().authenticated()
)
.formLogin(withDefaults());
return http.build();
}
}
감사합니다.
참고
[디자인 패턴] 빌더 패턴(Builder Pattern)
반응형
'프로그래밍 > 디자인패턴' 카테고리의 다른 글
자바 커맨드(Command) 패턴 (0) | 2022.12.12 |
---|---|
자바 데커레이터(Decorator) 패턴 (0) | 2022.11.15 |
자바 전략 패턴 (0) | 2022.11.03 |
자바 프록시 패턴 (0) | 2022.11.01 |
자바 팩토리 메서드 패턴 (0) | 2022.10.25 |
댓글