프로필 조회하는 부분과 회원정보 수정하는 페이지 에러 발생
→ getId() 메소드의 부재가 원인
User 클래스에서 id의 setter는 없어도 되는듯 하나(@GeneratedValue 어노테이션때문에) getter 는 있어야한다. getter가 없어서 id값을 못가져와서 발생한 에러
엔티티는 테이블에 대응되는 하나의 클래스
spring-boot-starter-data-jpa 의존성을 추가하고 @Entity 를 붙이면 테이블과 클래스가 매핑된다.
엔티티는 클래스를 의미할때도 있고, 인스턴스를 의미하는 경우도 있다. 엔티티 클래스, 엔티티 인스턴스, 엔티티 객체라고 부른다.
엔티티 매니저
엔티티 객체들을 관리
엔티티 매니저는 관리하는 엔티티 객체들을 영속 컨텍스트(Persistence Context)에 넣어두고 객체들의 생사를 관리
영속 컨텍스트(Persistence Context)
JPA가 엔티티 객체들을 모아두는 공간
@Autowired를 필드주입으로 하지말고 생성자 주입으로 바꿔보자.
스프링 - 생성자 주입을 사용해야 하는 이유, 필드인젝션이 좋지 않은 이유
생성자 주입을 @Autowired를 사용하는 필드 주입보다 권장하는 하는 이유
이글도 읽어봤는데 사실 무슨이야기인지 완벽하게 이해하지 못하였으나 쿠퍼의 pr 코멘트를 보니깐 생성자 주입이 더 좋다고 해서 변경하였다.
위에 블로그를 보고 알게된 점
여러 서비스들간의 의존관계가 생길수 있는데 필드 주입이나 setter주입은 객체 생성시점에 순환참조가 일어나는지 알수 없어서 생성자 주입이 더 좋다는 내용도 봤는데 아직 내가 이해하기엔 좀 어려운 내용이여서 이렇구나 라고 하고 넘어갔다.
아래 블로그 참조하고 ModelAndView클래스로 들어가서 소스코드 봄
[Spring - @Autowired, @Service, @Repository 구조]
컨트롤러의 역할 : 서비스와 뷰의 중재자
ModelAndView 가 중재자
addObject()로 뷰 내부에 변수와 매핑
ModelAndView addObject(String attributeName,
@Nullable Object attributeValue) {
getModelMap().addAttribute(attriuteName, attributeValue);
return this;
}
setNameViewNAme()으로 출력할 뷰 설정
ModelAndView 생성자의 인자로 view이름을 넣어줘서 설정
→ 루카스에 나온 코드에서 이 방식 사용함
@GetMapping("/{id}")
public ModelAndView show(@PathVariable Long id) {
ModelAndView modelAndView = new ModelAndView("/user/profile");
modelAndView.addObject("user", userRepository.findById(id).orElseThrow(NullPointerException::new));
return modelAndView;
}
코드 개선