본문 바로가기
반응형

전체 글1065

[Spring Boot] : 인터셉터 예외 처리 인터셉터의 중복 호출을 제거한다. @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String requestURI = request.getRequestURI(); String uuid = UUID.randomUUID().toString(); request.setAttribute(LOG_ID, uuid); log.info("REQUEST [{}][{}][{}][{}]", uuid, request.getDispatcherType(), requestURI, handler); return true; } 필터는 DispatcherTyp.. 2022. 2. 25.
[Spring Boot] : 서블릿 예외 처리 필터 강의 전에 사용했던 DispatcherType에 대해 조금 더 자세히 공부했다. 요청 중 오류가 발생하게 되면 오류 페이지 출력을 위해 WAS 내부에서 다시 한 번 호출이 일어난다. 이때 필터, 서블릿, 인터셉터 또한 모두 다시 호출된다. 이때, 클라이언트로부터 발생한 호출인지 오류 페이지를 출력하기 위해 발생한 내부 요청인지 구분이 필요한데 그런 문제를 해결하기 위해 DispatcherType라는 추가 정보를 제공한다. 필터는 dispatcherType라는 옵션을 제공하는데 디폴트 값은 dispatcherType=REQUEST이다. 이 외에 여러 옵션이 있는데 내용은 아래와 같다. REQUEST : 클라이언트 요청 ERROR : 오류 요청 FORWARD : 서블릿에서 다른 서블릿이나 JSP를 호출할 때.. 2022. 2. 25.
[Spring Boot] : 서블릿 예외 처리 오류 페이지 작동 원리 강의에서 계속 반복적으로 말 하는데 서블릿은 예외가 발생해서 서블릿 밖으로 전달되거나 response.sendError()가 호출 되었을 때 설정된 오류 페이지를 찾는다. 이떄, 예외 발생과 오류 페이지 요청 흐름을 잘 이해해야 한다고 했다. 요청이 와서 컨트롤러까지 왔다가 컨트롤러에서 다시 인터셉터, 서블릿, 필터, WAS까지 오게되고 WAS에서 에러페이지를 다시 요청한다. 그럼 다시 필터, 서블릿, 인터셉터, 에러처리컨트롤러를 거쳐 뷰로 나가게 된다. 강의에서 중요하다고 말 하고 있는 부분은 클라이언트는 서버 내부에서 컨트롤러가 두 번 호출되었는지 알 수가 없다는 점이다. 서버 내부에서 오류 페이지를 찾기 위해 호출이 추가적으로 발생하게 되는 것이다. javax.servlet.error.excepti.. 2022. 2. 25.
[Spring Boot] : 서블릿 예외 처리 오류 화면 제공 기능 구현하기 서블릿이 제공하는 오류 화면 기능을 구현해 봤다. 서블릿은 Exception이 발생해서 서블릿 밖으로 전달되거나 response.sendError()가 호출되었을 때 각각의 상황에 맞춘 오류 처리 기능을 제공한다. @Component public class WebServerCustomizer implements WebServerFactoryCustomizer { @Override public void customize(ConfigurableWebServerFactory factory) { ErrorPage errorPage404 = new ErrorPage(HttpStatus.NOT_FOUND, "/error-page/404"); factory.addErrorPages(errorPage404); Comp.. 2022. 2. 25.
[TIL] : 121 일일 배움을 위한 Today I Learned ! Docker 도커 Dockerfile에 대해 공부하고 빌드 과정에 대해 공부했다. 2022.02.24 - [Server & System/Docker] - [Docker] : 도커 이미지 생성하기 2022.02.24 - [Server & System/Docker] - [Docker] : Dockerfile 작성하기 2022.02.24 - [Server & System/Docker] - [Docker] : 도커 이미지 생성 2022.02.24 - [Server & System/Docker] - [Docker] : 빌드 컨텍스트 2022.02.24 - [Server & System/Docker] - [Docker] : Dockerfile을 이용한 컨테이너 생성.. 2022. 2. 24.
[Spring Boot] : Servlet Exception, 서블릿 예외 처리 시작하기 서블릿 예외 처리 시작 강의는 항상 점진적으로 발전해온 루트를 따라가기 때문에 시작 부분에서 먼저 스프링이 아닌 순수 코드를 통해 공부를 했다. 서블릿은 Exception과 response.sendError(HTTP 상태 코드, 오류 메시지) 이 두 방식으로 예외 처리를 한다. 내부에서 오류가 발생하면 500으로 Exception을 사용하고 그게 아니라 직접 뭔가 담아서 처리하고 싶으면 response.sendError에 담아 처리하면 된다. @GetMapping("/error-ex") public void errorEx() { throw new RuntimeException("예외 발생!"); } @GetMapping("/error-404") public void error404(HttpServletR.. 2022. 2. 24.
[JavaScript 30일 챌린지] : 28일차 저번에 진행했던 동영상 속도 관련 조절하는 것을 이번에는 수직바에 마우스로 속도를 조절하는 프로젝트를 만들었다. 2022. 2. 24.
[Docker] : 캐시를 이용한 이미지 빌드 한 번 이미지 빌드를 마치고 재진행하면 이전 이미지 빌드에서 사용했던 캐시를 사용한다. vi Dockerfile2 FROM ubuntu:14.04 MAINTAINER alicek106 LABEL "purpose"="practice" RUN apt-get update Dockerfile2로 만들어 봤다. docker build -f Dockerfile2 -t mycache:0.0 ./ -f 혹은 —file 옵션으로 Dockerfile의 이름을 지정할 수 있다. 명령어를 실행하면 Using cache라는 내용과 별도 빌드 진행 과정이 생략되고 이미지가 생성이 되었다. 전에 빌드했던 Dockerfile에 같은 내용이 있다면 build 명령어는 새로 빌드하지 않고 같은 명령어 줄까지 이전에 사용한 이미지 레이어.. 2022. 2. 24.
[Docker] : Dockerfile을 이용한 컨테이너 생성과 커밋 build 명령어는 Dockerfile에 기록된 대로 컨테이너를 실행하고 완성된 이미지를 만든다. 하지만 이미지로 만드는 과정이 하나의 컨테이너에서 일어나는 것이 아니다. 이미지를 build 할 때 나오는 출력 중 Step은 Dockerfile에 기록된 명령어에 해당한다. ADD, RUN 명령어가 실행될 때마다 새로운 컨테이너가 하나씩 생성되고 이를 이미지로 커밋하게 된다. 즉, Dockerfile에서 명령어 한 줄이 실행될 때 마다 이전 Step에서 생성된 이미지에 의해 새로운 컨테이너가 생성되고, Dockerfile 적힌 명령어를 수행하고 다른 이미지 레이어로 제공된다. 이미지 빌드가 완료되면 Dockerfile의 명령어 줄 수 만큼 레이어가 존재하게 되고 중간에 컨테이너도 같은 수만큼 생성되고 삭제.. 2022. 2. 24.
[Docker] : 빌드 컨텍스트 이미지 빌드를 시작하면 도커는 가장 먼저 빌드 컨텍스트를 읽는다. 빌드 컨텍스트는 이미지를 생성하는데 필요한 각종 파일, 소스코드, 메타데이터 등을 담고 있는 데릭터리를 의미한다. Dockerfile가 위치한 디렉터리가 빌드 컨텍스트가 되는 것이다. 빌드 컨텍스트는 Dockerfile에서 빌드 될 이미지에 파일을 추가할 때 사용이 된다. Dockerfile에서 이미지 파일을 추가하는 방법은 ADD, COPY가 있다. 이 명령어들은 빌드 컨텍스트의 파일을 이미지에 추가하게 된다. 컨텍스트에 대한 정보는 이미지를 빌드할 때 맨 위에 출력이 된다. 컨텍스트는 build 명령어의 맨 마지막에 지정된 위치에 있는 파일을 전부 포함한다. Git과 같은 외부 URL에서 Dockerfile을 읽어 들인다면 해당 Rep.. 2022. 2. 24.
[Docker] : 도커 이미지 생성 이제 이미지를 빌드해 본다. build 명령어이다. -t 옵션은 생성될 이미지의 이름을 설정한다. mybuild:0.0 이라는 이름의 이미지가 생성된다. -t 옵션을 사용하지 않으면 16진수 형태의 이름으로 이미지가 저장된다. -t를 꼭 사용해주자. build 명령어 끝에는 Dockerfile이 저장된 경로를 입력하면 된다. 일반적으로 로컬에 저장된 Dockerfile을 사용하는데 외부 URL로부터 Dockerfile의 내용을 가져와 빌드할 수도 있다. 지금은 현재 디렉터리 ./ 를 입력해 주었다. 이렇게 되면 최종적으로 생성되는 이미지의 이름은 mybuild:0.0이고 여기에는 아파치 웹 서버가 설치되어 있고 컨테이너가 실행될 때 웹 서버를 실행하도록 CMD(커맨드) 설정을 했기 때문에 다른 설정 없이.. 2022. 2. 24.
[Docker] : Dockerfile 작성하기 Dockerfile에는 컨테이너에서 수행해야 할 작업을 명시하기 때문에 사용되는 명령어를 알아야 한다. 디렉터리를 생성하고 그 안에 HTML 파일을 미리 만들어 두었다. 그 안에 Dockerfile이라는 이름의 파일을 저장해 준다. 이미지에 아파치 웹 서버를 설치하고 로컬에 있는 test.html 파일을 웹 서버로 접근할 수 있는 컨테이너의 디렉터리인 /var/www/html에 복사한다. 도커 엔진은 Dockerfile을 읽을 때 현재 디렉터리에 있는 Dockerfile이라는 이름을 가진 파일을 읽는다. Dockerfile은 Empty(빈) 디렉터리에 저장하는 것이 좋은데 이미지를 빌드할 때 사용되는 Context 때문이다. 우선, FROM, RUN, ADD 기초 명령어를 우선 학습한다. Dockerfi.. 2022. 2. 24.
[Docker] : 도커 이미지 생성하기 아무것도 존재하지 않는 이미지(우분투, CentOS)로 컨테이너 생성 후 애플리케이션을 위한 환경을 설치하고 소스코드 등을 복사해 동작을 확인한다. 그리고 컨테이너를 이미지로 커밋한다. 보통은 개발한 애플리케이션을 컨테이너화 할 떄 위와 같은 방법을 떠올린다. 하지만, 이런 방법에는 장,단점이 있다. 장점으로는 동작을 확인하고 이미지화 하는 것이기 때문에 동작이 보장이 된다는 점이고 단점으로는 일일이 패키지를 수작업으로 설치해 주거나 애플리케이션이 동작하는 환경을 구성해 줘야 한다는 점이다. 도커는 이런 과정을 쉽게 기록하고 수행할 수 있는 build 명령어를 제공한다. 컨테이너에 설치해야 하는 패키지, 소스코드, 명령어, 셸 스크립트를 하나의 파일에 기록해두면 도커가 이 파일을 읽어 컨테이너에서 작업을.. 2022. 2. 24.
[TIL] : 120 일일 배움을 위한 Today I Learned ! Docker 도커 사설 레지스트리를 사용하는 방법에 대해 공부를 했는데 도커 허브 보다 확실히 어려운 것 같다. 2022.02.23 - [Server & System/Docker] - [Docker] : Docker Private Registry, 사설 레지스트리 컨테이너 생성하기 2022.02.23 - [Server & System/Docker] - [Docker] : Docker Private Registry(, 도커 사설 레지스트리에 이미지 push하기 JavaScript 30일 챌린지 가로 스크롤을 활용해보는 프로젝트였다. 2022.02.23 - [Project/JavaScript 30일 챌린지] - [JavaScript 30일 챌린지] : 27일.. 2022. 2. 23.
[Spring Boot] : ArgumentResolver 활용 @Login 어노테이션을 만들고 이게 있으면 직접 만든 ArgumentResolver가 동작해서 자동으로 세션에 있는 로그인 회원을 찾아주고 없다면 null을 반환하도록 개발하는 실습을 진행했다. @Target(ElementType.PARAMETER) //파라미터에만 사용 @Retention(RetentionPolicy.RUNTIME) //리플렉션 등 활용할 수 있게 런타임까지 어노테이션 정보가 남는다. public @interface Login { } @Login 어노테이션을 생성해 주었다. 주석을 참고하면 된다. @Slf4j public class LoginMemberArgumentResolver implements HandlerMethodArgumentResolver { HandlerMethodAr.. 2022. 2. 23.
[코딩&리뷰] 스터디 8회차(마지막) 스터디 마지막 회차가 마무리 되었다. 마지막 회차까지 아쉽게도 한 쌤이 바쁘셔서 참여를 못 하시고 3명에서 진행하게 되었다. 우리의 스터디 행적은 아래 링크에서 확인이 가능하다. 좋은 사람들과 좋은 시간을 보내게 되어 너무 좋았다. 이제 개강을 하고 나면 아마 주말 스터디를 진행하게 되지 않을까 싶다. https://ohju96.notion.site/590ee7cb5a454c07973c31a296974781 🧑🏻‍💻[모각코] : 코딩 & 리뷰 스터디 ! 모여서 각자 코딩을 기본으로 하는 코딩&리뷰 스터디 ohju96.notion.site 2022. 2. 23.
[Spring Boot] : 스프링 인터셉터 - 인증 체크 스프링 인터셉터 - 인증 체크 전 강의에서 서블릿 필터로 개발한 부분을 스프링 인터셉터로 바꾸어 개발하는 실습을 진행했다. public class LoginCheckInterceptor implements HandlerInterceptor { HandlerInterceptor를 구현한다. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 여러 기능이 있지만 그 중에 preHandle만 사용하면 된다. String requestURI = request.getRequestURI(); log.info("인증 체크인터셉터 실행 {}", requestUR.. 2022. 2. 23.
[Spring Boot] : 스프링 인터셉터 - 요청 로그 String uuid = UUID.randomUUID().toString(); 요청 로그를 구분하기 위해 uuid를 생성해 주었다. //@RequestMapping: HandlerMethod //정적 리소스 : ResourceHttpRequestHandler if (handler instanceof HandlerMethod) { HandlerMethod hm = (HandlerMethod) handler; //호출할 컨트롤러 메서드의 모든 정보가 포함되어있다. } HandlerMethod는 어떤 핸들러 매핑을 사용하는가에 따라 달라진다. @controller와 @RequestMapping을 통한 핸들러 매핑을 주로 사용하는데 이 경우 핸들러 정보로 HandlerMethod가 넘어온다. @Configura.. 2022. 2. 23.
[Spring Boot] : 스프링 인터셉터 스프링 인터셉터 소개 스프링 인터셉터는 서플릿 필터와 같이 웹과 관련된 공통 관심 사항을 효과적으로 해결할 수 있는 기술이다. 서블릿 필터는 서블릿이 제공하고 스프링 인터셉터는 스프링 MVC가 제공하는 기술이다. 스프링 인터셉터는 디스패쳐 서블릿과 컴트롤러 사이에서 컨트롤러 호출 직전에 호출이 된다. HTTP 요청 → WAS → 필터 → 서블릿 → 스프링 인터셉터 → 컨트롤러 //로그인 사용자 HTTP 요청 → WAS → 필터 → 서블릿 → 스프링 인터셉터 → 적절하지 않은 요청이라 판단해서 컨트롤러 호출 X //비로그인 사용자 이렇게 동작하게 된다. 스프링 인터셉터도 서블릿 필터처럼 체인으로 구성할 수 있다. 뭔가 서블릿 필터와 비슷해 보이지만 사실 더 편하고 정교하고 다양한 기능을 제공한다고 하는데 .. 2022. 2. 23.
[JavaScript 30일 챌린지] : 27일차 세로 스크롤이 아닌, 가로 스크롤을 통해 내용을 확인할 수 있는 프로젝트였다. 그냥 스크롤 뿐만 아니라 클릭후 드래그하는 방식으로도 페이지를 이동시킬 수 있었다. 2022. 2. 23.
[Docker] : Docker Private Registry(, 도커 사설 레지스트리에 이미지 push하기 사설 레지스트리에 이미지 Push하기 도커 허브의 저장소를 사용할 때 썼던 이미지를 레지스트리에 올려본다. docker tag ohju96-image:0.0 ${DOCKER_HOST_IP}:5000/ohju96:0.0 docker tag ohju96-image:0.0 192.168.228.134:5000/ohju96:0.0 명령어를 입력해 이미지의 이름을 추가한다. ${DOCKER_HOST_IP}에는 레지스트리 컨테이너를 생성한 도커 호스트 IP를 입력하면 된다. docker push 168.192.229.134:5000/ohju96-image:0.0 레지스트리 컨테이너에 이미지를 올리는 명령어이다. 도커 허브에서 이미지를 push할 때와 같다. vi /etc/default/docker 시작 옵션에 OP.. 2022. 2. 23.
반응형