[TIL] 3월 9일

yeon·2021년 3월 10일
0

프로필 조회하는 부분과 회원정보 수정하는 페이지 에러 발생

→ getId() 메소드의 부재가 원인

User 클래스에서 id의 setter는 없어도 되는듯 하나(@GeneratedValue 어노테이션때문에) getter 는 있어야한다. getter가 없어서 id값을 못가져와서 발생한 에러

@Entity

엔티티(Entity)

엔티티는 테이블에 대응되는 하나의 클래스

spring-boot-starter-data-jpa 의존성을 추가하고 @Entity 를 붙이면 테이블과 클래스가 매핑된다.

엔티티는 클래스를 의미할때도 있고, 인스턴스를 의미하는 경우도 있다. 엔티티 클래스, 엔티티 인스턴스, 엔티티 객체라고 부른다.

엔티티 매니저

엔티티 객체들을 관리

엔티티 매니저는 관리하는 엔티티 객체들을 영속 컨텍스트(Persistence Context)에 넣어두고 객체들의 생사를 관리

영속 컨텍스트(Persistence Context)

JPA가 엔티티 객체들을 모아두는 공간

@Autowired를 필드주입으로 하지말고 생성자 주입으로 바꿔보자.

스프링 - 생성자 주입을 사용해야 하는 이유, 필드인젝션이 좋지 않은 이유

생성자 주입을 @Autowired를 사용하는 필드 주입보다 권장하는 하는 이유

이글도 읽어봤는데 사실 무슨이야기인지 완벽하게 이해하지 못하였으나 쿠퍼의 pr 코멘트를 보니깐 생성자 주입이 더 좋다고 해서 변경하였다.

위에 블로그를 보고 알게된 점

  • 생성자 주입의 장점
    • 의존관계 설정이 되지 않으면 객체 생성 불가 → NullPointerException 방지
    • 주입받을 필드를 final로 선언 가능 → Immutable
    • 순환참조 감지 가능

여러 서비스들간의 의존관계가 생길수 있는데 필드 주입이나 setter주입은 객체 생성시점에 순환참조가 일어나는지 알수 없어서 생성자 주입이 더 좋다는 내용도 봤는데 아직 내가 이해하기엔 좀 어려운 내용이여서 이렇구나 라고 하고 넘어갔다.

@Controller의 역할

아래 블로그 참조하고 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;
    }

오늘 한일

  • 혼자 공부하면서 모르는 내용이 방대하고 미션을 빨리 구현해야한다는 조급함이 더해져 제대로 짚고 넘어가지 않고 그냥 동영상과 루카스의 코드를 따라치는 경향이 있었는데 조원들과 코드리뷰를 하면서 먼저 pr날린 분의 코멘트를 보고 내 코드를 어떻게 개선해나아가야할지, 궁금했던 부분이지만 학습을 미뤄놨던 것들에 대해 학습할 기회가 되었다.
  • entity가 테이블에 해당되는 객체라는걸 알게되었다. 모든 속성에 @column 어노테이션을 붙여줘야한다고 착각했는데 @Entity 클래스의 모든 인스턴스 변수는 컬럼이 되기때문에 컬럼명을 지정하거나 사이즈 등 제약조건을 추가할때만 어노테이션을 추가하면 된다는 것을 알았다.
  • build.gradle에서 의존성 추가할때 compile, implementation, runtimeOnly 세가지의 차이가 궁금해서 찾아봤었는데 이해가 안가서 그냥 넘어갔는데 파이로가 대략적으로 설명해주셔서 그 차이에 대해 대략적으로 알게되었다.
  • controller의 역할에 대해 학습해봤는데 명확한 동작방식은 아직 잘 모르겠지만 ModelAndView의 기능은 좀 알겠다.

Todo

코드 개선

  • Question클래스에 글 작성 시간 추가
  • 데이터베이스에서 객체 가져올때 get()대신 어떤걸 쓰면 좋을지 고민
  • 비밀번호 일치하는지 확인하는 작업 추가

0개의 댓글