🚩 ! 요구사항 확인: 필수 구현 기능
- 관리자 가입 기능
이메일,비밀번호,부서,권한을 저장할 수 있습니다.
- 커리큘럼, 마케팅, 개발
부서가 있습니다.- MANAGER, STAFF
권한이 있습니다.
- 커리큘럼, 개발
부서만 MANAGER 권한을 부여 받을 수 있습니다.이메일은올바른 이메일 형식을 지켜야 합니다.비밀번호는최소 8자 이상, 15자 이하이며 알파벳 대소문자(a~z, A~Z), 숫자(0~9), 특수문자로 구성되어야 합니다.- 관리자가입 성공을 확인할 수 있는 값을 반환합니다.
- ex) HTTP Status Code, Error Message …
- 로그인 기능
- 관리자는
이메일,비밀번호를 입력하여 서버에 로그인을 요청할 수 있습니다.- 로그인 성공 시,
회원의 정보와JWT를 활용하여 토큰을 발급하고,
발급한 토큰을 Header에 추가한 후 로그인 성공을 확인할 수 있는 값과 함께 반환합니다.
- ex) HTTP Status Code, Error Message …
- 강사 등록 기능
이름,경력(년차),회사,전화번호,소개를 저장할 수 있습니다.
- 로그인을 통해 발급받은 JWT가 함께 요청됩니다.
- 관리자만 강사 등록이 가능합니다.
- 등록된 강사의 정보를 반환 받아 확인할 수 있습니다.
- 선택한 강사 정보 수정 기능
- 선택한 강사의
경력,회사,전화번호,소개를 수정할 수 있습니다.
- 로그인을 통해 발급받은 JWT가 함께 요청됩니다.
- MANAGER 권한을 가진 관리자만 강사 정보 수정이 가능합니다.
- 수정된 강사의 정보를 반환 받아 확인할 수 있습니다.
- 강의 등록 기능
강의명,가격,소개,카테고리,강사,등록일을 저장할 수 있습니다.
- Spring, React, Node
카테고리가 있습니다.- 강사 한 명이 여러 개의 강의를 촬영할 수도 있습니다.
- 로그인을 통해 발급받은 JWT가 함께 요청됩니다.
- 관리자만 강의 등록이 가능합니다.
- 등록된 강의의 정보를 반환 받아 확인할 수 있습니다.
- 선택한 강의 정보 수정 기능
- 선택한 강의의
강의명,가격,소개,카테고리를 수정할 수 있습니다.
- 로그인을 통해 발급받은 JWT가 함께 요청됩니다.
- MANAGER 권한을 가진 관리자만 강의 정보 수정이 가능합니다.
- 수정된 강의의 정보를 반환 받아 확인할 수 있습니다.
- 선택한 강사 조회 기능
- 선택한 강사의 정보를 조회할 수 있습니다.
- 로그인을 통해 발급받은 JWT가 함께 요청됩니다.
- 관리자만 강사 조회가 가능합니다.
- 선택한 강의 조회 기능
- 선택한 강의의 정보를 조회할 수 있습니다.
- 로그인을 통해 발급받은 JWT가 함께 요청됩니다.
- 관리자만 강의 조회가 가능합니다.
- 선택한 강사가 촬영한 강의 목록 조회 기능
- 선택한 강사가 촬영한 강의를 조회할 수 있습니다.
- 로그인을 통해 발급받은 JWT가 함께 요청됩니다.
- 관리자만 강의 조회가 가능합니다.
- 조회된 강의 목록은
등록일기준 내림차순으로 정렬 되어있습니다.
- 카테고리별 강의 목록 조회 기능
- 선택한 카테고리에 포함된 강의를 조회할 수 있습니다.
- 로그인을 통해 발급받은 JWT가 함께 요청됩니다.
- 관리자만 강의 조회가 가능합니다.
- 조회된 강의 목록은
등록일기준 내림차순으로 정렬 되어있습니다.

.

.

-> 인증과 인가에 대한 개념들과 차이점을 알아야했고, Spring Security에 대해서도 어려움을 겪었다. 이것들에 대해서는 블로그에 정리를 한번 해야겠다.
그리고 Entity 연관관계에 대해서도 많은 시간을 써야했다.
ex)
선택한 '강사가 촬영한 강의 목록 조회 기능'을 구현하고자 했을때 처음에는 강의 entity에 @ManyToOne과 @JoinColumn를 사용하여 강사Id로 정보를 받으려 하였다.
그런데 Repository쪽에
List<Lecture> findByTutorIdOrderByCreatedAtDesc(Long tutorId);
로 findByTutorId를 찾으려 했으나 계속 Id부분에 찾을수없다는 오류가 계속 났고,
JPQL을 사용하는 방법으로
@Query("SELECT l FROM Lecture l WHERE l.tutor.id = :tutorId ORDER BY l.createdAt DESC")
List<Lecture> findLecturesByTutorId(@Param("tutorId") Long tutorId);
를 해봤으나 계속 Id를 찾을 수 없다는 오류가 계속 났다.
후에 반대로 방향을 바꾸어 강사 entity에 @ManyToOne과 @JoinColumn를 넣고,
강사 Service 클래스에 강의entitiy를 조회하고 생성때 강의까지 넣어 저장하는 방식으로 하였다.
// Lecture 엔티티 조회
Lecture lecture = lectureRepository.findById(requestDto.getLectureId())
.orElseThrow(() -> new IllegalArgumentException("Invalid tutor ID: " + requestDto.getLectureId()));
// Tutor 엔티티 생성
Tutor tutor = new Tutor(requestDto, lecture);
후에 문제점을 알게 되었는데 Lecture 엔티티에서 @ManyToOne 애노테이션을 사용하여 Tutor 엔티티와의 관계를 정의해 놓으면, LectureRepository의 findById 메서드를 호출할 때 자동으로 관련 Tutor 엔티티의 정보도 함께 조회된다는 것이였다.
-> 이렇게 하면 JPA는 @ManyToOne 관계를 자동으로 처리하여, findById 등의 메서드를 사용할 때 연관된 Tutor 엔티티의 정보도 함께 로드한다.
-> 서비스 계층에서 LectureRepository의 메서드를 호출하여 강의 정보를 가져온다.
가져온 Lecture 객체에서 Tutor 정보를 추출하여 DTO에 포함시킨다.
-> 컨트롤러에서는 이 서비스 메서드를 호출하여 클라이언트에게 필요한 정보를 제공할 수 있다.
.
@ManyToOne과 같은 연관 관계 매핑을 이용하여, 연관된 엔티티의 데이터를 자동으로 로딩하는 기능을 제공한다. 이는 "지연 로딩(Lazy Loading)" 또는 "즉시 로딩(Eager Loading)" 방식 중 하나를 사용하여 수행될 수 있다.
지연 로딩(Lazy Loading):
@ManyToOne 관계의 기본값은 지연 로딩이다. 이는 Lecture 객체가 실제로 사용될 때까지 Tutor 객체의 로딩을 연기한다는 것을 의미한다. 필요한 시점에 JPA가 자동으로 관련 Tutor 데이터를 로딩함.
즉시 로딩(Eager Loading):
필요한 경우 @ManyToOne(fetch = FetchType.EAGER)를 사용하여 즉시 로딩을 설정할 수 있다. 이는 Lecture 객체를 조회할 때마다 연관된 Tutor 객체도 바로 로딩한다는 의미.
지금은 처음에 등록할때 부터 강사를 등록하면 강의 정보가 나오고있다.
다음 과제에서는 조회시에만 나올 수 있게 해보자!!