Language`/Spring(21)
-
[Spring] Spring Transaction
자바에서 DB에 접근하기 위해서는 "JDBC API"를 활용해서 DB에 접근할 수 있다 간단하게 DB에 접근해서 데이터를 받아오는 과정을 설명하면 다음과 같다 1. DB Connection 얻기 2. DB에 보낼 쿼리를 생성하고 Statement or PreparedStatement를 통한 쿼리 flush 3. DB에 쿼리를 보내고 그에 따른 결과 데이터들을 ResultSet을 통해서 받기 4. ResultSet에 담긴 쿼리 결과 데이터들을 원하는 형태로 parsing해서 사용 여기서 또 DB에 접근하는 방식은 3가지로 나눌 수 있다 1. 순수 JDBC 순수한 Native Query를 생성해서 DB로 날리고 그에 대한 결과를 parsing해서 사용하는 방식이다 순수 JDBC API 사용 1. SQL 생성..
2022.08.03 -
[Spring] API 예외 처리
[Spring] 예외 처리 & 오류 페이지 Servlet 예외 처리 1. Exception Exception은 중간에서 "catch"를 통해서 잡을 수 있고, 아니면 계속 "throws"를 통해서 던질 수 있다 웹 애플리케이션은 Request마다 별도의 thread가 할당되고 이 thread는 서블.. cs-ssupport.tistory.com 이전에는 예외가 발생했을 때 "오류 페이지"를 Client에게 내려주는 여러 방법들을 알아보았다 예외가 터지면 WAS에서 다시 "오류 페이지를 위한 REQUEST"를 보낸다 이 때 Request의 DispatcherType은 "ERROR" 하지만 서버가 앱 개발자와 통신을 하거나, 프론트엔드 API형식의 통신을 할 경우는 예외 처리가 달라진다 왜냐하면 이러한 AP..
2022.07.12 -
[Spring] 예외 처리 & 오류 페이지
Servlet 예외 처리 1. Exception Exception은 중간에서 "catch"를 통해서 잡을 수 있고, 아니면 계속 "throws"를 통해서 던질 수 있다 웹 애플리케이션은 Request마다 별도의 thread가 할당되고 이 thread는 서블릿 컨테이너 내부에서 수행된다 그런데 갑자기 예외가 터졌는데 이 예외를 잡지 않고 계속 throw를 하다가 결국 서블릿 외부까지 넘어간다면 어떻게 동작될까?? >> 최종적으로 WAS까지 전파된다 예외를 전파받은 WAS는 뒤에 설명하겠지만 예외 페이지를 Client에게 보여주기 위해서 "예외 전용 Request"를 또 다시 컨트롤러에게 요청한다 간단한 예제를 통해서 정상 흐름과 예외가 터졌을 때의 흐름을 살펴보자 LogFilter @Slf4j public..
2022.07.11 -
[Spring] 스프링 인터셉터
[Spring] Servlet "Filter" 현재 Controller에 의해서 매핑되는 Page가 다음 종류가 있다고 하자 1. 로그인 하지 않고 접근 가능 2. 로그인 해야 접근 가능 >> 여기서 과연 "로그인 해야 접근 가능한 페이지"가 진짜 로그인을 해야 cs-ssupport.tistory.com 이전에는 서블릿에서 제공해주는 "서블릿 필터"를 통해서 Request에 대한 필터링을 해주었다 이번에는 Spring에서 제공해주는 "스프링 인터셉터"를 알아보자 서블릿 필터 & 스프링 인터셉터 모두 웹과 관련된 "공통 관심 사항"을 처리하지만 적용되는 순서도 다르고 적용되는 방법또한 약간 다르다 Spring Interceptor Servlet Filter는 서블릿이 호출되기 전에 수문장 역할을 수행했지만..
2022.07.10 -
[Spring] 서블릿 필터
현재 Controller에 의해서 매핑되는 Page가 다음 종류가 있다고 하자 1. 로그인 하지 않고 접근 가능 2. 로그인 해야 접근 가능 >> 여기서 과연 "로그인 해야 접근 가능한 페이지"가 진짜 로그인을 해야만 접근 가능한지 확인해보자 /members/1로 접근 결과로 알수있듯이 "로그인 후 전용 마이페이지"가 로그인을 하지 않은 사용자에게도 접근이 허용되고 있다 >> "URL"에 따라서 request를 필터링할 수 있게 도와주는 기능을 Servlet에서 제공해준다 : Servlet Filter Servlet Filter Servlet Filter는 Servlet이 제공해주는 "Request Filtering" 기능이고 일단 필터의 흐름부터 알아보자 Servlet Filter는 수문장 역할을 수행..
2022.07.10 -
[Spring] Session
[Spring] Cookie HTTP는 Stateless한 프로토콜이므로 이전에 보낸 Request에 대해서 기억하지 못한다 이러한 Stateless한 특징을 해결하기 위해서 "쿠키"라는 개념을 활용한다 예를 들어서 로그인을 한다고 하자 어떤 사 cs-ssupport.tistory.com "쿠키"는 HTTP의 Stateless로 인해 탄생한 "유지를 위한 수단"이다 쿠키를 통해서 중요한 정보를 보관할 수 있고 쿠키를 통해서 Client & Server간에 인증을 간편하게 할 수 있었다 하지만 쿠키에는 여러가지 보안 이슈가 존재한다 가장 대표적인 보안 이슈는 쿠키에 Client의 중요 정보가 담길 수 있다는 것이다. 따라서 이러한 보안 이슈를 해결하려면 "중요한 정보들은 모두 서버에 저장"해야 하고 Cli..
2022.07.08 -
[Spring] Cookie
HTTP는 Stateless한 프로토콜이므로 이전에 보낸 Request에 대해서 기억하지 못한다 이러한 Stateless한 특징을 해결하기 위해서 "쿠키"라는 개념을 활용한다 예를 들어서 로그인을 한다고 하자 어떤 사용자가 "A-1"라는 페이지에서 로그인을 하고나서 "A-2" 페이지로 이동하였다고 하자 stateless한 HTTP 특징에 의하면 A-2 페이지에서도 로그인을 유지하려면 query parameter를 통해서 로그인 정보를 유지해야 한다 여기서 이러한 상태 유지를 위해서 "쿠키"를 사용하는 것이다 Cookie 쿠키에는 2가지 종류가 존재한다 세션 쿠키 : 브라우저가 종료되면 사라지는 쿠키 영속 쿠키 : 브라우저가 종료되어도 "지정한 만료일"까지 유지되는 쿠키 기본적인 쿠키 로그인 테스트를 위해..
2022.07.07 -
[Spring] 검증(Validation) 2. Bean Validation
[Spring] 검증(Validation) 1. 직접 구현하기 MVC 패턴에서 Controller는 request로 들어온 URL에 대한 처리도 하지만, HTTP Request 자체가 정상인지 "검증"하는 역할도 수행한다 물론 Front쪽에서 검증을 할 수 있지만, 이는 Client가 의도적인 조작을 통 cs-ssupport.tistory.com 앞에서 검증 기능을 직접 작성함으로써 객체에 대한 검증을 하였다 그런데 검증 기능을 매번 코드로 작성하려면 엄청난 시간과 노력을 투자해야 한다 그리고 대부분의 검증 로직은 {빈 값인지 아닌지 / 특정 크기를 넘는지 아닌지 / ...} 등 매우 일반적인 로직이다 이러한 검증 로직을 모든 프로젝트에 적용할 수 있게 공통화하고, 표준화 한 것이 바로 "Bean Val..
2022.07.03 -
[Spring] 검증(Validation) 1. 직접 구현하기
MVC 패턴에서 Controller는 request로 들어온 URL에 대한 처리도 하지만, HTTP Request 자체가 정상인지 "검증"하는 역할도 수행한다 물론 Front쪽에서 검증을 할 수 있지만, 이는 Client가 의도적인 조작을 통해서 우회해서 접근할 수 있기 때문에 Front쪽에서 1차 검증을 한 후, 2차적으로 Server에서 검증을 해야 한다 BindingResult BindingResult를 활용하면 request로 들어온 data에 대한 오류를 간단하게 담을 수 있고 model을 통해서 자동으로 넘겨줄 수 있다 BindingResult가 "없다면" 400 error가 발생하면서 컨트롤러 자체가 호출되지 않는다 반면에 BindingResult가 "있다면" 오류 정보를 BindingRes..
2022.07.03 -
[Spring] Handler Adapter / Argument Resolver / HTTP Message Converter
요청 매핑 핸들러 어댑터 (RequestMappingHandlerAdapter) [Spring] HTTP 메시지 컨버터 뷰 템플릿으로 HTML을 생성해서 response하는게 아니라, HTTP API처럼 JSON형식의 데이터를 HTTP Message Body에 읽거나 쓸 경우 "HTTP 메시지 컨버터"를 사용하면 손쉽게 body의 데이터를 조작할 수 있다 JSON뿐 cs-ssupport.tistory.com 그러면 앞에서 설명한 HTTP 메시지 컨버터는 도대체 스프링 MVC 구조 어디서 사용되는 걸까?? 전형적인 스프링 MVC 구조에서는 HTTP 메시지 컨버터가 사용되는 부분을 찾을 수가 없다 그러면 여기서 {핸들러 어댑터 - 핸들러}부분을 더 자세히 살펴보자 Argument Resolver 사실 {핸들..
2022.06.12 -
[Spring] HTTP 메시지 컨버터
뷰 템플릿으로 HTML을 생성해서 response하는게 아니라, HTTP API처럼 JSON형식의 데이터를 HTTP Message Body에 읽거나 쓸 경우 "HTTP 메시지 컨버터"를 사용하면 손쉽게 body의 데이터를 조작할 수 있다 JSON뿐만 아니라 Message Body의 내용을 HTTP 메시지 컨버터가 알아서 binding을 해준다 스프링 MVC의 경우 다음 경우에 HTTP 메시지 컨버터를 적용한다 @RequestBody HttpEntity(RequestEntity) @ResponseBody HttpEntity(ResponseEntity) HTTP 메시지 컨버터 Interface HTTP 메시지 컨버터 Interface 내부 메소드에는 총 4가지가 존재한다 (1) canRead / canWri..
2022.06.12 -
[Spring] 스프링 MVC 구조
서블릿이나 JSP를 통해서 "비즈니스 로직 & 뷰 렌더링" 전부를 처리하면 너무 많은 역할을 담당하게 되고 결국 유지보수가 굉장히 어려워진다 >> MVC 패턴의 탄생 MVC : Model View Controller Controller Client의 HTTP Request를 받아서 1) 파라미터를 검증하고, 2) 비즈니스 로직을 실행 그리고 View에 전달할 결과 데이터들을 Model에 담는 역할까지 수행한다 Model View에서 사용할 데이터를 담아두는 저장소 개념이다 Model덕분에 View는 {비즈니스 로직 / 데이터 접근}을 전혀 상관하지 않고 오직 뷰 렌더링에만 집중할 수 있다 View Controller가 도출해낸 데이터들을 담은 Model을 활용해서 뷰 렌더링에 집중한다 "여기서 Sprin..
2022.06.11