본문 바로가기

전체 글

(197)
[Spring] Validator 2개 이상 등록하기 1개의 Controller에서 2개 이상의 Validator를 등록하려면 어떻게 해야 할까? WebDataBinder의 addValidators()에 그냥 2개를 저장하면 될까? 바로 알아보자. 오류 코드 나는 회원가입용 검증기와 로그인용 검증기 2개를 등록하려고 하였다. 처음에 WebDataBinder에 2개를 바로 저장하였다. 참고로 registerValidator와 loginValidator는 주입받은 상태이다. // Controller @InitBinder public void init(WebDataBinder webDataBinder) { webDataBinder.addValidators(registerValidator, loginValidator); } 그러나 바로 IllegalStateExc..
[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 마다 다르게 예외 처리 위의..