Skip to content

[IC2_BE] 이철한 - 설문 조사 서비스 과제#21

Open
devch37 wants to merge 34 commits into
FC-InnerCircle-ICD2:mainfrom
devch37:feature/survey-form
Open

[IC2_BE] 이철한 - 설문 조사 서비스 과제#21
devch37 wants to merge 34 commits into
FC-InnerCircle-ICD2:mainfrom
devch37:feature/survey-form

Conversation

@devch37

@devch37 devch37 commented Nov 25, 2024

Copy link
Copy Markdown

ERD

스크린샷 2024-12-07 오전 2 04 07

모듈 설명

├── survey-api - 웹 접근 레이어 모듈 입니다 (컨트롤러 및 로직 서비스 담당 모듈)
├── survey-core - 공통 모듈 입니다 (enum class, 공통 extension 등) 스프링의 종속적이지 않은 모듈
└── survey-data - 데이터 접근 레이어 모듈

프로젝트 후기

이번에 프로젝트를 진행하면서 저에게는 아쉬운 마음이 굉장히 컸었던 프로젝트 였던 것 같습니다 ! 2주 라는 시간 동안 프로젝트를 진행 하면서 느낀점은 몇가지가 있습니다. 첫번째는 직장과 병행하면서 진행하기가 쉽지 않다였고 요새 야근이 없었는데 요즘 좀 야근 한다고 시간 내는게 많이 힘들었었네요 ㅜㅜ ! 두 번째는 제가 정말 많이 부족하다고 많이 느꼇습니다. JPA 를 실무에서는 사용해보지 않고 제가 예전에 개인적으로 공부할 때 조금 사용해 보았지만 사용하기가 쉽지 않았습니다 ㅜㅜ ! 공부를 열심히 해야겠다고 느꼇던 프로젝트였고 무사 수료 할 수 있도록 최선을 다하도록 하겠습니다 ㅎㅎ ! 다행히 다음주 부터는 야근이 조금 ... ?! 줄어 들 수 있을 것 같기도 해서 (제발 ..) 프로젝트에 집중 할 수 있을 것 같습니다 ㅎㅎ !

설계 시 아쉬 운 점

저는 사실 이번 설문 조사 프로젝트를 설계 하면서 설문 조사 라는 도메인 영역을 고민 하면서 해당 도메인은 사용자의 답변 히스토리 데이터를 보관하는 것이 굉장히 중요한 영역이라도 느꼇습니다. 그래서 DB 를 설계 시에 이번 DB 에서는 업데이트가 없다 ! 라는 기조로 설계를 했었습니다.

제가 그렇게 처음에 정하였던 이유는 몇가지가 있었는데요.

가장 큰 이유가 만약 설문지에서 설문 문항을 active / inactive 로 관리할 시 답변을 조회 할 때 해당 답변의 문항은 어떤 거였어 ? 라는 질문을 받았을 때 해당 답변의 문항이 뭐였는 지 답변 하기가 쉽지 않다는 판단이였습니다. 
(ex) 좋아하는 음식의 답변이 치킨 이였을 시 그 시점에 문항은 치킨/떡볶이/피자 or 치킨/떡볶이 선택지였는 지 답변하기가 쉬울 것 같지 않다는 판단 이였습니다) 

그래서 설문지 자체를 스냅샷 처럼 versioning 을 해서 저장을 했습니다. 생성 + 수정 API 가 하나로 합쳐진 이유였습니다.
수정을 진행 시 설문조사의 타이틀이 같을 시 새로운 버전으로 업데이트를 하였습니다. 다만 만약 지금 새로 업데이트하려는 설문지의 문항이 이전 설문지의 문항이 동일 할 시 생성하지 못하도록 하는 벨리데이션을 넣고 싶었지만 해당 벨리데이션은 못 넣었습니다. 
하지만 저번 리더님의 리뷰를 들었을 시 이런식의 설계는 좋지 않다고 느꼈었고 설계를 바꾸고 싶었지만 시간이 부족하다는 핑계로 변경 하지는 못하였습니다 ㅜㅜ ! 

다음 프로젝트 때는 설계 시 더 많은 고민을 해야할 것 같습니다 ! 프로젝트를 항상 진행하면서 느끼는 거지만 설계 당시에 모든 케이스를 커버하는게 참 어려운 것 같습니다 ㅜㅜ !

다음 프로젝트 시 향상 시키고 싶은 것

1.  네이밍
- 이번에는 정말 네이밍을 신경 못썻습니다 ㅜㅜ ! 그래서 그런지 프로젝트 후반부에 갈 수록 제가 선언한 네이밍에서 엄청 헤맸습니다. 다음 부터는 이러한 점 주의 해야 할 것 같습니다. 항상 느끼는 거지만 네이밍이 제일 어려운 것 같네요 ! 

2. 꼼꼼한 테스트 코드
- 테스트 코드를 이번에 많이 작성하지는 못하였습니다 ! 사실 작성해 본 경험이 이전에도 많지는 않아서 이번에는 꼼꼼이 단위 테스트 부터 작성을 해보고 싶었는데 역시 쉽지는 않네요 ... !

3. 계층 간 DTO 변환
- 이번에 프로젝트를 진행하면서 사실 구현이 우선이라는 마인드로 정말 리뷰 받기도 민망하게 ㅜㅜ 코드가 더러웠습니다 ! 우선 계층간 DTO 를 어디서 변환 시켜줄건지 Entity 자체를 넘겨줄 것 인지 DTO or Domain 으로 맵핑 시켜서 넘겨 줄건지 를 복잡하게 하였습니다. 다음부터는 이러한 점을 보완 하여야 할 것 같습니다.

4. 어려운 JPA ....
- 이번에 프로젝트를 진행하면서 ORM 을 제대로 사용하지 못하는 저를 보고 많이 답답하였습니다 ... ! Jpa 의 기능들을 잘 활용할 수 있도록 JPA 스터디도 진행하겠습니다 ㅎㅎ !

5. 동시성 이슈 다루어 보기
- 이번에 프로젝트에서 동시성 관련 방어 코드 및 테스트 코드를 작성하고 싶었지만 그러지 못하였습니다. 지금 제가 가진 프로젝트에서 발생할 수 있는 동시성 문제로는 우선 생각나는 것이 설문 조사 양식을 생성 시 여러 스레드가 한번에 생성을 시도 시 아무래도 Version 이 잘 못 생성 될 여지가 있습니다. (version 을 먼저 조회 후 해당 마지막 버전에서 +1 을 하므로) 해당 테스트 코드 한번 다음에 짜볼 수 있도록 하겠습니다 !

6. 캐싱 다루기
- 사실 프로젝트를 하면서 이번에 설문 조사 양식 또한 캐싱을 하면 많은 성능 상 이점을 가질 수 있을 것 이라고 생각하였습니다. 설문 조사 양식은 업데이트 하지 않는 이상 똑같은 설문 조사 양식을 반환해주므로 캐싱하기에 적절한 데이터라고 느꼇습니다. 처음 생성시 캐시 생성 해 주고 해당 동일한 타이틀의 설문조사가 업데이트 시 Caching 을 evict 해주는 식으로 구현을 하면 될 것 같습니다 ! 

구현 API (많이 미흡합니다 ㅜㅜ)

  • 설문조사 생성 및 수정 API
  • 설문 조사 양식 조회 API
  • 설문 조사 양식 ID 기반 답변 조회 API
  • 설문 조사 답변 검색 API

스크린샷 2024-12-07 오전 9 08 28

@devch37 devch37 added the WIP 작업을 진행중일 때 사용 label Nov 25, 2024
@devch37 devch37 requested a review from heli-os November 25, 2024 15:28
@devch37 devch37 self-assigned this Nov 25, 2024
@devch37 devch37 marked this pull request as draft November 26, 2024 13:26
@devch37 devch37 added this to the 2024.12.07 milestone Nov 29, 2024
@devch37 devch37 marked this pull request as ready for review December 6, 2024 11:25
@devch37 devch37 added the Needs Review 작업이 완료되어 리뷰가 필요할 때 사용 label Dec 6, 2024
@devch37 devch37 removed the WIP 작업을 진행중일 때 사용 label Dec 6, 2024
Comment thread build.gradle.kts
Comment on lines +26 to +61
subprojects {
group = "com.ic"
version = "0.0.1-SNAPSHOT"
val kotlinJacksonDateTimeVersion by properties

repositories {
mavenCentral()
}

apply(plugin = "java")
apply(plugin = "kotlin")
apply(plugin = "kotlin-spring")
apply(plugin = "org.jlleitschuh.gradle.ktlint")

if (project.name != "survey-core") {
apply(plugin = "org.springframework.boot")
apply(plugin = "io.spring.dependency-management")

dependencies {
testImplementation("org.springframework.boot:spring-boot-starter-test")
}
}

dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.4.0")
implementation("org.jetbrains.kotlin:kotlin-reflect")

testImplementation("io.kotest.extensions:kotest-extensions-spring:1.1.2")
testImplementation("io.kotest:kotest-runner-junit5:5.5.0")
testImplementation("io.kotest:kotest-assertions-core:5.5.0")
testImplementation("io.kotest:kotest-property:5.5.0")
}

tasks.test {
useJUnitPlatform()
}

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

멀티 모듈에서 종속성 관리가 쉽지 않다는 걸 느꼇습니다 ㅎㅎ !

package survey.exception

enum class CustomHttpStatusCode(val code: Int, val message: String) {
// 1xx: Informational

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

core 모듈이 스프링의 종속적이지 않다보니 스프링의 HttpStatus 클래스를 사용 못하였습니다 ! 설계 미스 인 것 같습니다 ... !

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Needs Review 작업이 완료되어 리뷰가 필요할 때 사용

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant