주요글: 도커 시작하기
반응형

Ant 경로 패턴은 경로를 지정할 때 유용하게 사용할 수 있는 경로 표현 패턴인데, 스프링은 특정 경로가 Ant 경로 패턴 경로와 일치하는지 여부를 확인할 때 사용할 수 있는 org.springframework.util.AntPathMatcher 클래스를 제공하고 있다. 


AntPathMatcher 클래스의 사용방법은 간단하다. boolean match(String pattern, String path) 메서드를 이용해서 path가 Ant 패턴인 pattern에 매칭되는지 확인하면 된다. 매칭될 경우 match() 메서드는 true를 리턴한다.


AntPathMatcher pathMatcher = new AntPathMatcher();

assertThat(pathMatcher.match("/a/**/b", "/a/1/2/3/b"), equalTo(true));

assertThat(pathMatcher.match("/a/**/b", "/a/1/2/3/b/c"), equalTo(false));


AntPathMatcher의 또 다른 기능은 패턴을 기준으로 매칭되는 부분을 추출하는 것이다. 이 기능을 사용하려면 다음과 같이 extractPathWithinPattern(String pattern, String path) 메서드를 사용하면 된다. 이 메서드는 pattern의 '*', '?' 등을 기준으로 경로에서 패턴에 매칭되는 부분을 추출해준다. 다음은 이 메서드의 실행 결과를 보여주고 있다.


assertThat(pathMatcher.extractPathWithinPattern("/a/*", "/a/1"), equalTo("1"));

assertThat(pathMatcher.extractPathWithinPattern("/a/*", "/a/1/b"), equalTo("1/b"));

assertThat(pathMatcher.extractPathWithinPattern("/a/b/*", "/a/b/c"), equalTo("c"));

assertThat(pathMatcher.extractPathWithinPattern("/a/b/*.xml", "/a/b/c.xml"), equalTo("c.xml"));


assertThat(pathMatcher.extractPathWithinPattern("/*", "/a/b/c.xml"), equalTo("a/b/c.xml"));

assertThat(pathMatcher.extractPathWithinPattern("/*.xml", "/a/b/c.xml"), equalTo("a/b/c.xml"));


assertThat(pathMatcher.extractPathWithinPattern("/a/*", "/a/1/b"), equalTo("1/b"));

assertThat(pathMatcher.extractPathWithinPattern("/a/**", "/a/1/b"), equalTo("1/b"));


assertThat(pathMatcher.extractPathWithinPattern("/a/*", "/a/1/b.xml"), equalTo("1/b.xml"));

assertThat(pathMatcher.extractPathWithinPattern("/a/**", "/a/1/b.xml"), equalTo("1/b.xml"));


assertThat(pathMatcher.extractPathWithinPattern("/a/*/b", "/a/1/b"), equalTo("1"));

assertThat(pathMatcher.extractPathWithinPattern("/a/**/b", "/a/1/b"), equalTo("1"));


assertThat(pathMatcher.extractPathWithinPattern("/a/**/b.xml", "/a/1/b.xml"), equalTo("1"));

assertThat(pathMatcher.extractPathWithinPattern("/a/**/*.xml", "/a/1/b.xml"), equalTo("1/b.xml"));


위 코드에서 equalTo() 부분의 결과가 extractPathWithinPattern() 메서드의 실행 결과인데, 결과를 보면 '*'와 '**'가 차이가 없다는 것을 알 수 있다.


다음 extractPathWithinPattern() 실행 결과는 어떻게 될까?


pathMatcher.extractPathWithinPattern("/a/**/b", "/a/1/2/3/b") ????


실행 결과로 "1/2/3" 이라고 결과를 예상했겠지만, 실제 결과는 "1/3/b" 다. 상상에서 완전히 벗어난다. 다음은 몇 가지 상상을 벗어나느 결과를 만들어내는 몇 개 예제를 만들어 본 것이다.


assertThat(pathMatcher.extractPathWithinPattern("/a/**/b", "/a/1/2/3/b"), equalTo("1/3/b"));

assertThat(pathMatcher.extractPathWithinPattern("/a/**/b", "/a/1/2/3/b"), equalTo("1/3/b"));

assertThat(pathMatcher.extractPathWithinPattern("/a/**/b", "/a/1/2/3/4/b"), equalTo("1/3/4/b"));

assertThat(pathMatcher.extractPathWithinPattern("/a/a1/**/b", "/a/1/2/3/4/b"), equalTo("2/4/b"));


위 결과를 보면 알 수 있겠지만, match() 메서드를 기준으로 '*'나 '**'에 매칭되는 경로가 두 개 이상이 되면 extractPathWithinPattern() 메서드는 상상한 것과 완전히 다른 결과를 돌려준다. AntPathMatcher를 사용하려면 이 점에 주의하기 바란다.


+ Recent posts