Git Product home page Git Product logo

bitgouel-server's People

Contributors

ani2689 avatar esperar avatar juuuuhong avatar kimtaeo avatar uuuunseo avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

bitgouel-server's Issues

BaseUUIDEntity() Persistable 상속과 JpaRepository 기능 관련 이슈 해결

Describe

Persistable 클래스를 상속해 엔티티 관련 처리 연산에 효율을 올리도록 하겠습니다.

Persistable을 사용하기 위해 다음과 같은 이슈들을 해결해야합니다.


  1. update 작업 수행시 select문 발생합니다.

이유는 ULID를 Entity를 생성할 때 함께 생성해서 영속화를 하면 EntityManager.persist 함수가 아닌 EntityManager.merge 함수가 호출됩니다. 그래서 저장하기 전에 Primary Key를 가진 데이터가 존재하는지 여부를 확인하는 쿼리가 한번 실행됩니다.

  1. UUID를 사용시 정렬 작업에 관한 성능 이슈가 있습니다.

  2. Persistable사용시 delete 작업이 처리되지 않습니다.

그 이유는 JpaRepository deletee구현체에서 isNew()가 true라면 delete연산이 수행되지 않습니다.

  1. 동일성 보장

Hibernate에서 fetchType.LAZY로 설정된 객체는 실제 객체가 아닌 하이버네이트 프록시 객체가 반환되기때문에 엔티티간의 동일성이 보장되지 않습니다. (엔티티는 PrimaryKey의 값으로 동등성을 보장한다. 그렇기에 동일성을 보장하는 equals를 재정의해 id값을 비교하게 해야한다. 왜냐하면 인스턴스의 값은 변할 수 있기때문에 같은 id의 엔티티라도 모든 필드가 같다는 보장은 할 수 없지만 id가 같으면 같은 엔티티인 것이다. 그래서 id만 같다면 동일성도 보장해야한다.)

FetchType.EAGER을 통해 해결할수도 있지만 차라리 equals의 구현을 HibernateProxy 엔티티가 아닐때 동일성을 보장하도록 재정의해서 해결합니다.

Additional

스포카에서 Kotlin으로 JPA Entity를 정의하는 방법 이슈와 관련된 이 글을 확인해주셨으면 좋겠습니다.

학생 활동 정보 수정

Describe

"pathVariable": {
 	"student-id": UUID
}

"body": {
	"title": String,
	"content": String,
	"credit": Int,
	"activtyDate": LocalDateTime
}

Additional

No response

로그인 api 개발

Describe

Request

{
	"email": String,
	"password": String
}

Response

{
	"accessToken": String,
	"refreshToken": String,
	"accessExpiration": LocalDataTime,
	"refreshExpiration": LocalDataTime
}

Additional

No response

강의 조회 기능 개발

Describe

강의 조회 기능을 개발하겠습니다.

  • 강의 리스트 조회
  • 강의 상세 조회

Additional

No response

학생 활동 정보 추가

Describe

{
"title": String,
"content": String,
"credit": Int,
"createdAt": LocalDateTime
}

Additional

No response

내 학생 활동 리스트 조회

Describe

Request

"Header": {
   "Authorization": "Bearer ey.."
}

"QueryString": {
   "page": Int,
   "size": Int,
   "sort": String
}

Response

"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
    }
}

Additional

No response

Bitgouel 프로젝트 기초 세팅

Describe

멀티모듈 프로젝트 기본 구조를 세팅하겠습니다.

- bitgouel-batch
    - job
    - config
    - custom
- bitgouel-domain
    - model
        - user
        - auth
        - post
        - lecture.…..
- bitgouel-api
    - aop
    - domain
        - user
            - controller
            - service
            - repository
            - data
            - util
    - global
        - thirdparty

Additional

No response

유관 기관 회원가입

Describe

{
	"email": String,
	"name": String,
	"phoneNumber": String,
	"password": String,
	"highSchool": HighSchool,
	"clubName": String
	"governmentName": String
}

Additional

No response

faq entity, repository 세팅

Describe

faq 도메인의 entity와 repository 세팅을 하겠습니다.
Repository는 일단 CrudRepository 를 상속받아 나중에 페이징 처리가 필요해진다면 JpaRepository 를 상속하도록 변경하겠습니다.

Additional

No response

docker-compose redis 환경 구성

Describe

Elasticache redis대신 redis는 docker-compose를 통해 관리하도록 하겠습니다.
redis 환경을 구축합니다.

Additional

No response

대학 교수 회원가입

Describe

{
	"email": String,
	"name": String,
	"phoneNumber": String,
	"password": String,
	"university": String
}

Additional

No response

로그아웃

Describe

Request

Header : RefreshToken:Bearer ...

Response

204 No Content

Additional

No response

엔티티 및 Enum 오타 수정

Describe

  • StudentActivity의 학점 항목의 타입이 String입니다

  • HighSchool Enum 이름들이 소문자인 경우가 있습니다

Additional

No response

강의 신청 개발

Describe

  • 강의 신청 기능을 개발하겠습니다.

Additional

No response

학생 활동 및 거절 삭제

Describe

"PathVariable": {
   "id": String
}

Additional

이건 취동쌤이 학점인정을 요청을 거절하는 경우에 사용하는 api입니다

학생 회원가입 개발

Describe

Request

{
	"email": String,
	"name": String,
	"phoneNumber": String,
	"password": String,
	"highSchool": HighSchool,
	"grade": Int,
	"classRoom": Int,
	"number": Int,
	"admissionNumber": Int
}

Additional

No response

뽀짝샘 회원가입 API

Describe

Request

{
    "email": String,
    "name": String,
    "phoneNumber": String,
    "password": String,
    "highSchool": String,
    "clubName": String
}

Response

201 CREATED

Additional

No response

학생 활동 정보 리스트

Describe

Request

"QueryString" {
   "page": Int,
   "size": Int
}

Response

"activities" : [
   {
      "activityId": UUID,
      "title": String,
      "userId": UUID,
      "username": String,
      "approveStatus": "PENDING" | "CREATED"
   }
]

Additional

No response

유저 관련 엔티티 세팅

Describe

유저 관련 엔티티들을 세팅합니다.

  • Student
  • Teacher
  • Bbozzak
  • Professor
  • CompanyInstructor
  • Government
  • Admin

Additional

No response

강의 개설 개발

Describe

  • 강의 개설 기능을 개발하겠습니다.

Additional

No response

학생 ActivityHistory 기록, 성능 관련 이슈 트러블 슈팅

Describe

문제

학생 활동을 업데이트하면 다시 PENDING로 돌리는 프로세스를 가지고있음 그렇기에 이미 등록된 업데이트 되기 이전 활동을 조회할 수 없음

솔루션

해결 방법으로 학생 활동 히스토리를 기록해서 approve된 활동 전체조회시 수정 pending 상태의 학생 활동은 히스토리에 저장된 정보를 띄워준다.

프로세스

여기서는 다음과 같은 상황을 생각해볼 수 있다.

업데이트작업을 진행 히스토리 기록과 PENDING 상태 보존 여기서 한 번 더 업데이트를 한다면?
→ History를 생성할 필요 없이 PENDING 상태인 원래 학생 활동을 업데이트 해주면 된다.

업데이트를 어프로브 받은 후 히스토리는?
→ 업데이트를 Approve를 받으면 History를 삭제한다.

업데이트를 할 때 히스토리를 기록하는 방법. → 이벤트 리스너를 사용한다. 학생 업데이트 이벤트를 읽어 히스토리 생성 작업을 처리한다. → 히스토리 생성 작업은 학생 활동 이벤트 핸들러에서 처리한다.


Additional

여기서 성능 이슈가 발생하는가?

Approve된 학생 활동만 불러오면 되는데 PENDING 상태의 학생활동도 전부 불러와야한다. 그리고 PENDING 상태인 게시글에 히스토리가 존재한다면 업데이트 대기 PENDING이고 존재하지 않는다면 그냥 PENDING상태이며 필터링 작업을 처리해야한다. 결국 approve, pending 상태의 모든 학생 활동을 전부 조회를 해야한다.

해결 방법

→ select 쿼리로 approve상태인 학생 활동과 pending이면서 history가 존재하는 학생활동을 전부 가져온다. 그렇게 되면 여기서 조회한 pending 상태의 학생 활동들은 전부 히스토리가 존재한다는 것을 보장할 수 있다.

HealthCheck Controller

Describe

endpoint=/ 로 애플리케이션의 health를 체크하는 컨트롤러를 개발하겠습니다.

Additional

No response

faq 전체 조회

Describe

Request

Header Authorization : Bearer ..

Response

{
	"questions": [
		{
			"id": Long,
			"question": String
		}
	]
}

Additional

No response

CodeDeploy 적용

Describe

codedeploy를 적용하겠습니다.

Additional

No response

HttpLoggingAspect 작성

Describe

RestController로 들어온 Http Servlet 정보들을 logging하는 aspect를 작성하겠습니다.

Additional

No response

전역 예외 핸들러 개발

Describe

RuntimeException을 상속받는 BitgouelException 클래스를 만들어 전역 예외 핸들러를 개발하겠습니다.

Additional

No response

기업 강사 회원가입

Describe

{
	"email": String,
	"name": String,
	"phoneNumber": String,
	"password": String,
	"highSchool": HighSchool,
	"clubName": String
	"company": String
}

Additional

No response

동아리 리스트 조회

Describe

Request

Header : Authorization: Bearer ..
Param : highSchool: HighSchool

Response

{
    "clubs" : [
        {
            "id" : Long,
            "name" : String
        }
    ]
}

Additional

No response

Bitgouel CD 구축

Describe

github action, code deploy
빛고을 메인 서버 CD를 구축하겠습니다.

Additional

No response

FAQ 상세 조회

Describe

Request

Header Authorization : Bearer ..

Response

{
	"id" : Long,
	"question" : String,
	"answer" : String
}

Additional

No response

Security 설정

Describe

Jwt 관련 설정을 하겠습니다.
Spring Security를 사용하겠습니다.

Additional

No response

토큰 재발급

Describe

Request

RefreshToken : Bearer ..

Response

{
	"accessToken": String,
	"refreshToken": String,
	"accessExpiration": LocalDataTime,
	"refreshExpiration": LocalDataTime
}

Additional

No response

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.