반응형

Server 22

[Spring] Reactive programing: WebFlux, WebClient

이전 포스팅에서 비동기 처리를 하게 될 경우 non blocking 하게 servlet thread를 사용하는 방법에 대해서 살펴보았습니다. 하지만 여전히 문제가 남아있는 부분이 존재합니다. 바로 비동기 처리를 하는 worker thread입니다. worker thread가 만약 또 다른 서비스의 API를 호출하게 된다면 servlet thread는 반환되었지만 worker thread는 api 응답이 올 때까지 blocking 되어 대기상태가 되어야 합니다. Spring 4.0에선 이러한 문제를 AsyncRestTemplate을 사용해서 해결할 수 있었습니다. implementation("org.springframework.boot:spring-boot-starter-webflux") val async..

[Spring] 비동기 처리시 blocking 되는 servlet thread 관리

Tomcat에서의 IO는 HttpServletRequest와 HttpServletResponse를 사용하고 있고, 이 둘은 InputStream과 OutputStream을 구현하고 있습니다. 즉 IO가 이루어질 때마다 blocking이 발생한다는 뜻입니다. tomcat에서 NIO connector가 구현된 이후부터 connection을 nonblocking하게 맺고 있지만, 결국엔 servlet을 실행하는 순간 servlet thread가 필요로 하기 때문에 근본적인 문제의 해결책이 되지 않습니다. 서버에서 일어나는 작업들, 흔히 req - logic - res가 이루어질 때 빠르게 thread가 작업을 처리하고 pool로 반납하면 이러한 방식도 문제가 되진 않습니다. 다만 최근 많이 가져가고 있는 MS..

[Spring] Spring Batch: 대용량 데이터를 처리하는 프레임워크

Spring Batch란? 스프링 배치란 대용량의 데이터를 클라이언트와 소통하지 않고 애플리케이션 단독으로 처리하는 작업에 특화된 프레임워크를 이야기합니다. 스프링 프레임워크를 기반으로 개발되었기 때문에 기존의 DI, AOP, 서비스 추상화 등과 같은 Spring 프레임워크의 특징들을 그대로 사용할 수 있습니다. 또한 배치 애플리케이션은 일반 API 웹 애플리케이션과 달리 API를 통해 통신하지 않고 스스로 일하며, 중간에 실패를 하게 되더라도 실패한 부분부터 다시 실행할 수 있다는 장점이 있습니다. 스프링 배치의 특징은 아래와 같습니다. 대용량 데이터: 배치 애플리케이션은 대량의 데이터를 가져오거나, 전달하거나, 계산하는 등에 최적화되어 고성능을 발휘합니다. 자동화: 심각한 문제 해결을 제외하고는 사용..

[Spring] Reactive Spring WebFlux: Tomcat과 Netty

Spring MVC는 기본적으로 블럭킹이고 동기방식을 사용합니다. 비동기 처리 기능이 스프링 프레임워크 3에서 추가되어 지원된다고 하지만, 서블릿은 응답을 기다리는 동안 pool의 스레드들은 여전히 지연시킬 수 있기 때문에 전체 stack이 reactive 해야 하는 요구를 충족시킬 수 없습니다. 이러한 요구사항에 맞추어 스프링 프레임워크5에 도입된 대안적인 모듈이 바로 WebFlux로써 웹 요청을 reactive 하게 다루는 데에 초점이 맞추어져 있습니다. 기존의 서블릿 기반의 Spring Boot는 Tomcat을 기반으로 동작합니다. 반면 Spring Boot WebFlux는 여러 가지를 고를 수 있는데 Default롤 Netty를 사용합니다. Netty를 사용하는 이유는 tomcat은 요청 당 하나..

[Spring] Bean Scope와 Bean Life Cycle

스프링에서는 Bean으로 지정된 객체는 기본적으로 싱글톤 객체로 관리하게 됩니다. 하지만 요구사항에 따라 싱글톤이 아닌 방법으로 빈을 구성해야 하는 경우가 있는데, 이와 같은 경우를 명시적으로 구분하기 위해 스프링에서는 scope라는 키워드를 사용합니다. 빈 스코프 Spring에서 별도의 설정을 하지 않을 경우 default bean scope는 singleton으로 구성됩니다. singleton : 스프링 default bean scope prototype : 애플리케이션 요청시 ( getBean() 메서드가 호출될 때마다) 스프링이 새 인스턴스를 생성합니다. request : HTTP 요청별로 인스턴스화 되며 요청이 끝나면 소멸됩니다. session : HTTP 세션별로 인스턴스화 되며 세션이 끝나면..

[Spring] iBatis/MyBatis: 쿼리 return결과

이번에 외주 개발로 어쩌다보니 sql mapper로 iBastis를 사용하게 되었는데, 개발 툴이 이클리스라(정말 쓰고 싶지 않았다) 자동완성도 대부분 지원되지 않을 뿐더러, 쿼리 결과를 매번 기억하고 예측하기 힘들어 자료를 찾던 중 좋은 레퍼런스가 있어서 참고하여 정리해 둡니다. 표에서 알 수 있듯이 iBatis 또는 Mybatis로 쿼리를 매핑할 경우, 해당 쿼리에 따른 리턴 결과가 다른데, 이를 이용해 예외처리나 비즈니스 로직 개발에 활용할 수 있습니다. iBatis MyBatis SELECT SELECT문의 결과를 리턴 SELECT문의 결과를 리턴 INSERT NULL 1 (다중 INSERT도 같음) UPDATE 1 UPDATE된 행의 개수를 리턴 (없으면 0) DELETE DELETE된 행의 개..

[Spring] Spring MVC: Controller return 타입

이번 포스팅에서는 spring controller의 리턴 타입에 대해서 살펴보도록 하겠습니다. 처음 스프링 부트를 배우기 시작했을 때 @RestController 애노테이션을 사용했기 때문에 줄곧 json 타입으로 return을 해왔는데, 우연히 외주 프로젝트를 하며 다른 리턴 타입들을 알게 되었고, @RestController가 어떤 애노테이션인지와 MVC에 대한 이해를 좀 키울 수 있었습니다. String Spring + View template을 사용할 때 흔히 사용하는 타입입니다. @GetMapping("/test") public String test(Model model) { model.addAttribute("data", data); return "/test/data"; } Model 안에 데..

[Spring] Spring 4.3: @RequestMapping, @GetMapping, @PostMapping

Spring 4.3부터 Spring MVC 컨트롤러 메서드 새로운 애노테이션이 5가지 추가되었습니다. 이전에는 @RequestMapping 애노테이션 하나만을 사용하여 method를 바꿔주는 형태로 http method를 매핑했었습니다. @RequestMapping(value="/test", method=RequestMethod.GET) 코드의 길이가 길어지고 직관적으로 어떤 HttpMethod인지 알 수 없어 불편했는데, 새롭게 추가된 애노테이션을 사용하면 좀 더 직관적으로 코드를 작성할 수 있습니다. 아래는 새롭게 추가된 애노테이션입니다. @GetMapping("/test") @PostMapping("/test") @PutMapping("/test") @DeleteMapping("/test") @Pa..

[Spring] Spring MVC: Controller에서 parameter를 받아오는 방법

Spring Controller에서 데이터를 받아오는 방법에 대해서 살펴보겠습니다. httpServletRequest.getParameter() @RequestMapping("/test") public String test(HttpServletRequest req) { String userId = req.getParameter("userId"); return "test"; } getParameter()는 String 값을 반환합니다. httpServletRequest.getAttribute() @RequestMapping("/test") public String test(HttpServletRequest req) { String userId = req.getParameter("userId"); retur..

[Spring] DI? IoC Container? Bean? 숲을 보는 게시물

스프링은 꽤나 진입장벽이 높은 프레임워크이다. 그 자체의 개념은 그리 어렵지 않으나 엔터프라이즈용으로 흔히 사용되는 프레임워크이다 모니, 굉장히 다양한 용어들이 있고, 숲이 아닌 나무를 보는 공부 방식은 자칫 모두를 이해하지 못하는 오류를 범할 수 있다. DI와 IoC Container도 그러하다. DI를 알기 위해선 Design Pattern이 무엇인지 알아야 하고, 왜 spring은 Singleton Pattern을 채택하고 있는지에 관한 연결된 부분들을 이해해야 한다. 이 포스티에서는 이러한 개념들을 자세히 다루지는 않을 것이다. 다만 숲을 보는 느낌으로 가볍게 읽어봐주었으면 한다. DI(Dependency Injection)와 IoC(Inversion of Control)는 스프링 공부를 하게 되..

반응형