1. 문제https://www.acmicpc.net/problem/17132. 코드문제 푸는 것에 지쳐서 설명은 주석으로 대체한다..import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.Arrays;import java.util.HashMap;import java.util.Map;public class Main { static int N; static int M; static int[] persons; // 입력으로 받은 사람 번호 static Map pickPersons; // 사진이 등록된 사람, static int[] pickPers..
@Valid Controller로 넘어오는 데이터를 검증하는 데 사용할 수 있다. 예를 들어, API를 호출할 때 user의 id를 반드시 전달해야 할 경우 @NotNull(message = "사용자의 id는 필수 정보입니다.")와 같이 검증 조건을 추가할 수 있다. @Getter public class FindSectionCountRequestDto { @NotNull(message = "회고 보드 ID는 필수 입력 값입니다.") private Long retrospectiveId; @NotNull(message = "템플릿 섹션 ID는 필수 입력 값입니다.") private Long templateSectionId; } Controller에서 API를 호출할 때 위에서 정의한 dto를 받는다. 위에서..
본 글은 다크모드에 최적화되어 있습니다. 스프링에는 데이터 접근 계층(Repository)에서 사용하는 JdbcTemplate과 서비스 계층(Service)에서 사용하는 TransactionTemplated 이 존재합니다. 특별한 기능을 제공하는 것은 아니고 템플릿 콜백 패턴을 사용하여 반복되는 코드를 제거해 줍니다. JdbcTemplate JdbcTemplate은 데이터 접근 계층에서 DB에 접근할 때 반복되는 코드를 제거해 줍니다. 반복되는 코드란 아래의 목록들을 말합니다. 커넥션 조회 및 동기화 PreparedStatement 생성 및 파라미터 바인딩 쿼리 실행 ResultSet으로 결과 바인딩 예외 발생 시 스프링 예외 변환기(DataAccessException) 실행 리소스 종료 위의 목록들 중..
클라이언트-서버 간의 통신 클라이언트와 서버 간에 통신에는 HTML을 통한 통신도 있지만 API를 통한 통신도 존재한다. 스프링에서 API 통신을 할 때 예외가 서블릿에서 별도로 처리되지 않으면 WAS로 예외를 넘겨주면서 500 에러를 발생시킨다. 여기서 문제점은 WAS로 넘어간 예외는 항상 500 에러를 발생시키기 때문에 각 상황에 맞는 예외처리가 되지 않는다. (404 에러를 발생시키고 싶은데 500 에러로 처리됨 등) 위 그림을 보면 핸들러에서 발생한 예외가 서블릿(스프링에서는 디스패처 서블릿)으로 넘어가게 되는데 서블릿에서 해당 예외를 별도로 처리하는 로직이 존재하지 않는다면 WAS로 예외를 넘겨버린다. WAS로 넘어간 예외는 말했듯이 500 에러를 발생시킨다. API 마다 다르게 예외 처리 위의..
내가 겪은 문제 WAS로 예외 또는 sendError가 전송되었을 때, 해당 에러를 처리할 예외 페이지를 등록했음에도 서블릿의 기본 예외 페이지가 보였다. 예외 페이지 등록 public class WebServerCustomizer implements WebServerFactoryCustomizer { @Override public void customize(ConfigurableWebServerFactory factory) { ErrorPage errorPage400 = new ErrorPage(HttpStatus.BAD_REQUEST, "/error-page/400"); ErrorPage errorPage404 = new ErrorPage(HttpStatus.NOT_FOUND, "/error-page..