교육 강의 플랫폼인 인프런을 클론하여 그동안 학습한 것을 적용하고 점진적으로 개선해나가는 토이 프로젝트입니다.
BACKEND
Spring Boot 3.1.0, Java 17, Spring Data JPA, Gradle
DATABASE
H2, MySQL 8.0
INFRA
Docker, Github Actions, NAVER Cloud Platform
교육 강의 플랫폼
Member 표현 계층을 코틀린으로 변환한다
Member application 계층을 Kotlin으로 변환한다.
유저는 장바구니에 추가한 강의 중 하나 이상을 선택하여 주문을 생성할 수 있다
File Storage 저장 방식을 Object Storage 저장 방식으로 변경한다.
Git Merge 정책 제안
Feat -> Develop Merge할 때 Squash & Merge 방식으로 정하는 것이 괜찮을 것 같습니다.
Feat 브랜치는 기능 구현을 위한 브랜치이며 해당 기능의 세세한 작업 사항은 PR에서 확인할 수 있고
실제 Develop 브랜치에서는 해당 기능 구현을 하나의 커밋으로 묶어 관리할 수 있습니다.
Develop 브랜치 운용 중에 문제가 발생하면 feat 브랜치 커밋 내역을 기준으로 reset 시켜 확인할 수 있는 것이 더 용이할 것 같습니다.
사용자는 본인의 쿠폰을 조회할 수 있다.
Lecture Domain Test Code 정상화
강의 등록 기능을 구현한다.
강의 등록시 Role을 체크하여 강사가 아닌 경우 excpetion 발생
Lecture Domain Refactoring
강의 등록 시 Role을 확인하고 Teacher 가 아닌 경우 Exception 처리
결론 : Member Facade의 책임을 어디까지 책정할 것인가 ?
request Validation Message 를 처리할 template 을 작성하고 상수로 처리한다.
LectureCommandProcessor를 기능 별로 분리하여 가독성을 높인다.
유저는 구매한 강의를 환불 할 수 있다.
쿠폰 발급 기능
유저는 구매한 강의에 리뷰를 남길 수 있다.
Querydsl 설정을 추가한다.
강사는 본인 강의에 대한 소개글을 작성할 수 있다.
쿠폰 등록 기능 구현
Lecture Repository Package 오류 수정
유저는 강의를 검색 할 수 있다.
CI/CD 환경 구축
유저는 강의를 장바구니에 저장하거나, 저장된 강의를 제거할 수 있다.
CQRS로 분리한 Command 와 Query Processor의 이름 분할
로 명시적으로 커맨드 역할을 하는 프로세서/ 쿼리 역할을 하는 프로세서로 구분하는 방식 채택 제안
의존 관계에 있는 엔티티 필드 변경에 의한 컴파일 에러를 해결하고 개선한다.
develop branch hotfix
강의 상세와 등록되는 실제 파일을 매핑한다.
request 처리 시 multipart 형태의 file 자체에 강의 상세 정보를 매핑 할 수 없음
-> 따라서 강의 상세 Json에 어떤 file이 매핑되어야 하는지 매핑해야하는데
-> file명으로 매핑하는 방식 채택
이 과정이 일어나기 위해서는 파일명이 중복되지 않아야 함
여기서 의문점 발생
Q. 이 파일명 중복 체크가 과연 필요한 행위인가?에 대한 의문
(상세를 매핑하기 위해 억지로 중복체크를 하는것이 아닌가 라는 생각이 문득 듦)
Member 도메인 계층을 Kotlin으로 변경한다.
DefaultHandlerExceptionResolver 의 기본 Exception처리 Response
TestCode의 Repository Stub을 공통화 하여 재사용성을 높인다.
Lecture Review를 등록하는 과정에서 Member와 Lecture에 대한 정보를 가져오는 작업이 필요합니다.
그래서 단위 테스트를 위한 Repository Stub 클래스가 필요한데
이미 시안님이 작성한 MemberRepository에 대한 Stub이 이미 있는 것을 토대로
각 도메인의 Repository Stub을 공통으로 추출하여 재사용성을 높이는 방법은 어떨까요?
Lecture Repository Package 오류 수정
현재 프로젝트에서 Kotlin을 사용할 수 있도록 환경을 설정한다
회원 로그인 기능
강의 업로드에 실패하는 경우를 확인하고 해결한다.
유저는 생성된 주문을 결제할 수 있다
강의 등록시 멤버 Role Check에 대한 Unit Testing
이 상황에서 유닛 테스팅을 위한 작업을 동일하게 진행하려 하였으나
Member 객체의 Role을 코드 내부에서 컨트롤 할 수 있는 방법이 없어서 고민중입니다.
이렇게 flow 처리 방식이 아닌 Spring Security + JWT 자체적인 Testing 방법이나 다른 더 나은 방법이 있다면 공유 부탁드립니다!
공통으로 사용될 커스텀 예외와 응답 객체를 정의한다
회원 가입 기능
역할 변경 후에 (USER -> TEACHER) @PreAuthorize("hasRole('TEACHER')")
메서드 호출 시 403 에러 코드가 발생하는 문제 해결하기.
역할이 변경되어도, Jwt에 저장된 ROLE이 변경되지 않아 403 에러가 발생하는 문제가 있습니다.
이 문제를 해결하기 위해 제가 생각한 해결 방안은 다음과 같습니다.
다른 의견이 있으시다면 주시면 감사하겠습니다.
의견이 수렴되면 해당 작업 들어가겠습니다! 🫡
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.