레거시 프로젝트는 의존성관리를 메이븐에 맡긴다해도 일일이 추가해줘야하기 떄문에 매우 귀찮다 ㅠ
따라서 스프링 부트의 spring-boot-starter-security의 자식들을 추가해주겠다.

이외에도 spring-aop가 있지만, spring-webmvc에 종속되어있기떄문에 따로 추가는 안했다.

다음으로 시큐리티 설정을 해보자.

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .mvcMatchers("/", "/index").permitAll() //이와 같은 요청에는 모든 사용자가 접근가능하다.
                .anyRequest().authenticated(); //위와 같이 permit을 준 요청 이외 어떤 요청이든 인증이 필요하다.
    }
}

이렇게 코딩을 해도 모든 uri 요청이 다 허용된다. 왜냐면 필터를 안걸어줬기 떄문.
web.xml에 다음과 같이 추가해주자. (한글 인코딩이 깨질 수 있으니 encodingFilter 밑에 추가해줄 것.)

    <filter>
        <filter-name>springSecurityFilterChain</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

접속해보자. /index, / 외 요청에는 403 Access Denied 이 뜨는 걸 볼 수 있다.

/index/ 요청은 잘 먹히지만 css가 깨진다
그 이유는 css와 같은 정적리소스 파일들은 /resources 에 매핑되는데, 여기도 권한을 줘야한다 코드를 바꿔보자

        http.authorizeRequests()
                .mvcMatchers("/resources/**").permitAll()
                .mvcMatchers("/", "/index").permitAll()
                .anyRequest().authenticated();
        http.formLogin();        //기본적인 로그인 form을 사용하겠다.

/resources 요청에 모든 사용자가 접근 가능하게 코드를 바꿨다.
css가 더이상 안깨진다.

@SpringBootTest

  • 실제 구동되는 애플리케이션과 똑같이 애플리케이션 컨텍스트를 로드하여 테스트하기 때문에 모든 테스트를 수행할 수 있다.
  • 하지만 Bean을 모두 로드하기 때문에 속도가 느리다
  • @RunWith(SpringRunner.class)와 함께 쓰여야한다. @RunWith(...) 는 JUnit내장 러너대신 어노테이션에 정의된 러너를 사용한다. SpringRunner는 JUnit실행에 필요한 SpringJUnit4ClassRunner를 상속받았다.
  • 프로파일 환경마다 다른 환경값을 부여하고 싶다면 @ActiveProfiles(...) 와 같이 쓴다.
  • 테스트에서 @Transactional을 사용하면 테스트를 마친 뒤 데이터를 롤백한다.
  • @SpringBootTest는 검색알고리즘을 사용하여 @SpringBootApplication이나 @SpringBootConfiguration을 찾는다.

@WebMvcTest

  • MVC를 위한 테스트다. 컨트롤러를 테스트하는데 적합하다. 웹상의 요청과 응답에 대해 테스트가 가능하다.
  • 사용을 위해선 테스트할 특정 컨트롤러명을 명시해주어야한다. 특정 컨트롤러 관련 빈만 로드하여 가벼운 테스트를 수행한다.
  • @Service는 @WebMvcTest의 적용대상이 아니다. Controller에서 사용하는 Service는 @MockBean으로 가짜객체를 만들자.

@Value

폴더구조

application.yml

property:
  test:
    name: property depth test
propertyTest: test
propertyTestList: a,b,c

이제 변수에 yml파일에 저장돼있는 값을 매핑시켜보자.

AutoconfigurationApplicationTests.java

    @Value("${property.test.name}")
    private String propertyTestName;

    @Value("${propertyTest}")
    private String propertyTest;

    @Value("${propertyTestList}")
    private List<String> propertyTestList;

    @Value("${propertyTestList}")
    private String[] propertyTestArray;

    @Value("#{'${propertyTestList}'.split(',')}")
    private List<String> propertyTestListSplit;

    @Test
    public void testValue(){
        log.info("==================================================");
        log.info(propertyTestName);
        log.info(propertyTest);
        log.info(propertyTestList.toString());
        log.info(Arrays.toString(propertyTestArray));
        log.info(propertyTestListSplit.toString());
    }

결과.

2019-08-16 21:32:32.930  INFO 1970 --- [    Test worker] c.e.d.AutoconfigurationApplicationTests  : property depth test
2019-08-16 21:32:32.930  INFO 1970 --- [    Test worker] c.e.d.AutoconfigurationApplicationTests  : test
2019-08-16 21:32:32.930  INFO 1970 --- [    Test worker] c.e.d.AutoconfigurationApplicationTests  : [a, b, c]
2019-08-16 21:32:32.930  INFO 1970 --- [    Test worker] c.e.d.AutoconfigurationApplicationTests  : [a, b, c]
2019-08-16 21:32:32.930  INFO 1970 --- [    Test worker] c.e.d.AutoconfigurationApplicationTests  : [a, b, c]

org.springframework.web.context.ContextLoaderListener

 <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 </listener>
  • ContextLoaderListener는 웹어플리케이션이 시작할 때 자동으로 루트 애플리케이션 컨텍스트를 만들고 초기화해준다.

ContextLoaderListener가 사용하는 디폴트 설정

  • XML 설정파일 위치 : /WEB-INF/applicationContext.xml
  • 애플리케이션 컨텍스트 클래스 : XmlWebApplicationContext

ContextLoaderListener 사용자정의

  • 사용자정의 XML 설정 위치
    <context-param>
      <param-name> contextConfigLocation </param-name>
      <param-value> /WEB-INF/applicationContext.xml </param-value>
    </context-param>
  • 사용자정의 애플리케이션 컨텍스트 클래스
    <context-param>
      <param-name>contextClass</param-name>
      <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
    </context-param>

+ Recent posts