본문 바로가기

legacy/Spring

(60)
[Spring-Error] Field Error 오류, 객체 바인딩 문제 문제 발생 BindingResult에 필드 오류를 저장하여 View에 오류를 출력하려고 했는데 오류가 발생했다. 일단 코드를 확인하자. LoginUser @Data public class LoginUser { private String loginId; private String loginPassword; public LoginUser() { } } Controller @GetMapping("/login") public String login(Model model) { model.addAttribute("user", new LoginUser()); return "/login"; } @PostMapping("/login") public String loginCheck(LoginUser user, Bindin..
[Spring-Error] Global Error 출력이 안되는 문제 문제 발생 회원가입 로직에 BindingResult를 사용하여 오류를 처리하고 있었다. Global Error가 정상적으로 작동하는지 테스트를 하려고 다음과 같이 로직을 작성했다. Controller @PostMapping("/register") public String checkRegister(User user, BindingResult bindingResult, RedirectAttributes redirectAttributes) { if(user.getUserName() == "" || user.getUserName() == null) { bindingResult.rejectValue("loginId", "required"); } if(user.getLoginPassword() == "" || us..
[Spring] RowMapper<T> mapRow(), ResultSet를 객체로 반환 JdbcTemplate를 사용하다 보면 RowMapper 인터페이스를 본 적이 있을 것이다. 자세히 알고 쓰지 않으면 잘못된 사용을 할 수도 있으니 주의하자 JdbcTemplate 사용 전 우리는 지금까지 DB에 select문을 날려서 결과 값으로 ResultSet을 받아서 사용해 왔었다. 아래와 코드를 확인하자. ResultSet 사용 public Member findById(String memberId) throws SQLException { String sql = "select * from member where member_id = ?"; Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { 생략... ..
[Spring] JdbcTemplate DB 반복 작업 제거 기존에 우리는 Jdbc를 통해 아래 과정을 거쳤다 커넥션 생성 및 동기화 PreparedStatement 생성 ResultSet 생성 (쿼리 실행 결과) SQLExceptionTranslator를 통해 체크 예외 -> 언체크 예외 리소스 반환(종료) DB에 저장, 조회, 삭제, 수정 즉 CRUD를 수행할 때마다 반복적인 작업을 거쳤다. JdbcTemplate은 위와 같은 반복 작업을 제거해준다. JdbcTemplate 생성 JdbcTemplate 클래스는 생성자로 DataSource를 넘겨줘야 한다. DataSource의 경우에는 Jdbc를 통하여 직접 가져오거나 커넥션풀을 사용하거나 해서 가져오면 된다. (커넥션풀 구현체로 HikariCP를 주로 사용한다고 한다) JdbcTemplate jdbcTemp..
[Spring-Error] H2 데이터베이스 쿼리 삽입 안 되는 문제 내가 겪은 문제 스프링에서 jdbc connection을 정상적으로 가져왔는데도 sql 삽입문이 처리가 되지 않는 문제가 발생했다. 해결 참 바보 같은 행동을 하고 있었다. insert문을 작성해놓고 select문처럼 사용하고 있었다. insert문을 사용하였으니 executeQuery()가 아니라 executeUpdate()를 사용해야 한다. 기존 코드 @Slf4j public class MemberRepository { public Member save(Member member) throws SQLException { String sql = "insert into member(member_id, money) values(?, ?)"; Connection conn = null; PreparedState..
[Spring-Error] @ExceptionHandler 호출이 안 되는 문제 (예외 처리가 안됨) 내가 겪은 문제 API 통신을 할 때 @ExceptionHandler 애너테이션이 호출되지 않는 문제가 있었다. 문제가 발생하는 코드는 아래와 같다. ApiExceptionController @Slf4j @RestController public class ApiExceptionController { @GetMapping("/api/members/{id}") public MemberDto getMember(@PathVariable("id") String id) { if (id.equals("ex")) { throw new RuntimeException("잘못된 사용자"); } if (id.equals("bad")) { log.info("ApiExceptionController 호출"); throw new ..
[Spring] ExceptionHandler 클라이언트-서버 간의 통신 클라이언트와 서버 간에 통신에는 HTML을 통한 통신도 있지만 API를 통한 통신도 존재한다. 스프링에서 API 통신을 할 때 예외가 서블릿에서 별도로 처리되지 않으면 WAS로 예외를 넘겨주면서 500 에러를 발생시킨다. 여기서 문제점은 WAS로 넘어간 예외는 항상 500 에러를 발생시키기 때문에 각 상황에 맞는 예외처리가 되지 않는다. (404 에러를 발생시키고 싶은데 500 에러로 처리됨 등) 위 그림을 보면 핸들러에서 발생한 예외가 서블릿(스프링에서는 디스패처 서블릿)으로 넘어가게 되는데 서블릿에서 해당 예외를 별도로 처리하는 로직이 존재하지 않는다면 WAS로 예외를 넘겨버린다. WAS로 넘어간 예외는 말했듯이 500 에러를 발생시킨다. API 마다 다르게 예외 처리 위의..
[Spring-Error] 예외 페이지 내가 겪은 문제 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..