본문 바로가기

개발

(11)
MacOS 컨테이너 apt-get update시 발생하는 문제 해결(Mirror sync) Openfaas 실습을 진행하다 발견한 특이한 현상과 해결 방법이라 미래의 나를 위해 남겨둔다. version: 1.0 provider: name: openfaas gateway: http://127.0.0.1:8080 functions: api: lang: python3-debian handler: ./api image: wannte/api:latest 아래의 그림처럼 apt-get update도중 Mirror sync in progress의 에러를 접하게 된다. 처음에는 python3-debian 템플릿의 문제인줄 알고 이슈를 찾아봤지만, 이와 관련된 이슈는 없었다. 해결 방법 구글링을 하다보니 이 글에서 해결책을 찾을 수 있었다. ScreenTime의 Web Content 제약조건을 Unrestri..
SpringBoot 존재하지 않는 API 요청의 응답 커스마이징하기 SpringBoot 에서 존재하지 않는 api 요청에 대한 에러메시지를 커스터마이징한 과정을 소개한다. 배경 프로젝트를 진행하면서 api의 url을 실수로 잘못 입력했을 때, 에러의 원인을 확인하지 못해 디버깅 과정에 많은 시간을 사용했다. 이런 상황에 해당하는 적절한 에러 메시지를 응답해야 한다 생각했고, 코드를 하나씩 분석하기 시작했다. DispatcherServlet 들여다보기 DispatcherServlet의 doDispatch 메소드를 확인해보면, mappedHandler가 존재하지 않은 때, noHandlerFound 메소드가 실행된다. 메소드 내부를 보면 throwExceptionIfNoHandlerFound에 값에 따라, Exception을 throw하는 지의 여부가 결정된다. 기본 설정은..
멀티 모듈 적용하기 with Gradle 이번 글에서는 프로젝트를 구성하는 데 있어 멀티 모듈 활용했을 때의 장점과 간단한 설정 방법을 알아본다. 멀티 모듈의 개념을 처음 접하는 사람들이 읽어보기를 추천한다. 멀티 모듈이란? 오라클 자바 문서에서는, 모듈을 패키지의 한 단계 위의 집합체이며, 관련된 패키지와 리소스들의 재사용할 수 있는 그룹이라고 정의한다. 운영하던 서비스를 관리자 서버(admin)와, 사용자 서버(web)를 분리하여 운영할 필요성이 있다고 해보자. 하나의 모듈로 구현을 진행한다면, 각각 별도의 프로젝트를 만들고 많은 부분의 코드를 복사+붙여넣기를 통해 구현할 것이다. Java 빌드 도구의 멀티 모듈을 사용하면, 공통된 구현(common)을 공유하는 방식으로 코드를 작성할 수 있다. 왜 멀티 모듈을 사용하는가? 코드의 중복을 줄..
SpringBoot 예외 처리에 관한 고찰 SpringBoot는 다양한 예외 처리 방법을 제공한다. 편리한 만큼 궁금증도 많이 들었던 예외처리 부분을 코드를 들춰보는 게 익숙해진 지금 파헤쳐보고자 한다. ExceptionHandler를 사용해 본 경험이 있는 독자에게 추천한다. 다양한 SpringBoot의 예외 처리 방법 SpringBoot에서 예외 처리를 하는 방법은 다양하다. 그중 자주 사용되는 방식의 3가지는 다음과 같다. Controller에 ExceptionHandler 정의 ControllerAdvice에 ExceptionHandler 정의 Exception에 ResponseStatus 어노테이션 추가 이처럼 다양한 방식의 구현을 제공한다는 것은 장점이다. 하지만, 그만큼 궁금증도 든다. 어떤 방식이 가장 우선순위가 높은지, 각 구현 ..
SpringBoot AutoConfiguration을 대하는 자세 SpringBoot의 AutoConfiguration은 정말 편리하게 의존성만 추가해주면 관련된 기능들이 모두 설정된다. 편리한 만큼 이를 커스터마이징하는 데는 주의가 필요하다. 이 글에서는 Spring AutoConfiguration의 간단한 원리를 알아보고 어떤 관점으로 바라봐야 하는지 제시한다. @SpringBootApplication @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, classes = AutoConf..
HTTP/2 프로토콜 NGINX 적용하기 HTTP/2 프로토콜의 특징과 NGINX에서의 간단한 설정 방법에 대해 알아본다. HTTP/2를 알아보기 전에, 그 이전 프로토콜인 HTTP/1.x를 먼저 알아보자. 대부분의 서버(NGINX, apache, SpringBoot ...등)는 기본설정으로 HTTP/1.1 이 적용되어 있다. HTTP/1.x HTTP/1.0 HTTP/1.0에서는 기본적으로 단기 커넥션(Short-lived connections)을 제공한다. 요청마다 커넥션을 매번 새롭게 생성하고 응답이 도착하고 연결을 닫는다. 매번 TCP 핸드 셰이크의 오버헤드가 발생한다. 하나의 커넥션 안에서, 요청에 대한 응답이 오고 난 다음에야 새로운 요청을 보낼 수 있는 구조이다. HTTP/1.1 HTTP/1.0의 다음 버전인 HTTP/1.1 에서는 ..
Pageable을 이용한 Pagination을 처리하는 다양한 방법 Spring Data JPA에서 Pageable 를 활용한 Pagination 의 개념과 방법을 알아본다. Pageable을 활용한 Pagination이 무엇인가? 많은 게시판은 모든 글을 한 번에 보여주지 않고 페이지를 나눠 쪽수별로 제공한다. 정렬 방식 또한 설정하여, 보고 싶은 정보의 우선순위를 설정할 수도 있다. 이처럼 정렬 방식과 페이지의 크기, 그리고 몇 번째 페이지인지의 요청에 따라 정보를 전달해주는 것이 Pagination 이다. 이를 개발자가 직접 구현해서 사용할 수도 있으나, JPA에서는 이를 편하게 사용할 수 있도록 Pageable 이라는 객체를 제공한다. 'page=3&size=10&sort=id,DESC' 형식의 QueryParameter를 추가로 요청을 보내게 되면..
Email 보내기에 비동기, 이벤트를 곁들인. 서비스를 운영하는 데 Email 전송 기능을 도입하는 경우가 많다. 이메일 기능에 비동기와 이벤트 발행 방식을 도입하게 된 이유와 방법에 관해서 설명해 보고자 한다. Email 보내기 Spring에서 제공하는 MailSender, JavaMailSender 인터페이스를 이용하면 쉽게 메일 서비스를 구현할 수 있다. 단순 텍스트로 구성되면 MailSender로 충분하지만, Html Template을 활용하여 메일을 보내는 것을 목표로 두기 때문에 JavaMailSender를 사용한다. 또한, 별도의 메일 서비스를 사용하지 않고 Gmail 개인 계정을 사용하고 진행하였다. 이 부분을 다루고 있는 블로그가 많으므로 코드를 남겨두고 별도의 설명은 생략한다. implementation'org.springf..