본문 바로가기
스프링 관련/스프링

config

by 문자메일 2023. 1. 14.

패키지 구성 기본 뼈대

- config (configuration)

-> 컨피그 클래스들 ( ModdelMapper, Authentication, Redis, Security )

-- filter (optional)

 

 

config 패키지 하위 Config 설정 파일 클래스 특징

 

1. 설정 클래스 위에 @Configuration 어노테이션 필요

주요 사용 이유 :

  1. 스프링 컨테이너에 Bean 등록 위함
  2. 해당 클래스를 설정파일로 설정 위함

메서드의 이름이 Bean의 이름으로 결정된다.

@Configration의 역할, Bean을 등록할 때 싱글톤이 되도록 보장해주는 역할 수행

@Bean의 역할, 스프링 컨테이너에 Bean을 등록하는 역할, @Configuration 없이 단독으로 쓰이면 해당 Bean이 싱글톤으로 등록되지 않는다.

 

Spring Bean 이란? 

Spring에서는 Spring의 DI Container에 의해 관리되는 POJO(Plain Old Java Object)를 Bean 이라고 부른다.

Spring IoC 컨테이너 (혹은 DI 컨테이너)에 의해 생성 & 관리된다.

 

 

 

사용 예시 코드

 

@Configuration
public class SampleModelMapperConfig {

    @Bean
    public ModelMapper modelMapper(){
        ModelMapper modelMapper = new ModelMapper();
        modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT);
        modelMapper.getConfiguration().setSkipNullEnabled(true);
        return modelMapper;
    }
}

 

@Configuration
@EnableRedisRepositories
@RequiredArgsConstructor
public class RedisConfiguration {

    private final RedisProperties redisProperties;

    @Bean
    public RedisConnectionFactory redisConnectionFactory(){
        RedisURI redisURI = RedisURI.create(redisProperties.getUrl());
        org.springframework.data.redis.connection.RedisConfiguration configuration =
                LettuceConnectionFactory.createRedisConfiguration(redisURI);
        LettuceConnectionFactory factory = new LettuceConnectionFactory(configuration);
        factory.afterPropertiesSet();
        return factory;
    }

    @Bean
    public RedisTemplate<String, User> userRedisTemplate(RedisConnectionFactory redisConnectionFactory){
        RedisTemplate<String, User> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<User>(User.class));
        return redisTemplate;
    }
}

 

@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class AuthenticationConfig extends WebSecurityConfigurerAdapter {

    private final UserService userService;
    @Value("${jwt.secret-key}")
    private String key;

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().regexMatchers("^(?!/api/).*")
                .antMatchers("/api/*/users/join", "/api/*/users/login");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
                .authorizeRequests()
                .antMatchers("/api/**").authenticated()
                .and()
                .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                // UsernamePasswordAuthenticationFilter 이 필터 이전에 직접 만든 JwtTokenFilter 적용하라는 의미
                .addFilterBefore(new JwtTokenFilter(key, userService), UsernamePasswordAuthenticationFilter.class)
                .exceptionHandling()
                .authenticationEntryPoint(new CustomAuthenticationEntryPoint());
    }
}

'스프링 관련 > 스프링' 카테고리의 다른 글

controller  (0) 2023.01.15
repository  (0) 2023.01.15
domain  (0) 2023.01.14
service  (0) 2023.01.14
스프링 프로젝트 패키지 구조 정리 및 항목별 index url 정리  (0) 2023.01.13

댓글