SpringFramework 36

동적 빈 생성

Spring에서 제공하는 ConfigurableListableBeanFactory 클래스를 이용하여 동적으로 빈 등록이 가능하다. 동적 생성할 클래스 선언 public class DynamicClass { // 빈 등록시 생성자 호출여부 확인용 public DynamicClass() { System.out.println("생성자 호출!"); } public void func(){ System.out.println("Test"); } } 테스트 코드를 통한 동적 빈 생성 및 조회 @SpringBootTest public class DynamicClassTest { @Test void test(){ StaticApplicationContext staticApplicationContext = new Stati..

추상클래스를 사용한 통합 배치 관리 프로그램

배치 병렬 처리를 위한 쓰레드 빈 생성 클래스 @Configuration @EnableAsync public class ThreadConfig { @Bean(name="jobExecutor") public Executor jobExecutor(){ ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); taskExecutor.setCorePoolSize(5); taskExecutor.setMaxPoolSize(10); taskExecutor.setQueueCapacity(30); taskExecutor.setThreadNamePrefix("jobThead-"); taskExecutor.initialize(); return taskExecu..

String 중괄호 매핑 함수 (log.info 대신 사용)

log.info() 함수와 동일한 방식으로 String 문자를 합치는 함수를 구현 사용법 String str = makeStr("{} is test {}", 1234, "abcd"); private String makeStr(String text, Object ...args){ if(StringUtils.isEmpty(text)){ return ""; } // 중괄호 쌍이 없는 경우 작업하지 않음 if(!text.contains("{}")){ return text; } StringBuilder sb = new StringBuilder(); // 중괄호 쌍으로 문자열을 나눔 String[] split = text.split("\\{}"); for (int i = 0; i < split.length; i++..

MockMvc get post 테스트

MockMvc를 통한 Get, Post 테스트 방법을 소개한다. Get // 리스트, 객체등을 쉽게 전달하기 위해서 MultiValueMap을 사용한다. MultiValueMap multiValueMap = new LinkedMultiValueMap(); multiValueMap.put("articleId", articleIdList); // 리스트 변환 없이 전달가능 MockHttpServletResponse response = mockMvc.perform( get("/data/getManageDebateList") // PathVariable 응답 URL 작성 // get("/news/detail/hotissue/{menuId}/{id}", menuId, id) .params(multiValueMap..

단위테스트시 @value 값 주입 방법

SpringBootTest 어노테이션이 없는 단위 테스트시 @value값이 주입되지 않는 경우가 발생한다. 아래 코드를 추가하면 설정파일을 자동으로 읽어와 @value에 주입한다. @ContextConfiguration( initializers = {ConfigFileApplicationContextInitializer.class} ) 예제 @SpringBootTest 미사용시 @DisplayName("Redis 기본 기능 테스트") @ActiveProfiles(profiles = "local") @ExtendWith(SpringExtension.class) @ContextConfiguration( initializers = {ConfigFileApplicationContextInitializer.cla..

SpringBoot CORS (WebMvcConfigurer 사용) 적용 방법

/* preflight Simple request가 아닌 요청 메시지보다 먼저 보내는 메시지로, 브라우저는 응답값으로 실제 데이터 전송 여부를 판단. CORS는 응답이 Access-Control-Allow-Credentials: true 을 가질 경우, Access-Controll-Allow-Origin의 값으로 *를 사용하지 못하게 막고 있다 Access-Control-Allow-Credentials: true를 사용하는 경우는 사용자 인증이 필요한 리소스 접근이 필요한 경우인데, 만약 Access-Control-Allow-Origin: *를 허용한다면, CSRF 공격에 매우 취약해져 악의적인 사용자가 인증이 필요한 리소스를 마음대로 접근할 수 있음. */ @Configuration public cla..

Spring Jsonp 관련 확인한 내용

요약 AbstractJsonpResponseBodyAdvice을 상속받아 사용하는 프로젝트는 Spring 버전을 2.0.x로 유지하거나, 버전업 이후 JSONP 응답을 직접 개발해야 레거시 시스템에서 Ajax jsopn 호출히 오류가 발생하지 않는다. (SpringBoot 2.1 부터는 JSONP 응답을 지원하지 않음, 라이브러리 또한 미지원) 내용 레거시 시스템 고도화 작업중 CORS 소스가 존재함을 확인 레거시 CORS 소스 @ControllerAdvice public class JsonpAdvice extends AbstractJsonpResponseBodyAdvice { public JsonpAdvice() { super("callback"); } } 해당 소스를 리팩토링하여 아래 코드로 변경함...

단위 테스트 작성 규칙

단위 테스트 작성시 지켜야할 3가지 규칙 규칙1. 실패하는 단위 테스트를 작성할 때까지 실제 코드를 작성하지 않는다. 규칙2. 컴파일은 실패하지 않으면서 실행이 실패하는 정도로만 단위 테스트를 작성한다. 규칙3. 현재 실패하는 테스트를 통과할 정도로만 실제 코드를 작성한다. 세 가지 규칙을 지키면, 개발과 테스트가 대략 30초 주기로 묶인다. 테스트 코드와 실제 코드가 함께 나올뿐더러 테스트 코드가 실제 코드보다 불과 몇 초 전에 나온다. 이렇게 일하면 매일 수십 개, 매달 수백 개, 매년 수천 개에 달하는 테스트 케이스가 나온다. 실제 코드를 사실상 전부 테스트하는 테스트 케이스가 나온다. 하지만 실제 코드와 맞먹을 정도로 방대한 테스트 코드는 심각한 관리 문제를 유발하기도 한다. 단위 테스트 코드 품..