gsm-msg / bitgouel-server Goto Github PK
View Code? Open in Web Editor NEW[ 2세대 학교기업 프로젝트 | Server ] 광주 빛고을 직업교육 혁신지구
License: MIT License
[ 2세대 학교기업 프로젝트 | Server ] 광주 빛고을 직업교육 혁신지구
License: MIT License
"Header": {
"Authorization": "Bearer ey.."
}
"QueryString": {
"page": In
"size": Int
}
"PathVariable" {
"student_id": UUID
}
No response
학교, 취업동아리를 삽입하는 Initializer를 개발하겠습니다.
No response
Persistable 클래스를 상속해 엔티티 관련 처리 연산에 효율을 올리도록 하겠습니다.
Persistable을 사용하기 위해 다음과 같은 이슈들을 해결해야합니다.
이유는 ULID를 Entity를 생성할 때 함께 생성해서 영속화를 하면 EntityManager.persist 함수가 아닌 EntityManager.merge 함수가 호출됩니다. 그래서 저장하기 전에 Primary Key를 가진 데이터가 존재하는지 여부를 확인하는 쿼리가 한번 실행됩니다.
UUID를 사용시 정렬 작업에 관한 성능 이슈가 있습니다.
Persistable사용시 delete 작업이 처리되지 않습니다.
그 이유는 JpaRepository deletee구현체에서 isNew()가 true라면 delete연산이 수행되지 않습니다.
Hibernate에서 fetchType.LAZY로 설정된 객체는 실제 객체가 아닌 하이버네이트 프록시 객체가 반환되기때문에 엔티티간의 동일성이 보장되지 않습니다. (엔티티는 PrimaryKey의 값으로 동등성을 보장한다. 그렇기에 동일성을 보장하는 equals를 재정의해 id값을 비교하게 해야한다. 왜냐하면 인스턴스의 값은 변할 수 있기때문에 같은 id의 엔티티라도 모든 필드가 같다는 보장은 할 수 없지만 id가 같으면 같은 엔티티인 것이다. 그래서 id만 같다면 동일성도 보장해야한다.)
FetchType.EAGER을 통해 해결할수도 있지만 차라리 equals의 구현을 HibernateProxy 엔티티가 아닐때 동일성을 보장하도록 재정의해서 해결합니다.
스포카에서 Kotlin으로 JPA Entity를 정의하는 방법 이슈와 관련된 이 글을 확인해주셨으면 좋겠습니다.
학생 활동 엔티티에 승인 미승인 상태가 필요합니다
No response
"pathVariable": {
"student-id": UUID
}
"body": {
"title": String,
"content": String,
"credit": Int,
"activtyDate": LocalDateTime
}
No response
{
"email": String,
"password": String
}
{
"accessToken": String,
"refreshToken": String,
"accessExpiration": LocalDataTime,
"refreshExpiration": LocalDataTime
}
No response
유저 엔티티 , 도메인 세팅과 ERD, 클래스다이어그램 이미지를 삽입합니다.
No response
강의 조회 기능을 개발하겠습니다.
No response
커밋 메시지 규율을 README에 작성하겠습니다.
No response
{
"title": String,
"content": String,
"credit": Int,
"createdAt": LocalDateTime
}
No response
{
"question" : String,
"answer" : String
}
201 Created
No response
"Header": {
"Authorization": "Bearer ey.."
}
"QueryString": {
"page": Int,
"size": Int,
"sort": String
}
"activities": {
"content": [
{
"activityId": UUID,
"title": String,
"userId": UUID,
"username": String,
"approveStatus": ApproveStatus APPROVED | PENDING
},
{
"activityId": UUID,
"title": String,
"userId": UUID,
"username": String,
"approveStatus": ApproveStatus APPROVED | PENDING
}
],
"pageable": {
"sort": {
"unsorted": Boolean,
"sorted": Boolean,
"empty": Boolean
},
"pageSize": Int,
"pageNumber": Int,
"offset": Int,
"paged": Boolean,
"unpaged": Boolean
},
"totalPages": Int,
"totalElements": Int,
"last": Boolean,
"numberOfElements": Int,
"number": Int,
"sort": {
"unsorted": Boolean,
"sorted": Boolean,
"empty": Boolean
},
"first": Boolean,
"size": Int,
"empty": Boolean
}
}
No response
멀티모듈 프로젝트 기본 구조를 세팅하겠습니다.
- bitgouel-batch
- job
- config
- custom
- bitgouel-domain
- model
- user
- auth
- post
- lecture.…..
- bitgouel-api
- aop
- domain
- user
- controller
- service
- repository
- data
- util
- global
- thirdparty
No response
{
"email": String,
"name": String,
"phoneNumber": String,
"password": String,
"highSchool": HighSchool,
"clubName": String
"governmentName": String
}
No response
faq 도메인의 entity와 repository 세팅을 하겠습니다.
Repository는 일단 CrudRepository 를 상속받아 나중에 페이징 처리가 필요해진다면 JpaRepository 를 상속하도록 변경하겠습니다.
No response
Elasticache redis대신 redis는 docker-compose를 통해 관리하도록 하겠습니다.
redis 환경을 구축합니다.
No response
{
"email": String,
"name": String,
"phoneNumber": String,
"password": String,
"university": String
}
No response
Header : RefreshToken:Bearer ...
204 No Content
No response
StudentActivity의 학점 항목의 타입이 String입니다
HighSchool Enum 이름들이 소문자인 경우가 있습니다
No response
No response
"PathVariable": {
"id": String
}
이건 취동쌤이 학점인정을 요청을 거절하는 경우에 사용하는 api입니다
{
"email": String,
"name": String,
"phoneNumber": String,
"password": String,
"highSchool": HighSchool,
"grade": Int,
"classRoom": Int,
"number": Int,
"admissionNumber": Int
}
No response
배치 서버 애플리케이션의 세팅과 Configuration Setting등 기초적인 부분들을 세팅합니다.
No response
No response
{
"email": String,
"name": String,
"phoneNumber": String,
"password": String,
"highSchool": String,
"clubName": String
}
201 CREATED
No response
헬스체크 컨트롤러 반환타입을 ResponseEntity로 수정하겠습니다.
No response
"QueryString" {
"page": Int,
"size": Int
}
"activities" : [
{
"activityId": UUID,
"title": String,
"userId": UUID,
"username": String,
"approveStatus": "PENDING" | "CREATED"
}
]
No response
유저 관련 엔티티들을 세팅합니다.
No response
유관기관 강사 표기보단 유관기관으로 표기를 원하셔서 변경하려합니다. 설계에 참고해주세요
No response
No response
유저의 마이페이지 조회 기능을 개발하겠습니다.
No response
ci 스크립트를 작성합니다.
No response
isNew로직 때문에 save하면서 detach되는 이슈가 있어 해결하겠습니다.
No response
학생 활동을 업데이트하면 다시 PENDING로 돌리는 프로세스를 가지고있음 그렇기에 이미 등록된 업데이트 되기 이전 활동을 조회할 수 없음
해결 방법으로 학생 활동 히스토리를 기록해서 approve된 활동 전체조회시 수정 pending 상태의 학생 활동은 히스토리에 저장된 정보를 띄워준다.
여기서는 다음과 같은 상황을 생각해볼 수 있다.
업데이트작업을 진행 히스토리 기록과 PENDING 상태 보존 여기서 한 번 더 업데이트를 한다면?
→ History를 생성할 필요 없이 PENDING 상태인 원래 학생 활동을 업데이트 해주면 된다.
업데이트를 어프로브 받은 후 히스토리는?
→ 업데이트를 Approve를 받으면 History를 삭제한다.
업데이트를 할 때 히스토리를 기록하는 방법. → 이벤트 리스너를 사용한다. 학생 업데이트 이벤트를 읽어 히스토리 생성 작업을 처리한다. → 히스토리 생성 작업은 학생 활동 이벤트 핸들러에서 처리한다.
Approve된 학생 활동만 불러오면 되는데 PENDING 상태의 학생활동도 전부 불러와야한다. 그리고 PENDING 상태인 게시글에 히스토리가 존재한다면 업데이트 대기 PENDING이고 존재하지 않는다면 그냥 PENDING상태이며 필터링 작업을 처리해야한다. 결국 approve, pending 상태의 모든 학생 활동을 전부 조회를 해야한다.
→ select 쿼리로 approve상태인 학생 활동과 pending이면서 history가 존재하는 학생활동을 전부 가져온다. 그렇게 되면 여기서 조회한 pending 상태의 학생 활동들은 전부 히스토리가 존재한다는 것을 보장할 수 있다.
No response
endpoint=/ 로 애플리케이션의 health를 체크하는 컨트롤러를 개발하겠습니다.
No response
Header Authorization : Bearer ..
{
"questions": [
{
"id": Long,
"question": String
}
]
}
No response
codedeploy를 적용하겠습니다.
No response
RestController로 들어온 Http Servlet 정보들을 logging하는 aspect를 작성하겠습니다.
No response
“PathVariable”: {
“id”: UUID
}
No response
RuntimeException
을 상속받는 BitgouelException
클래스를 만들어 전역 예외 핸들러를 개발하겠습니다.
No response
{
"email": String,
"name": String,
"phoneNumber": String,
"password": String,
"highSchool": HighSchool,
"clubName": String
"company": String
}
No response
Header : Authorization: Bearer ..
Param : highSchool: HighSchool
{
"clubs" : [
{
"id" : Long,
"name" : String
}
]
}
No response
강의 관련 엔티티를 세팅하겠습니다.
No response
github action, code deploy
빛고을 메인 서버 CD를 구축하겠습니다.
No response
Header Authorization : Bearer ..
{
"id" : Long,
"question" : String,
"answer" : String
}
No response
Jwt 관련 설정을 하겠습니다.
Spring Security를 사용하겠습니다.
No response
RefreshToken : Bearer ..
{
"accessToken": String,
"refreshToken": String,
"accessExpiration": LocalDataTime,
"refreshExpiration": LocalDataTime
}
No response
"PathVariable": {
"id": UUID
}
No response
회원탈퇴 기능 구현
No response
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.