본문 바로가기

Spring/Spring

(32)
Spring MVC의 핵심 객체 DispatcherServlet에 대한 모든 것(DispatcherServlet이 하는 역할 정리, 동작 프로세스) DispatcherServlet 스프링 MVC는 모든 요청(Request)을 받아 실제 작업은 다른 컴포넌트로 위임하는 DispatcherServlet 을 두어 프론트 컨트롤러 패턴으로 디자인되었습니다. DispatcherServlet 은 Servlet 사양에 맞게 선언되어야 하고 매핑되어야 합니다. 스프링에서는 web.xml 파일에 정의하고, 요새는 스프링과 스프링부트에서는 자바 설정을 사용해서 정의합니다. 결과적으로, DispatcherServlet 은 스프링 설정을 사용하여 위임할 컴포넌트를 찾습니다. (해당 컴포넌트는 Request Mapping, View Resolution, Exception handling, ...의 작업을 합니다.) 아래 코드는 자바 스프링 설정을 이용한 Dispatcher..
Spring Environment 스프링 애플리케이션의 환경에 접근하여 설정 값을 얻어오는 방법(feat. ApplicationContext의 다른 기능, profiles, @Profile) Environment 스프링(Spring)에서 제공하는 인터페이스 중 Environment에 대해서 알아볼 예정이다. Environment 는 말 그대로 스프링 환경이자 설정과 관련된 인터페이스다. (구글에 검색하면 Environment의 동의어로 Setting이 있다.) 어떤 환경 설정에 접근할 수 있는 인터페이스일까? 바로 Profiles 설정과 Property 설정에 접근할 수 있다. 아까부터 포스트의 제목을 포함해서 자꾸 접근한다고 하는데, 그 이유는 설정 값을 변경하는 건 불가능하고 접근해서 값을 가져올 수만 있기 때문이다. (ConfigurableEnvironment 인터페이스로 캐스팅하여 설정 값을 추가할 순 있지만 Environment 인터페이스로는 불가능하다.) ApplicationCon..
Servlet에 대한 개념없이 스프링을 했네요? (급하게 알아보는 스프링 기반 기술 Servlet, Servlet Context, Application Context, ...) 급하게 알아보는 스프링 기반 기술 이름은 아주 거창하게 "스프링 기반 기술" 이라고 지어봤습니다. 배경 최근에 첫 이직을 했습니다. 낯설기도하고 약간의 긴장감과 약간의 두려움이 합쳐져서 우당탕탕(?)하고 있습니다. 그러다가 이제 회사 프로젝트(소스 코드)를 좀 보려고하니, 스프링(Spring)이었습니다. 스프링부트(Springboot)를 써왔어서 큰 거부감은 없었기때문에 볼 만 하겠지 했는데... 음? Servlet, ServletContext, ApplicationContext, ContextLoaderListener, ... 다양한 ~Context의 향연이 펼쳐지며 아차 싶었습니다. 스프링부트에서도 자바 소스(Java Config)로 설정을 했었지만 Servlet으로 자바 소스 설정을 하니까 기본기(..
스프링 부트 애플리케이션에서 초기화 코드를 넣는 3가지 방법 (by 토비님) 스프링 부트에서 초기화 코드를 넣는 3가지 방법 이 포스트는 토비님의 유튜브 강의를 보고 내용을 정리한 포스트입니다. (출처 : https://www.youtube.com/watch?v=f017PD5BIEc) 위의 영상을 보면서 같이 공부하기 어려운 경우(시간이 없거나 집중하기 어려운 경우..?)에 제 글을 가볍게 참고하시면 좋을 것 같습니다. 배경 스프링부트 애플리케이션이 시작할 때 백그라운드에서 굉장히 많은 스프링 빈(Bean)들이 만들어지고 그 외에 스프링 컨테이너가 초기화하는 과정이 진행된다. 여기서 하고자 하는 것은 앞서 언급한 모든 작업을 마치고 나서 "초기화 코드"를 넣어야 하는 경우에 어떤 방법이 있을까에 대한 것이다. 내가 만든 스프링 부트 애플리케이션이 정상적으로 실행이 완료되면, 모니..
Controller 1개가 어떻게 수 많은 Request를 처리하는가? (spring mvc, tomcat thread, singleton bean) Controller 1개가 어떻게 수 많은 Request를 처리하는가 배경 의식의 흐름 Controller는 한 개인가? 지금와서 생각하면 조금 바보같았지만, 저런 질문이 떠오른 이유는 아래와 같습니다. 스프링에서 웹 애플리케이션을 개발할 때, (대부분의 경우에) 스프링 빈(Bean)으로 객체를 생성합니다. Bean의 스코프를 prototype으로 변경하면 HTTP Request 마다 해당 빈을 새롭게 생성해서 처리하도록 할 수 있지만, 그렇게 하는 경우를 거의 본 적이 없습니다. 그러면 내가 만든 Controller(Bean) 하나가 1만 개의 요청이든 10만 개의 요청이든 처리를 한다는 얘긴데, 이게 감당가능한가? 이런 생각이 갑자기 스쳐지나가면서 의문이 생겼습니다. 혹시 여러 컨트롤러가 만들어지는 ..
스프링 부트에서 Request 유효성 검사하는 방법, 서버 개발한다면 꼭 해야하는 작업 Spring Validation 스프링부트에서 Request로 오는 객체(DTO)를 어떻게 검증하는가에 대한 이야기 데이터 검증(validation)은 여러 계층에 걸쳐서 발생하는 흔한 작업이다. 어떻게하면 깔끔하게 유효성 검사를 할 수 있을지 생각해보고 얻은 방법을 공유하고자 한다. 스프링에서 가장 기본적인 validation은 Bean validation이다. Bean validation Bean validation은 클래스 "필드"에 특정 annotation을 적용하여 필드가 갖는 제약 조건을 정의하는 구조로 이루어진 검사다. validator가 그 클래스로 생성된 객체의 유효성 여부를 확인한다. 어떠한 비즈니스적 로직에 대한 검증이 아닌, 객체 자체의 필드에 대한 검증을 한다. 예제 코드를 보고 테스트해본다. plugins { ..
Jackson custom serializer, deserializer 적용했던 사례 공유, LocalDateTime JSON 파싱하는 방법 Jackson custom serializer, deserializer example JSON은 프로그래밍에서 굉장히 많이 쓰이는 데이터 포맷이다. 특히 스프링부트를 이용한 프로젝트에서는 'spring-boot-starter-web'을 dependency에 추가하기만 하면 jackson이라는 json 라이브러리가 자동으로 추가될 정도다. 심지어 jackson이 제공해주는 objectMapper 객체는 스프링 빈으로 제공하기까지 한다. 그러나 이렇게 기본 제공해주는 objectMapper 객체의 경우, 그냥 사용하기에는 모든 요구사항을 충족하기 어렵다. 요구 사항을 충족시키시 위해서는 Object to JSON(Serialize/직렬화), JSON to Object(Deserialize/역직렬화)를 입맛에..
REST API 응답은 어떻게 줘야할까? (표준 Response 객체를 만들 수 있을까?, 정확하게 응답 처리를 하는 방법, 성공과 실패 응답) - 왜 이런 생각을 하였는가? 필자가 쓰는 Vue 프레임워크에서 axios라는 HTTP client 라이브러리가 있다. 해당 라이브러리에서 HTTP 요청에 성공했을 때는 왜 "response.data"에 http reponse의 body 값이 들어가고, HTTP 요청에 실패했을 때는 왜 "error.response"에 body내용이 들어가는지가 궁금했다. HTTP 요청에 성공했든 실패했든 모든 응답은 response라고 하고 body 내용이면 "repsonse.body"로 통일하면 되는거 아닌가? 하는 생각이 들었다. //success { "payload" : "~~~~", "error" : null } //fail { "payload" : null, "error" : { "message" : "Not ..