Spring 에서 간단하고 쉬운 파일 업로드를 위해 기본 제공 해주는 인터페이스.
== MultipartFile 이다.
이때, MultipartFile 자료형인 참조변수로 메서드를 사용 할 때,
예시)
fileUpload.transferTo(new File("C:\\Users\\dhfg0\\Desktop\\spring\\springWS\\day60\\src\\main\\webapp\\images\\" + fileName));


예외 처리를 하라고 안내를 해준다.
따라서, 이곳에서 바로 try-catch를 사용 하면 해결 된다.

그런데,

위의 메서드 시그니쳐에 throws 키워드를 명시해서, 예외를 던져버릴 수 있다.

throws 는 예외를 말 그대로 던져버리는 기능을 한다.
그러면 예외를 던졌으면, 어디서 받아서 try-catch를 해야 할까 ?
호출한 곳에서 try-catch를 사용하여 예외를 처리 해야 한다.
try-catch를 왜 사용 할까 ?
예외가 발생할 수 있는 작업을 수행 할 때, 그 예외를 처리하고,
프로그램의 실행을 계속 할 수 있도록 하기 위함 이다.
만약에 예외를 처리 하지 않으면, 예외가 호출 스택을 따라 올라가서,
프로그램을 비정상적으로 종료 시킬 수 있기 때문 이다.
예시 2)
jdbcTemplate 을 주체로 해서, queryForObject() 메서드를 사용 할 때.
queryForObject() 메서드는 메서드의 결과가 무조건 1개 여야만 한다.
1개 미만 또는 2개 이상 이면,
즉,
해당하는 결과가 없거나, 결과가 다수 이면,
EmptyResultDataAccessException 라는 예외가 발생 하게 된다.
만약, 2개 이상의 결과값이 나오는 경우라면,
query() 메서드를 사용 해야 한다.
그런데, 회원이 로그인을 하는 경우에, selectOne() 메서드를 사용 하게 된다.
이때,
아이디가 일치하지만 비밀번호가 일치 하지 않거나,
아이디가 애초에 일치 하지 않거나,
등등의 이유로 인해서,
로그인에 실패 했을 경우,

위에 보이는 queryForObject() 메서드의 결과값이 null이 나오는게 아니라,
EmptyResultDataAccessException 예외가 발생하게 되버린다.
그래서 해결 방법으로,
queryForObject() 메서드를 사용하는 이곳에서 try-catch 블록으로 잡아버리던지,

위와 같이 예외를 일단 던져버린 다음에,
selectOne() 을 사용하는 == 호출하는
즉, selectOne() 메서드를 사용하는 주체 == 객체 가 작성된 곳에,
try-catch 블록을 작성해줘야 한다.
selectOne()을 사용하는 주체는 누구일까 ?




LoginController 클래스 에서 selectOne() 메서드를 사용하는 모습을 확인 할 수 있다.
어 ? 근데 selectOne()을 사용하는 주체가 memberService 이네 ?

바로 이곳에서 try-catch 를 작성해주면 된다.
현재, 로그인에 실패 했을 경우, 아래와 같이 예외가 발생 하게 된다.


Request processing failed; nested exception is org.springframework.dao.EmptyResultDataAccessException: Incorrect result size: expected 1, actual 0
그래서 try-catch 블록을 작성 하자.



예외가 발생했지만, 프로그램이 종료 되지 않은 모습을 확인 할 수 있다.


위에서 예외 처리가 되고, catch 문에서 null을 반환 하기 때문에,


위와 같이 로그가 출력 되는 것을 확인 할 수 있다.
횡단관심 로그는 무시하고,
사용자가 아이디, 비밀번호를 입력.
login.do 요청을 Controller 에서 매핑 한다.
해당 요청을 받은 LoginController 에서,
login() 메서드를 수행 하게 되는데,
이곳에서, selectOne() 메서드를 사용하는 주체인 memberService 를 확인 할 수 있고,
MemberServiceImpl 클래스 내부에서, selectOne() 메서드 에서,
memberDAO를 주체로, selectOne() 을 하고,
이때, Model의 MemberDAO2 클래스의 selectOne() 메서드 내부로 진입 한다.
그래서,

이 로그가 호출되고,

예외가 발생해버려서,

catch에서 예외 처리를 하고, null을 반환 해서,

null 이므로, if 문 내부의 로그가 출력되고,
main.do 요청을 반환 해서, 서블릿이 해당 요청을 읽고, C가 해당 요청을 매핑 해서,
main.jsp로 돌려 보내게 된다.
'Spring 프레임워크 > 메모' 카테고리의 다른 글
의존 주입 (0) | 2023.09.19 |
---|---|
파일 업로드시, 비동기처리를 통해, 썸네일 기능을 구현 하기 (0) | 2023.08.18 |
Spring 프레임워크 JoinPoint 인터페이스 (0) | 2023.08.12 |
@RequestParam() 어노테이션 (0) | 2023.08.07 |
[ Spring ] redirect: 와 forward: (0) | 2023.08.07 |