특화 프로젝트 2주차 시작 🐥
저번주 중으로 설계가 대략적으로 마무리 되었기 때문에 이번주부터는 프로젝트 개발을 시작하게 되었습니다.
9월 2일 (월)
MR 템플릿 설정
코드 품질과 협업 효율성을 높이기 위해, MR(Merge Request) 템플릿을 설정하였습니다.
기존 공통 프로젝트에서 사용한 템플릿을 기반으로, 특화 프로젝트에 맞게 일부 변경을 하여 사용하였습니다. 코드 품질과 협업 효율성을 높이기 위해, MR(Merge Request) 템플릿을 설정하였습니다. 이전 프로젝트에서 사용한 템플릿을 기반으로, 특화 프로젝트에 맞게 일부 변경을 가했습니다. 공통 프로젝트에서는 스크린샷을 포함했으나, 이번에는 불필요한 복잡성을 줄이기 위해 제외하였습니다.
GitLab에서는 .gitlab/merge_requests_template/템플릿명.md 파일을 생성하여 MR 작성 시 선택할 수 있는 템플릿을 추가할 수 있습니다.
Issue 템플릿도 비슷하게 .gitlab/issue_templage/템플릿명.md 파일로 생성할 수 있지만 저희 팀은 Jira를 사용하기 때문에, Issue 템플릿은 따로 설정하지 않았습니다.
## 1. 무슨 이유로 코드를 변경했나요?
- [ ] feature 병합(feature issue #를 남겨주세요)
- [ ] 버그 수정(아래에 issue #를 남겨주세요)
- [ ] 코드 개선
- [ ] 기타(아래에 자세한 내용 기입해주세요)
<br>
## 2. 어떤 위험이나 장애를 발견했나요?
<br>
## 3. 완료 사항
<br>
## 4. 추가 사항
9월 3일 (화)
현업 전문가 리뷰
특화 프로젝트에서는 각 도메인에 맞는 현업자분께 피드백을 받을 기회가 있었습니다. 저희는 빅데이터를 활용한 추천 시스템을 개발 중이었고, 이에 대한 유용한 피드백을 받을 수 있었습니다.
9월 4일 (수)
MSA 구조 설계
본격적으로 프로젝트의 MSA 구조 설계를 하였습니다.
저희는 하나의 레포지토리 내에 각 서비스별로 폴더와 브랜치를 구성하여 관리하였으며, 주요 서비스는 다음과 같이 나누었습니다:
(정답은 없다!)
backend
ㄴ eureka-server
ㄴ gateway-server
ㄴ config-server
ㄴ auth-server
ㄴ user-server
ㄴ problem-server
ㄴ recommend-server
ㄴ common-server
폴더 구조 설계
각 서비스 내에서 폴더 구조는 domain과 global로 나누어 설계했습니다.
- domain : 프로젝트 핵심 도메인과 관련된 코드를 모아 둔 폴더
- global : 프로젝트 전반에 걸쳐 공통으로 사용되는 클래스
domain 하위 패키지
- controller :
- controller 클래스가 존재
- service :
- 주로 service 클래스들이 존재
- 서비스 로직과 비즈니스 로직 처리
- repository :
- repository 클래스들로 구성
- 데이터베이스 트랜잭션을 처리하는 클래스
- domain :
- entity 클래스들로 구성
- 특정 도메인에만 속하는 Embeddable, Enum 같은 클래스도 구성
- dto :
- dto 클래스들로 구성됩니다.
- 주로 Request와 Response 객체를 담는 클래스
- exception :
- 해당 도메인이 발생시키는exception 클래스들로 구성
global 하위 패키지
- common :
- 공통적으로 사용할 수 있는 클래스
- config :
- 각종 configuration 클래스로 구성
- error :
- 공통 exception, error와 관련된 클래스로 구성
- 예외 핸들링을 담당하는 클래스로 구성
- util :
- 공통적으로 사용할 유틸리티 클래스
com
ㄴ ssafy
ㄴ glu
ㄴ {서비스 명}
ㄴ domain
| ㄴ user
| | ㄴ controller
| | ㄴ service
| | ㄴ dto
| | ㄴ repository
| | ㄴ domain
| | ㄴ exception
| ㄴ post
| | ㄴ controller
| | ㄴ service
| | ㄴ dto
| | ㄴ repository
| | ㄴ domain
| | ㄴ exception
| ...
ㄴ global
| ㄴ common
| ㄴ config
| ㄴ error
| ㄴ util
| ㄴ shared
9월 5일 (목)
프로젝트 초기 세팅
프로젝트 초기 세팅 할 때, dependency를 정하고 하는 편인데...
이번 프로젝트에서는 사용하는 데이터베이스도 초기 계획했던 것과 달라졌고, MSA도 처음 사용해보았기 때문에 많이 바뀌었던 것 같습니다..
마지막에 남아있는 dependency를 공유해드리면 다음과 같은 주요 의존성을 사용했습니다:
plugins {
id 'java'
id 'org.springframework.boot' version '3.3.3'
id 'io.spring.dependency-management' version '1.1.6'
id 'com.ewerk.gradle.plugins.querydsl' version '1.0.10'
id "org.sonarqube" version "4.0.0.2929"
id 'jacoco'
}
group = 'com.ssafy.glu'
version = '0.0.1-SNAPSHOT'
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
ext {
set('springCloudVersion', "2023.0.3")
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.cloud:spring-cloud-starter-config'
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
// Lombok
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok' // 테스트를 위한 세팅
testImplementation 'org.projectlombok:lombok' // 테스트를 위한 세팅
// test
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
// JWT
implementation 'io.jsonwebtoken:jjwt-api:0.11.5'
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5'
runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.5'
// Swagger
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0'
// Slf4j
implementation 'org.slf4j:slf4j-api:2.0.6'
// logback
implementation 'ch.qos.logback:logback-classic:1.4.1'
//==QueryDsl==//
implementation 'com.querydsl:querydsl-core'
implementation('com.querydsl:querydsl-mongodb') {
exclude group: 'org.mongodb', module: 'mongo-java-driver' // MongoDB 드라이버를 Spring과 QueryDSL이 각각 가지고 있어서 충돌
}
implementation "com.querydsl:querydsl-apt"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor 'org.springframework.boot:spring-boot-starter-data-mongodb'
// Kafka
implementation 'org.springframework.kafka:spring-kafka'
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
// 컴파일러 옵션에 annotationProcessor 직접 지정
tasks.named('test') {
useJUnitPlatform()
}
def querydslGeneratedDir = "$buildDir/generated/querydsl"
querydsl {
library = "com.querydsl:querydsl-apt"
springDataMongo = true
querydslSourcesDir = querydslGeneratedDir
}
sourceSets {
main.java.srcDir querydslGeneratedDir
}
configurations {
querydsl.extendsFrom compileClasspath
}
compileQuerydsl {
options.annotationProcessorPath = configurations.querydsl
}
sonarqube {
properties {
property "sonar.projectKey", ""
property "sonar.host.url", ""
property "sonar.login", ""
property "sonar.java.enablePreviewFeatures", "true"
property "sonar.scm.provider", "git"
property "sonar.java.binaries", "$buildDir\\classes\\java\\main"
}
}
jacocoTestReport {
reports {
xml.required.set(true) // or xml.outputLocation.set(file("path/to/xml"))
}
}
test.finalizedBy jacocoTestReport
tasks["sonar"].dependsOn(build,jacocoTestReport)
이외에도 Swagger 설정, Error 관리 설정, Shared 코드 생성과 같은 기능을 구현하였습니다.
9월 6일 (금)
학습학습
이번 프로젝트에서 MSA와 MongoDB를 처음 도입하였기 때문에, 학습과 개발을 동시에 진행했습니다. 다행히 팀 내에서 MSA를 적용해본 경험이 있는 팀원이 있어 프로젝트 진행이 원활했습니다.
API 개발 시작
백엔드 파트는 역할 분담을 모두 한 이후, API 개발을 시작하였습니다.
하지만 ERD 설계를 수정하면서, MongoDB에서 여러 데이터를 join으로 처리하는 대신 Embedded 방식을 사용해 성능을 개선했습니다. 특히, API 개발 중에 이러한 설계 변경으로 인해 많은 코드를 다시 작성해야 했습니다...😭
사실, 특화 프로젝트가 끝난 지 2주가 지나서야 이 글을 작성하게 되었기에 세부적인 기억이 희미한 부분도 있습니다. 그럼에도 불구하고, 기록을 남기는 것이 나중에 돌아봤을 때 큰 도움이 될 것 같아 지금이라도 정리해봅니다....!
'SSAFY' 카테고리의 다른 글
[SSAFY] 특화 프로젝트 1주차 기록📝 (0) | 2024.10.04 |
---|---|
[SSAFY] 특화 프로젝트 부트캠프 기록📝 (3) | 2024.09.10 |
[SSAFY] 공통 프로젝트 회고 (10) | 2024.09.02 |
[SSAFY] 1학기 회고 (0) | 2024.07.01 |
[SSAFY] SSAFY TOGETHER 캠페인: 싸피 투게더 스낵으로 함께 성장하며 에너지 충전하기 (0) | 2024.05.18 |