스프링 테스트 프레임워크에서 제공하는 MockMvc를 이용하여 Controller 테스트 하기 @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "/dispatcher-servlet.xml", "/spring.xml" }) @WebAppConfiguration public class TestControllerTest { @Autowired private WebApplicationContext context; @Autowired private MessageSource reloadableResourceBundleMessageSource; private MockMvc mockMvc; @Before public void set..
jedis의 returnBrokenResource 메서드에 대해 잘못 알고 있는 부분이 있어 정리한다. @Beforepublic void init() { GenericObjectPoolConfig config = new GenericObjectPoolConfig();config.setMaxTotal(20);config.setBlockWhenExhausted(true);config.setMaxWaitMillis(1000); JedisShardInfo shard1 = new JedisShardInfo("test.com", 6300);JedisShardInfo shard2 = new JedisShardInfo("test.com", 6301);JedisShardInfo shard3 = new JedisShard..
spring의 RestTemplate을 이용하면 대게 다음의 exchange 메소드를 이용하여 외부 API와 연동을 하게 된다.ResponseEntity response = restTemplate.exchange(requestUrl, httpMethod, requestEntity, p); 위의 exchange 메소드를 이용하여 연동을 할 때 HTTP request, response 전문을 로그로 남기고 싶을 때가 있어서 그 방법을 찾아보게 되었다. 첫 번째 방법은 log4j를 이용하여 로그를 남기는 방법인데 이 방법은 한 줄 로그로 남길 수 없다는 단점이 있어 포기했다. 무슨 말이냐하면 아래와 같이 여러 줄로 로그가 기록된다는 것이다. 여러 줄로 출력되는 로그는 멀티 쓰레드 환경에서는 오류에 대한 원인을..
로그인 되어 있는 상태에서 다음의 메소드를 Async 방식으로 호출한 후 로그인 사용자의 계정 정보를 추출하면 항상 null 값이 나온다.@Asyncpublic void searchLog(Search search) {Authentication auth = SecurityContextHolder.getContext().getAuthentication();String userId = auth.getName();} 스프링 시큐리티는 사용자 인증 후 ThreadLocal 객체에 값을 저장하기 때문에 @Async 기능으로 인한 새로운 쓰레드에서는 사용자 세션 정보를 가져올 수 없다.-> spring security 필터를 통과한 쓰레드만 사용자 로그인 정보를 ThreadLocal에 담는다.
@RequestMapping의 value에 선언하는 스트링 값을 프로퍼티에서 관리할 수 있는 방법에 대해서 알아보았다. 아래와 같이 Controller에 선언되어 있는 @RequestMapping 이 존재한다.@RequestMapping(value = "/loginPage", method = RequestMethod.GET)public String loginPage() {return "login/loginPage";} 위의 맵핑 애노테이션 정보를 다음과 같이 수정한 후 테스트를 진행해 보았다.물론, properties 파일에는 cont.req.name=loginPage 라고 선언이 되어 있는 상태이다.@RequestMapping(value = "/${cont.req.name}", method = Requ..
빈 등록을 XML이 아닌 코드로 해야 할 일이 있어 찾아보니 DefaultListableBeanFactory를 이용하면 가능하다는 것을 알게 되었다. 스프링 웹 애플리케이션을 구동하면 다음과 같이 DefaultListableBeanFactory 클래스에서 생성된 빈 정보를 출력하는 것을 확인 할 수 있다.[2014-08-13 13:12:09 INFO o.s.b.f.s.DefaultListableBeanFactory][598] - Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@7c24d3f1: defining beans [loggingAOP,scheduleTest,appli..
예전 스프링 스터디를 하면서 bean 에리먼트의 parent 어트리뷰트를 정의하는 것을 배운적이 있다. 사실 그때까지만해도 이 기능을 사용할 일이 있을까라는 생각을 했는데 오늘 난 이 기능을 사용하게 되었고 유용함을 느꼈다. 내가 사용하게 된 계기는 interceptor의 property 에 validator bean을 추가하는 과정에서 중복이 발생한다는 것이였다.예를 들어 /a 라는 URL 패턴으로 접근하는 요청에 대해서 A라는 인터셉터가 동작하고 A라는 인터셉터에서는 valid_1, valid_2, valid_3 가 동작해야 한다./b 라는 URL 패턴에서는 B라는 인터셉터가 동작하고 valid_1, valid_2, valid_4 가 동작해야 한다.여기서 확인할 수 있는 것은 valid_1, vali..
spring에서 제공해 주는 util:map 기능을 사용하여 xml 파일에 다음과 같이 에러 코드를 정의해 주었다. 이와 같이 선언하게 되면 key, value 는 String 타입으로 지정되어 HashMap 객체에 저장이 된다. 아이러니한건 스프링 DI 방식을 이용하여 다음과 같이 객체 주입을 해도 예외가 발생되지 않는 다는 것이다.@Resource(name = "loginCheckErrorCodes")private Map loginCheckErrorCodes; 에러가 발생될 것이라 예상을 하게된 이유는 DI로 주입 받는 Map 클래스의 key 타입이 Integer로 되어 있기 때문이다. 자동으로 type conversion이 발생되어 key 타입이 Integer형으로 바뀐것일까? 만약 type con..
현재 개발하고 있는 API 서버는 모든 HTTP Response 메세지를 JSON 스트링으로 리턴한다.일단 JSON으로 리턴하지만 언젠가 "XML도 재공해 주세요." 라는 말이 나올수 있으므로 ContentNegotiatingViewResolver로 설정하여 개발을 하고 있는데 한 가지 이상한 현상이 있었다. 다음의 Controller 코드를 보면 GET 방식으로 /orderform 요청이 들어오면 파라미터 정보는 ModelAttribute인 OrderformDto에 담고 해당 DTO 객체를 orderService.orderform 으로 넘겨 데이터를 받아와 Result객체에 담은 후 DispatcherServlet으로 return 하는 코드이다.@RequestMapping(value = "/orderf..
logback을 이용하여 개발, 스테이징, 라이브 환경에 따른 로그 레벨을 분기하기 위해서 다음과 같이 조건문을 추가하였다. spring.profiles.active의 값은 java 실행 시 -Dspring.profiles.active="dev" 아규먼트를 추가하여 각 서버를 구분지었다. 헌데 웹 애플리케이션을 구동하면 로그 레벨이 각 환경에 맞게 적용이 안 된다. 문제는 janino library가 추가되어 있어야 했다. pom.xml 파일에 아래 라이브러리를 추가하여 문제 해결org.codehaus.janino janino 2.6.1
개인 프로젝트인 스프링 3.1 기반의 웹 애플리케이션에 시큐리티를 추가해 보기로 했다. 최종 구현 목표는 DB로 인증 및 URL 관리를 하는 것이며 일단 단계적으로 시큐리티가 어떤 기능을 지원하는지를 알아가기 위해서 오늘은 프로퍼티를 이용한 인증 및 권한 부여 방법에 대해서 설명하려고 한다. 먼저 스프링 시큐리티를 적용하기 위해서는 pom.xml에 라이브러리를 추가한다. org.springframework.security spring-security-core ${spring.security.version} org.springframework.security spring-security-config ${spring.security.version} org.springframework.security spri..