@ExceptionHandler의 사용
Exception Handling in Spring MVC
@ControllerAdvice, @ExceptionHandler를 이용한 예외처리 분리, 통합하기(Spring에서 예외 관리하는 방법, 실무에서는 어떻게?)
userRepository에서 객체 꺼내올때 orElseThrow()이용
위의 두 블로그 보고 @ExceptionHandler 를 이용해서 예외발생시 nullErrorHandle 페이지 띄우도록 함
nullError.html 왜 파일 아이콘이 안뜨지 → 조원들한테 해당 문제 공유했는데 파일 이름때문인듯 하다. 근데 봉프는 아이콘이 잘뜬다고 한다. 뭐가 문제인지는 모르겠지만 파일 이름을 바꿔서 해결했다.
회원정보 수정하기
@PostMapping("/{id}")
public String updateForm(@PathVariable Long id, User newUser) {
User user = userRepository.findById(id).orElseThrow(NullPointerException::new);
user.update(newUser);
return "redirect:/users";
}
여기서 자바지기님 영상에는 마지막에 userRepository.save(user)라고 해주라고 나오지만 쿠퍼의 pr을 보니 JPA에서 자동으로 변경감지를 해주기때문에 이부분을 안써도 된다고 한다.
→ 잘못된 부분임 save()써줘야함
https://jojoldu.tistory.com/415
블로그 글을 보니 Dirty checking이란 상태 변경 검사
JPA에서 트랜잭션이 끝나는 시점에 변화가 있는 엔티티 객체들을 데이터베이스에 자동반영해주는기능
HTTP의 put 메소드 이용하기
{{#user}}
<form name="user" method="post" action="/users/{{id}}">
<input type="hidden" name="_method" value="put"/>
...
< input type="hidden" name="_method" value="put"/ > 추가
서버에서 _method 라는 인자가 전달이 되면 value에 해당되는 메소드(put)를 호출한다.
@PutMapping("/{id}")
public String updateForm(@PathVariable Long id, User newUser) {
User user = userRepository.findById(id).orElseThrow(NullPointerException::new);
user.update(newUser);
return "redirect:/users";
}
@RequestParam으로 비밀번호 일치하는지 확인하는 기능 추가
스프링 controller에서 파라미터를 받는 다양한 방법 ( @RequestParam, @RequestBody, @PathVariable)
putMapping 입력값 가져오기라는 키워드로 검색해서 @RequestParam 이라는 어노테이션을 이용하면 된다는걸 알았다.
→ @RequestParam("inputPassword")라고 하면 뷰에 있는 name 속성의 inputPassword를 가져온다는 의미로 이해하고 코드를 짰는데 잘 동작한다.
findOne() 사용하는걸로 바꿀라하는데 에러 발생
Can't use findOne() in my code with JpaRepository
You used an old version of spring-data-jpa, which had a findOne() method. Now you're using a more recent version, which doesn't have it anymore. As simple as that. findById() is what you should use in the newer version. Read the damn javadoc. That's what it's for. – JB Nizet Mar 29 '18 at 17:32
→ 옛날버전이니 대신에 findById()를 쓰라 함
[REST API] REST API 규칙/PUT과 POST 차이/PUT과 PATCH 차이
REST란?
Representational State Transfer
REST API는 웹의 장점을 최대한 활용할수 있는 아키텍쳐
REST의 구성
자원(Resource) : URI
행위(Verb) : HTTP method
표현(Representations)
→ URI를 통해 자원을 표시하고, HTTP 메소드를 이용해서 해당 자원의 행위를 규정하고 그 결과를 받는것
POST와 PUT을 구분하기 위해 멱등성의 개념 필요
멱등성(Idempotence)이란?
여러번 수행해도 서버자원의 상태값이 동일함을 의미
계층화 아키텍쳐(Layered Architecture)의 구성요소
Presentation Layer : View
Control Layer : Controller
Business Layer : Service
Control Layer와 Persistence Layer를 연결하는 역할
→ 두 계층이 직접 통신하지 않게하여 애플리케이션의 유연성을 증가시킴
transaction 처리
비즈니스 로직처리와 비즈니스와 관련된 도메인 모델의 적합성을 검증
Persistence Layer : DAO
Domain Model Layer : VO, DTO
Spring MVC 처리 순서
[Spring] Spring에서 말하는 Spring MVC 이란?
Spring MVC 구성 주요 컴포넌트 (블로그에 있는 그림보고 되새기면서 노트에 적어봄)
블로그에 있는 내용을 참고해서 흐름을 정리해보았다. (View와 ViewResolver 부분은 그림에 있는 번호와 아래 정리한 번호순서가 다름)
Client가 URL로 접근하여 정보 요청
DispatcherServlet은 해당 요청을 매핑한 Controller가 있는지 검색하기 위해 Request를 HandlerMapping에게 위임한다.
HandlerMapping은 requestURL과 Controller 클래스의 매핑을 관리한다.(@RequestMapping)
해당 Controller에게 요청을 처리하도록 위임한다.
Controller는 @RequestMapping을 통하여 요청을 처리할 메서드에 호출된다.
해당 요청을 처리할 Service를 주입(DI)받아서 Service에게 위임한다.
connection pool을 담당하는 DAO가 주입(DI)받아 대신 DB에 접근한다. (@Repository)
결과를 다시 Controller에게 전달한다.
View에 전달할 결과 데이터(Model)와 이동할 화면(View)정보를 ModelAndView 인스턴스에 담아 DispatcherServlet에 반환한다.
DispatcherServlet은 VeiwResolver에게 View Name을 전달한다.
ViewResolver는 전달받은 View Name을 이용해 알맞는 View객체를 찾는다. View에 Model을 rendering하여 View 인스턴스를 다시 DispatcherServlet에 보낸다.
DispatcherServlet은 최종결과를 클라이언트에 응답한다.
계층화 아키텍쳐의 각 계층마다 담당한 역할에 대해 학습했다.
미션 2 pr 보냈다.
@ExceptionHandler를 사용해봤다. NullPointerException 발생시 새로운 뷰를 출력하도록 했다. 맞게한건지는 모르겠지만 잘못되었다면 피드백이 올것이다.
쿠퍼의 미션2 pr을 보고 회원정보 수정시 JPA가 자동으로 변경감지를 해줘서 save를 안해줘도 된다는 것을 배웠다.
회원정보 수정하는 기능을 PUT방식으로 요청하는것을 구현함으로써 PUT방식과 POST방식의 차이를 알았다. 멱등성에 대해서도 학습했다.
→ POST는 동일한 요청을 여러번 수행하면 서버자원의 상태값이 바뀌므로 멱등성이 보장되지 않는다.
사용자에게 입력받은 데이터를 파라미터로 받기위해 @RequestParam 어노테이션을 사용한다는 것을 배웠다. @PathVariable은 URL경로로부터 받아온다.
완전 정리 잘 하셨네요! 연 포스팅 보고 많이 배웠어요 ㅎㅎ