확실히 스프링 하위단계인 서블릿부터 머리싸매고 공부한다음에 2회독 해보니 구조가 쉽게 파악되고 이해도 빨리 된것 같다.
jpa는 java persistence api. 인터페이스임.따라서 구현하느 실제 클래스가 있어야 멀 할수가 있음->하이버네이트..
@Column :
@ManyToOne :
@OneToMany(mappedBy = "question", cascade = CascadeType.REMOVE)
public interface QuestionRepository extends JpaRepository<Question, Integer>
JpaRepository는 엔티티들을 리스트로 자동저장해주는 기능? -> X아니다.
@RequiredArgsConstructor
private final QuestionRepository questionRepository;
@Autowired VS @Requiredargsconstructor
autowired : -> 'bean객체 자동주입' new 안해도됨.
- 스프링프레임워크에서 의존성주입 수행하는데 사용. 스프링은 클래스 간의 의존성을 관리하고 필요한 해주는데 이때 이 애너테이션이 사용된다.이 어노테이션이 선언된 필드나 생성자에 해당하는 빈 객체가 자동으로 주입됩니다.
requiredargsconstructor : -> 'final 필드의 생성자 자동추가'
- 롬복 라이브러리에서 제공하는 애너테이션. 클래스의 필드에 대한 해준다. 즉 생성자 메서드를 자동으로 추가해준다. 해당 클래스의 모든 파이널 필드에 대한 매개변수를 갖고있다,...,?
요약하자면, @Autowired는 의존성 주입을 위해 사용되고, @RequiredArgsConstructor는 Lombok을 사용하여 final 필드에 대한 생성자를 자동으로 생성하는데 사용됩니다. 이 두 어노테이션은 서로 다른 목적을 가지고 있습니다.
애네다먼차인지?
객체초기화랑 객체생성이랑 다름.
객체초기화 : 객체생성과 동시에 변두들에 값 세팅 -> 생성자 역할
객체생성 : 걍 생성만 하는거
그냥 '생성'만 된 객체에는 변수에 값이 없으면 null,0 등이 있을텐데 그럼 객체역할을 제대로 수행하지 못할 확률이 높다. 이것을 방지하기 위해 객체생성+값세팅 해주는 생성자를 만든다. 생성자 만들면 값이 할당되어있지 않은 객체는 생성안시키도록 하는듯.
Controller -> Database 직접 접근은 보안에 좋지않음.
Controller -> Service -> Database 이렇게 해야 안전. 컨트롤러에서 리포지터리를 직접 호출하지않고, 서비스를 두어 데이터를 처리한다.
엔티티객체와 dto/data transter object 객체의 변환
스프링의 서비스로 만들라면 그냥 클래스명위에 @Service애너테이션 붙이면됨.
URL프리픽스
예로..
questioncontroller클래스 위에
@RequestMapping("/question")
붙이고
클래스 내에서 겟매핑할때
그 뒷부분만 써주면 됨.
그러면 그 url요청은 자동으로 /question/000 이렇게 됨
폼클래스에서 ↓
@NotEmpty(message="제목은 필수항목입니다.") : 해당 값이null또는 빈 문자열을 허용하지 않음. 메시지는 검증이 실패할 경우 화면에 표시할 오류메시지.
@Size(max=200) : 최대길이가 200바이트 넘으면 안됨.
private String subject;
폼 만들고 나서, 컨트롤러에서
↓
이렇게 변경.
< 폼클래스 사용하는 이유 > :
화면에서 전달되는 입력값을 검증하기 위해. 혹은 바인딩 할때.
@Valid 애너테이션 : QuestionForm의 @NotEmpty, @Size등의 검증기능이 동작함. 그리고 이어지는 BindingResult 매개변수는 @Valid 애너테이션으로 인해 검증이 수행된 결과를 의미하는 객체이다. 바인딩리저트는 반드시 벨리드 바로뒤에 위치해야함.
if문을통해, 오류가 있는경우, 다시 폼을작성하는 화면을 렌더링하게 했고
오류X -> 질문등록진행.
의존성주입 왜쓰는건지? 정확한 의미와 장점.