DispatcherServlet 서블릿 컨테이너의 가장 앞단에서 들어오는 모든 요청을 먼저 받아, 적합한 컨트롤러에 위임해주는 프론트 컨트롤러다. dispatch "보내다" 라는 뜻 클라이언트로부터 어떤 요청이 오면, 서블릿 컨테이너가 이 요청을 받게되고, 이 요청을 프론트 컨트롤러인 DispatcherServlet이 받아서 해당 요청을 처리할 컨트롤러(Bean)을 getBean() 메서드로 받아와서 요청에 적합한 컨트롤러의 메서드를 실행시킨다. Spring : web.xml 을 통한 매핑 web.xml Hello_servlet Hello.Hello_servlet // servlet class Hello_servlet /Hello SpringBoot : 자동 구성 SpringBoot는 아래 spring-..
마이바티스(Mybatis) SQL과 자바 객체를 매핑하는 사상에서 개발된 데이터베이스 접근용 프레임워크다. 마이바티스는 SQL 기반으로 데이터베이스 접근을 수행하는 기존 방법을 받아들이고, 규모가 큰 애플리케이션 개발에서 발생하는 과제를 해결하는 구조를 제공한다. Mybatis는 자체 Connection Pool을 가지며, 환경에 따라 사용할 DB를 설정하여 사용한다. 마이바티스 등장 애플리케이션의 규모가 커지면서 SQL이 수백개가 넘는 경우가 많아졌다. SQL 자체의 체계적인 관리 방법이나 SQL의 입출력 데이터와 자바 객체의 효율적인 변환 방법 등 스프링의 기능만으로는 해결할 수 없는 과제가 발생했다. 마이바티스 이점 SQL의 체계적인 관리, 선언적 정의(설정 파일, 어노테이션) 자바 객체와 SQL ..
Reactuve Streans를 들어가기 이전 Reactive Streams 포스팅을 들어가기전, Reactive Spring의 개념에 대해 알아야한다. 포스팅 바로가기 : devfunny.tistory.com/314?category=820617 Reactive Spring / Reactive Programming Reactive 의 예시 Reactive의 뜻은 반응형이다. 리액티브를 이해하기 위해서, 하나의 상황을 예로 들어보자. 한 어플리케이션에서 시간당 평균 약 1,000명의 사용자가 방문한다고 가정해보자. 톰캣을 devfunny.tistory.com Reactive Streams Reactive Streams란 라이브러리나 프레임워크에 상관없이 데이터 스트림을 비동기로 다룰 수 있는 공통 메커니즘..
리액티브 프로그래밍의 관찰자 패턴 관찰자 패턴은 리액티브 프로그래밍의 기초이다. 관찰자 패턴은 관찰자라고 불리는 자손의 리스트를 가지고 있는 주체(subject)를 필요로한다. 주체는 자신의 메서드 중 하나를 호출하여 관찰자에게 상태 변경을 알린다. 관찰자 패턴은 이벤트 처리를 기반으로 시스템을 구현할 때 필수적이다. MVC(Model-View_Controller) 패턴의 중요한 부분으로, 거의 모든 UI 라이브러리가 내부적으로 이 패턴을 사용한다. 관찰자 패턴의 구현 Observer(관찰자)는 Subject(주체)에 등록되고 Subject 로부터 알림을 받는다. 위에서 설명한 상태변경을 알린다. 라는 말이 이에 해당한다. Observer (관찰자) 2개 Subject (주체) 1개 Subject 인터페..
SpringBatch 사용을 위한 스프링 설정 (1) 의존성 추가 org.springframework.boot spring-boot-starter-batch (2) 스프링부트 Application 파일에 어노테이션 추가 @EnableBatchProcessing // 배치 사용을 위한 선언 @SpringBootApplication public class BatchApplication { public static void main(String[] args) { SpringApplication.run(BatchApplication.class, args); } } SpringBatch 의 Job 등록 import com.backend.batch.day01.dto.TempLibraryDto; import com...
ResponseEntity 요즘 RESTFul API 가 많이 사용되고있는데, Restful API에서 return Type으로 사용되고있는 ResponseEntity 에 대하여 알아보자. 설명 예시 HTTP 상태코드 제어 ResponseEntity.status(HttpStatus.OK).body(testVO) 결과 데이터를 body에 담아 return ResponseEntity.status(HttpStatus.OK).body(testVO) ResponseEntity는 @ResponseBody 어노테이션과 같은 의미로, ResponseEntity를 return Type으로 지정하면 JSON (default) 또는 Xml Format으로 결과를 내려준다. 200 OK 1) return ResponseEnt..
Reactive 의 예시 Reactive의 뜻은 반응형이다. 리액티브를 이해하기 위해서, 하나의 상황을 예로 들어보자. 한 어플리케이션에서 시간당 평균 약 1,000명의 사용자가 방문한다고 가정해보자. 톰캣을 웹 서버로 실행하고, 500개의 스레드로 톰캣 스레드 풀을 구성했다. 위 상황에서, 사용자 요청에 대한 평균 응답 시간은 약 0.250ms이다. 그럼 1초에 2,000명의 사용자의 요청을 처리할 수 있다. 그렇다면 평균 약 1,000명의 사용자가 들어오는 위 어플리케이션의 웹 서버는 평균 부하를 처리하기에 매우 충분하다. 요악하면 이 경우는 처리 능력을 기준으로 애플리케이션을 구성한 것이다. 그런데 만약, 특정 할인날에 폭발적인 고객 증가로 서버 부하가 발생했다고 가정해보자. 스레드 풀에 사용자 요..
Swagger 요즘 백엔드 개발은 ModelAndView 방식보다는 API 위주의 어플리케이션을 권장하고 있다. API 개발이 많아짐에 따라, 프로젝트 안의 API를 관리할 수 있는 문서가 필요해졌다. API 문서를 만들기 위해서 Swagger을 프로젝트 안에 Setting 하여 사용해보자. Swagger에는 많은 기능들이 담겨져있다. 우리는 Swagger을 사용하여 어노테이션을 통해 그 많은 기능들을 사용할 수 있다. Swagger + SpringBoot 연동 1. build.gradle 에 의존성 추가 //swagger compile "io.springfox:springfox-swagger2:2.9.2" compile "io.springfox:springfox-swagger-ui:2.9.2" 2. W..
에러발견 스프링부트 환경설정을 진행하다가 공통 에러처리를 하는데 발견한 에러였다. 404 eroor가 발생하면 내가 생성한 공통 에러처리 부분을 타야하는데 계속해서 스프링부트에서 제공하는 404 에러페이지가 나왔다. 해결방안 **.yml 파일 안에 아래 코드를 넣어주자. spring: # error 404 mvc: throw-exception-if-no-handler-found: true dispatch-options-request: false
스프링 DI (Dependency Injection)란? 자바에서 객체를 생성하기 위해서는 Test test = new Test(); 을 사용한다. new 연산자를 사용하여 인스턴스를 생성하는 행위이다. 이와 다르게, DI는 위 코드처럼 객체를 생성시키는게 아닌, 외부에서 객체를 생성해서 주입시켜주는 방식이다. DI는 필요한 객체를 해당 .java 파일 안에서 new 연산자를 통해 생성하는 것이 아닌, 외부에서 생성된 객체 중 필요한 객체를 연결하는 것이다. 필드 주입 결론적으로, 필드 주입을 사용하는 것은 추천하지 않는다. @Autowired private Mapper mapper; 위 코드를 IntelliJ IDE에서 사용하면 @Autowired 에 경고가 뜨게된다. Field injection is..
mysql에서 검색어를 찾는 select 쿼리를 알아보자 SELECT col1, col2 FROM text WHERE title LIKE CONCAT('%', #{searchText}, '%') 위 쿼리는 검색어 변수 searchText가 null이 아니고, 빈문자열("")이 아닐때 검색어 searchText를 포함하는 제목을 가진 게시글을 찾는다. if test 조건문을 사용하여 검색어가 입력되어있는지, 아닌지 확인하고 검색어가 입력되어있다면 mysql에서는 LIKE CONCAT 을 통해 해당 검색어를 포함한 데이터를 찾을 수 있다. '%'를 searchText의 앞과 뒤에 모두 적어준 이유는 아래와 같다. searchText = "게시글" 일때, AA게시글과 게시글AA를 모두 찾기위함이다.
Mybatis 실행결과 Return spring 프로젝트를 할때 serviceImpl에서 mappe파일을 호출하여 쿼리가 실행될때 이 쿼리로 인해 변경되거나 삽입되거나 삭제된 행의 개수를 가져올 수 있다. 1. count : insert된 개수가 리턴된다. int count = ExamMapper.insertUsers(); if (count < 1) { Log.info("변경사항 없음"); } 2. count : update된 개수가 리턴된다. int count = ExamMapper.updateUsers(userVO if (count < 1) { Log.info("변경사항 없음"); } 3. count : delete된 개수가 리턴된다. int count = ExamMapper.deleteUsers(i..