-
Notifications
You must be signed in to change notification settings - Fork 1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
main 브랜치 병합 #31
main 브랜치 병합 #31
Conversation
server/.gitignore
Outdated
src/main/generated/** | ||
|
||
src/main/resources/application-prd.yml | ||
src/main/resources/application.properties No newline at end of file |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
주어진 코드 패치를 살펴보고 간단한 코드 리뷰를 도와드리겠습니다. 버그의 위험과 개선 제안을 환영합니다.
- gradle-app.setting 파일을 .gitignore에 추가하였습니다.
- *.hprof 파일을 .gitignore에 추가하였습니다.
- src/main/generated/ 디렉토리를 .gitignore에 추가하였습니다.
- src/main/resources/application-prd.yml 파일을 .gitignore에 추가하였습니다.
- src/main/resources/application.properties 파일을 .gitignore에 추가하였습니다.
- 파일의 끝에 줄바꿈 문자가 없습니다.
개선 제안:
- 마지막 줄에 줄바꿈 문자를 추가하는 것이 좋습니다. 문제는 없지만, 일부 유지보수 도구에서는 이 부분이 필요할 수 있습니다.
버그 위험 요소:
현재 코드 패치에서는 알려진 특정 버그 위험이나 문제가 없습니다. 그러나 전체 프로젝트 컨텍스트에 따라 추가적인 버그 위험 요소가 있을 수 있습니다. 코드 작동 여부나 다른 관련 파일들이 올바르게 설정되었는지 확인하는 것이 중요합니다.
# 6. 로그 확인으로 프로세스 정상 동작 확인. | ||
tail -f nohup.out | ||
``` | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
코드 패치의 주요 취지는 수동으로 프로젝트를 배포하는 방법을 설명하는 것입니다. 개선을 위해 고려할 수 있는 몇 가지 사항이 있습니다:
-
프로세스 종료: 프로세스를 강제로 종료하는
kill -9
명령어는 좋은 방식은 아닙니다. 먼저 정상적인 종료를 시도한 후에도 종료되지 않는 경우에만 사용해야 합니다. -
테스트 제외 옵션:
./gradlew build --exclude-task test
명령어는 테스트를 실행하지 않고 빌드하는 옵션이며, 이는 빌드 속도를 향상시킬 수 있습니다. 그러나 실제 배포에서는 테스트를 건너뛰지 않고 실행하는 것이 좋습니다. 테스트를 수행하여 프로덕션 환경에 안정성을 확인할 수 있습니다. -
로그 확인: 현재 구현은 nohup.out 파일의 로그를 작은 변화들을 파악하기 위해 계속해서 확인하고 있습니다. 대신 로깅 프레임워크(log framework)를 사용하는 것이 더 유용합니다. 예를 들어, Logback 또는 Log4j와 같은 프레임워크를 통해 로그 레벨, 파일 로테이션 및 압축 정책 등 다양한 로깅 옵션을 구성할 수 있습니다.
-
자동화: 배포 과정을 더 자동화하여 개발자의 개입을 줄일 수 있는 방법을 고려해 보세요. CI/CD 도구를 사용하여 코드 변경이 감지되면 자동으로 프로젝트를 빌드하고 테스트하며, 서버에 배포하는 과정을 자동화할 수 있습니다.
-
스크립트 문서화: 배포 절차를 완전히 이해하기 위해 스크립트에 설명을 추가하는 것이 좋습니다. 주석 또는 문서 형태로 프로젝트 초기화, 데이터 마이그레이션 등의 단계를 자세히 설명해야 합니다.
-
보안 및 환경 분리: 서버 환경 변수나 암호화된 설정 파일을 사용하여 중요한 정보(예: DB 연결 정보, 비밀 키, 인증 정보)와 같은 보안 관련 사항을 보호하세요. 또한 개발, 테스트 및 운영 환경을 분리하여 각각의 요구사항에 맞게 설정하세요.
-
상기 내용 명시: 최신 업데이트로 인해 코드 패치 내 코드가 변경되었다면 해당 사항을 설명에 명시하는 것이 도움이 될 수 있습니다.
이 코드 리뷰에서는 주요한 버그나 위험 요소를 찾지 못했습니다. 단, 위에 제시된 개선 사항을 고려하여 프로세스를 더 안전하게 만들고 효율성을 높일 수 있습니다.
<logger name="jdbc.resultsettable" level="DEBUG"/> | ||
<logger name="jdbc.connection" level="OFF"/> | ||
|
||
</configuration> No newline at end of file |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 코드 패치는 로그 설정 파일인 logback.xml입니다. 기본적으로 STDOUT(appender name="STDOUT")와 DAILY_ROLLING_FILE_APPENDER(appender name="DAILY_ROLLING_FILE_APPENDER")라는 두 개의 appender가 정의되어 있습니다.
STDOUT appender는 콘솔에 로그를 출력하는 appender입니다. 로그 레이아웃은 ch.qos.logback.classic.PatternLayout을 사용하며, 날짜, 로그 레벨, 로거 이름 및 메시지 정보 등이 포함됩니다.
DAILY_ROLLING_FILE_APPENDER appender는 파일에 로그를 저장하는 appender입니다. 로그 파일은 ${LOGS_PATH}/logback.log 경로에 생성되며, 로그 형식은 날짜와 시간, 스레드 이름, 로그 레벨, 로거 이름, 메시지가 포함된 형태입니다. rollingPolicy로는 시간 기반 롤링 정책(TimeBasedRollingPolicy)를 사용하고, fileNamePattern을 통해 매일 새로운 로그 파일을 생성합니다. maxFileSize로 파일 크기를 제한하고, maxHistory를 통해 보존할 이전 로그 파일의 수를 설정합니다.
파일 로깅을 위해 com.bside.bside_311 로거가 DEBUG 레벨로 설정되었습니다. root 로거는 INFO 레벨로 설정되어 있으며, 두 가지 appender(DAILY_ROLLING_FILE_APPENDER와 STDOUT)를 참조합니다.
jdbc로 시작하는 로거들은 불필요한 로깅을 제어하기 위해 OFF 레벨로 설정되었습니다.
더 나은 점진적 개선 사항:
- 로그 파일 경로를 환경 변수를 통해 가져오도록 변경합니다.
- 최종 행에 줄 바꿈 문자(\n)을 추가하거나 삭제하여, 파일 끝에서 줄 바꿈 문제를 해결합니다.
### operation log | ||
replay_pid.*.log | ||
hs_err_pid.*.log | ||
nohup.out No newline at end of file |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@@ -266,3 +266,20 @@ gradle-app.setting
*.hprof
https://www.toptal.com/developers/gitignore/api/java,macos,windows,intellij,gradle의 끝
src/main/generated/** // 생성된 소스 코드가 저장되는 디렉토리
src/main/resources/application-prd.yml // 운영 환경에 대한 설정 파일
src/main/resources/application.properties // 애플리케이션 속성 파일
로그
logs/ // 로그 파일들이 저장되는 디렉토리입니다.
보안 정보
application.yml // 보안 관련 정보를 포함하는 설정 파일입니다.
작업 로그
replay_pid..log // replay_pid로 시작하고 .log로 끝나는 로그 파일
hs_err_pid..log // hs_err_pid로 시작하고 .log로 끝나는 로그 파일
nohup.out
echo "> JAR Name: $JAR_NAME" | ||
|
||
nohup java -jar $REPOSITORY/"$JAR_NAME" --spring.profiles.active=prd & | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
위의 코드 패치는 다음과 같은 내용을 가지고 있습니다:
- 스크립트에서는 주어진 경로에 있는 Git 레포지토리에서 소스 코드를 가져와 빌드하는 작업을 합니다.
gradlew
및deploy.sh
파일에 대한 실행 권한을 변경합니다.- 프로젝트를 빌드하고 생성된 JAR 파일을 지정된 경로로 복사합니다.
- 현재 동작 중인 어플리케이션 프로세스를 확인하고, 있다면 종료시키고 새 어플리케이션을 배포합니다.
개선 제안:
- 스크립트 초기 부분에 "prd" 또는 "local" 등의 변수를 사용하여 환경 변수를 설정할 수 있습니다. 이는 실행 환경에 따라 경로가 달라질 수 있는 경우 유용합니다.
- Gradle 빌드 시
--exclude-task test
옵션을 사용하여 테스트를 건너뛸 수 있습니다. 그러나 이는 테스트를 고려하지 않고 빌드하는 것이므로 신중하게 결정해야 합니다. - 어플리케이션 프로세스를 강제로 종료하는
kill -9
명령어는 강력한 종료 방법입니다. 가능하면 더 안전한 종료 방법(예:kill -15
)을 사용하는 것이 좋습니다. - nohup 및 백그라운드 실행(
&
)을 사용하여 어플리케이션을 배포할 때 더욱 견고한 구조를 만들 수 있습니다. 어플리케이션 실행 시 로그 파일 등을 작성하고, 해당 로그 파일을 모니터링할 수 있는 기능을 추가하는 것도 고려해볼만 합니다.
버그 위험 사항:
위의 코드 스니펫에는 현재 버그나 보안 위험 요소가 보이지 않습니다. 그러나 전체 코드 범위와 환경 설정에 따라 추가적인 문제가 발생할 수 있으므로 주의해야 합니다.
//} | ||
jar { | ||
enabled = true | ||
archiveClassifier = '' // Classifier 제거 | ||
} No newline at end of file |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
코드 리뷰를 시작하겠습니다.
- 버전 관리
- 라이브러리와 플러그인의 버전이 업데이트되었습니다.
- 기본적으로 새 버전은 이전 버전과 비교해서 오류 수정, 성능 향상 및 보안 강화 등을 제공합니다.
- 그러나 해당 프로젝트에 맞는 최신 버전 여부와 호환성을 고려해야 합니다.
- 코드 형식
- 들여쓰기에 일관성이 없습니다. 스페이스 대신 탭을 사용하는 것이 좋으며, 각 줄마다 일관된 간격을 유지해야 합니다.
- 단일 라인 주석 (
//
)과 블록 주석 (/* ... */
)이 혼용되었습니다. 주석 스타일을 통일하는 것이 좋습니다.
- 종속성
- 몇몇 종속성이 추가되고 있습니다. 버전과 호환성을 확인하고 프로젝트 요구사항에 맞는지 확인해야 합니다.
- 추가된
spring-boot-starter-validation
라이브러리는 유효성 검사를 위한 Spring Boot 스타터입니다. 해당 필요성 여부를 확인해야 합니다.
- 주석
- 주석 처리된 부분에
profile
변수가 사용되는 부분이 있는데, 해당 변수와 관련된 코드가 주석 처리되어 있습니다. 이는 나중에 문제를 일으킬 수 있으므로 주석을 확인하고 필요한 경우 수정해야 합니다.
- 테스트
- 기본적인 테스트 구성이 있지만, 더 다양한 테스트 케이스를 추가하는 것이 좋습니다.
- Jar 빌드
jar
태스크가 활성화되어 있으며,archiveClassifier
가 비어 있습니다. 클래스패스와 충돌하지 않도록 고유한 값을 제공하는 것이 좋습니다.
일반적으로 코드 리뷰에서 추천하는 사항들을 확인하였습니다. 하지만 코드의 모든 세부사항을 파악하기 위해서는 해당 코드를 완전하게 이해해야 하므로, 개발 특정 내용과 프로젝트 요구사항 등을 추가로 고려하여 리뷰해야 합니다.
echo "> JAR Name: $JAR_NAME" | ||
|
||
nohup java -jar $REPOSITORY/"$JAR_NAME" --spring.profiles.active=prd & | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 코드 패치는 다음과 같은 리뷰를 할 수 있습니다:
-
REPOSITORY
변수의 경로가 하드코딩되어 있으므로, 서버 환경에 맞게 수정할 필요가 있습니다. (예: prd 또는 local) -
PROJECT_LOCATION_FOLDER_NAME
및PROJECT_NAME
변수도 하드코딩되어 있는데, 이러한 값을 환경변수에서 가져오는 것이 중요합니다. 그렇게 함으로써 코드의 유연성과 재사용성을 높일 수 있습니다. -
echo
구문을 사용하여 현재 진행 상황을 출력하는 것은 좋은 점입니다. 이를 통해 사용자가 스크립트를 실행할 때 어떤 단계가 진행되고 있는지 알 수 있습니다. -
git pull
명령어를 통해 최신 변경 사항을 가져오고 있습니다. 이 단계에서 컨플릭트나 충돌이 발생할 수 있으므로, 해당 상황에 대한 처리 방법이 필요할 것입니다. -
프로젝트 빌드 단계에서
./gradlew build --exclude-task test
명령어를 통해 빌드를 진행하고 있습니다. 이는 테스트를 제외한 빌드를 수행하는 방식으로 보입니다. 그러나 테스트를 무시하고 빌드하는 것은 좋은 접근법이 아닐 수 있으므로, 이 부분을 다시 확인해야 할 것입니다. -
프로세스 ID를 확인하고 해당 프로세스를 종료하는 단계에서
kill -9 "$CURRENT_PID"
를 사용하여 SIGKILL 시그널을 보내고 있습니다. 일반적으로는 프로세스에게 정상적으로 종료할 기회를 주기 위해 먼저 SIGTERM 시그널을 보내는 것이 좋습니다. -
새로운 애플리케이션 배포 단계에서 백그라운드에서 실행될 때
nohup
명령어가 사용되는데, 실행 중에 오류가 발생한 경우 오류 로그를 확인할 수 없습니다. 따라서 문제가 발생할 경우 디버깅이 어려울 수 있습니다. 에러 처리 부분을 개선하여 문제가 발생한 경우 적절한 조치를 취할 수 있도록 해야 합니다. -
코드가 Bash 스크립트로 작성되어 있는데, 쉘 스크립트의 안전한 운영을 위해 변수 확장과 따옴표 사용을 고려해야 합니다. 예를 들어,
"$REPOSITORY"
,"$JAR_NAME"
과 같이 변수를 따옴표로 감싸주는 것이 좋습니다.
이를 토대로 코드에 대한 버그 및 개선 사항을 파악하고 수정할 수 있을 것입니다.
//} | ||
jar { | ||
enabled = false | ||
// archiveClassifier = '' // Classifier 제거 | ||
} No newline at end of file |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
다음은 코드 패치입니다. 코드 리뷰 및 버그 위험과 개선 제안을 진행하겠습니다:
plugins {
id 'java'
id 'org.springframework.boot' version '3.1.5'
id 'io.spring.dependency-management' version '1.1.3'
// id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
}
group = 'com.bside'
version = '0.0.1-SNAPSHOT'
java {
sourceCompatibility = '17'
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.2'
compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
runtimeOnly 'com.h2database:h2'
runtimeOnly 'com.mysql:mysql-connector-j'
annotationProcessor 'org.projectlombok:lombok'
// spring boot 3.0 query dsl setting.
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
// p6spy : sql 로그 남기기(바인딩된 파라미터 간편 확인.)
implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.0'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter-test:3.0.2'
}
tasks.named('test') {
useJUnitPlatform()
}
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation("org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2")
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-webflux'
implementation 'com.cloudinary:cloudinary-http44:1.35.0'
implementation 'io.hypersistence:tsid:1.1.0'
implementation 'org.bouncycastle:bcprov-jdk15on:1.70'
implementation 'io.jsonwebtoken:jjwt:0.9.1'
implementation 'com.sun.xml.bind:jaxb-impl:4.0.1'
implementation 'com.sun.xml.bind:jaxb-core:4.0.1'
implementation 'javax.xml.bind:jaxb-api:2.4.0-b180830.0359'
implementation 'org.apache.commons:commons-collections4:4.4'
runtimeOnly 'com.mysql:mysql-connector-j'
jar {
enabled = false
}
버그 위험:
- 'querydsl' 관련 의존성에 주석 처리가 되어 있습니다. 해당 의존성이 필요한 경우 주석을 제거해야 합니다.
개선 제안:
- 코드에 일관된 들여쓰기를 적용하면 가독성을 높일 수 있습니다.
- 의존성 관리를 위해
dependencyManagement
블록이 필요할 수 있습니다. configureondemand = true
와 같은 성능 향상을 위해 Gradle 설정을 추가할 수 있습니다.
echo "> JAR Name: $JAR_NAME" | ||
|
||
nohup java -jar $REPOSITORY/"$JAR_NAME" --spring.profiles.active=prd & | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 코드는 주어진 저장소에서 프로젝트를 빌드하고 배포하는 스크립트입니다. 아래는 몇 가지 개선 및 버그 위험 사항입니다:
- 현재 코드에는 큰 문제가 없어 보입니다. 그러나 여전히 귀중한 내용을 생략한 가벼운 리뷰입니다.
- REPOSITORY 경로를 지정할 때 절대 경로를 사용하되, 다른 사람도 해당 코드를 실행할 수 있도록 유연성을 고려하여 변경할 수 있는 방법을 추가하는 것이 좋습니다.
- 스크립트를 실행하기 전에 필요한 종속성이 모두 설치되어 있는지 확인하고, 필요한 경우 오류 메시지를 출력하는 부분을 추가하는 것이 좋습니다.
- kill 명령을 사용하여 애플리케이션을 중지하는 대신, 애플리케이션이 제대로 종료되도록 'stop' 스크립트를 추가하는 것이 좋습니다.
- pid 파일을 사용하여 애플리케이션을 중지하는 방법을 고려해 볼 수 있습니다. 애플리케이션을 종료할 때 생성하고 시작할 때 이 값을 확인하여 중복 실행을 방지할 수 있습니다.
- 릴리즈 버전 정보를 파일에 저장하는 부분을 활성화하려면 주석 해제와 관련된 코드를 추가해야 합니다.
이러한 개선 사항을 고려하여 코드를 개선할 수 있습니다.
echo "> JAR Name: $JAR_NAME" | ||
|
||
nohup java -jar $REPOSITORY/"$JAR_NAME" --spring.profiles.active=prd & | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 코드 패치는 다음과 같은 사항들에 대해 검토하고 있습니다. 잠재적인 버그 위험과 개선 제안이 환영됩니다.
- "REPOSITORY" 변수가 서버에서 절대 경로로 설정되어 있는데, 이 경로가 올바른지 확인해야 합니다.
- "PROJECT_LOCATION_FOLDER_NAME"과 "PROJECT_NAME" 변수도 올바른 값으로 설정되어야 합니다.
- "git pull" 명령어를 사용하여 최신 변경 사항을 가져오고 있습니다. 이 작업 전에 변경 사항을 커밋하거나 백업해야 할 수 있습니다.
- "gradlew" 파일과 "deploy.sh" 파일의 실행 권한이 변경되고 있습니다. 필요에 따라 이 부분을 검토하고 적절한 권한을 설정해야 합니다.
- "./gradlew build --exclude-task test" 명령어를 사용하여 프로젝트 빌드를 진행하고 있습니다. 테스트와 관련된 작업을 제외시켜야 하므로, 해당 옵션이 필요한지 확인해야 합니다.
- "/build/libs/*.jar" 경로에서 JAR 파일을 복사하고 있는데, 해당 경로에 실제로 빌드된 JAR 파일이 존재하는지 확인해야 합니다.
- 현재 실행 중인 애플리케이션의 PID를 확인하고, 해당 애플리케이션을 중지시키고 새로운 JAR 파일을 배포하는 로직이 구현되어 있습니다. 이 부분의 동작이 예상대로 실행되는지 확인해야 합니다.
- "nohup java -jar" 명령어를 사용하여 새로운 JAR 파일을 백그라운드에서 실행하고 있습니다. 필요한 프로파일과 함께 정확한 JAR 파일이 실행되는지 확인해야 합니다.
위의 사항들을 검토하고 주의해야 할 점이나 개선할 수 있는 부분을 확인하세요.
echo "> JAR Name: $JAR_NAME" | ||
|
||
nohup java -jar $REPOSITORY/"$JAR_NAME" --spring.profiles.active=prd & | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
아래는 코드 패치에 대한 간단한 코드 리뷰입니다. 버그 위험과/또는 개선 제안 사항을 환영합니다:
- 이 스크립트는 Bash 셸에서 실행됩니다.
- REPOSITORY 변수는 프로젝트가 배포된 위치를 나타냅니다. 실제 경로가 올바른지 확인하세요.
- 현재 작업 디렉토리를 해당 프로젝트 폴더로 변경하는 것이 좋습니다(cd $REPOSITORY/$PROJECT_LOCATION_FOLDER_NAME/).
- "Git reset --hard" 명령으로 현재 코드를 원격 저장소의 최신 코드로 초기화할 수 있습니다.
- "git pull" 명령으로 코드를 최신 버전으로 업데이트할 수 있습니다.
- "./gradlew build --exclude-task test" 명령은 프로젝트를 빌드합니다. "--exclude-task test" 플래그는 테스트를 건너뛰도록 지정합니다.
- 빌드된 JAR 파일을 적절한 위치에 복사하는데, $REPOSITORY 변수 값이 정확한지 확인하세요.
- 현재 실행중인 애플리케이션의 pid를 확인하여 종료할 수 있습니다.
- kill 명령어를 사용하여 프로세스를 종료하며, -9 옵션은 SIGKILL 시그널을 사용하여 강제 종료합니다.
- 새로운 어플리케이션을 nohup 명령어를 사용하여 실행하고, 로그인 세션이 종료되더라도 계속 실행됩니다.
- "--spring.profiles.active=prd" 플래그를 사용하여 활성화할 스프링 프로필을 지정합니다.
위의 사항들을 확인하여 코드를 검토하고 개선할 수 있습니다.
echo "> JAR Name: $JAR_NAME" | ||
|
||
nohup java -jar $REPOSITORY/"$JAR_NAME" --spring.profiles.active=prd & | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 코드 패치는 다음 작업을 수행합니다:
- 지정된 경로에서 Git 저장소를 설정하고, 리셋 후 풀링합니다.
- 권한 변경과 프로젝트 빌드 작업을 수행합니다.
- Build 파일을 복사하고, 현재 실행 중인 애플리케이션의 PID를 확인합니다.
- 현재 애플리케이션이 실행 중인 경우에는 해당 PID를 종료시킵니다.
- 새로운 애플리케이션을 배포합니다.
개선점:
- 주석이 부족하여 코드의 의도와 작동 방식을 이해하기 어렵습니다. 주석을 추가하여 코드를 설명하는 것이 좋습니다.
- 스크립트가 오류 처리 기능을 포함하지 않으므로 예외 상황에 대비한 오류 처리를 추가하는 것이 좋습니다.
- 하드 코딩된 경로를 변수로 대체하여 유지 관리 및 이식성을 향상시킬 수 있습니다.
- 백그라운드에서 실행되는
nohup
명령어 사용 시 로그 파일에 대한 경로를 지정하는 것이 좋습니다.
잠재적인 버그 위험:
- 스크립트가 여러 사용자에게 공유되는 경우, 보안 문제가 발생할 수 있으므로 파일 및 디렉토리 권한에 유의해야 합니다.
- 명령어 실행 시, 결과를 검사하지 않고 바로 다음 명령을 실행하므로 예기치 않은 오류가 발생할 수 있습니다.
주의: 이 정보는 제가 2021년 9월까지 알려진 내용을 기반으로 작성된 것이며, 최신 업데이트 내용은 확인되지 않았습니다.
.addSecurityItem(new SecurityRequirement().addList("token")); | ||
} | ||
|
||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 코드는 Swagger 설정을 위한 일부분인 것 같습니다. 여러 개의 Bean을 생성하고, OpenAPI 객체를 구성하여 필요한 정보를 설정합니다.
개선 제안:
- 주석 처리된 변수들(
serviceVersion
,projectVersion
등)을 삭제해도 됩니다. @Slf4j
애너테이션이 사용되고 있지만, 해당 클래스에서 로그가 사용되지 않으므로 제거해도 됩니다.- API 그룹화를 위해
testApi()
와nonTestApi()
메서드에서 패키지를 스캔하고 있습니다. 필요한 패키지로 업데이트해야 합니다. title("")
과description("")
에 빈 문자열을 사용하고 있습니다. 적절한 값을 제공해야 합니다.
버그 리스크:
- 특별한 버그 리스크는 보이지 않습니다.
전반적으로 코드 리뷰에는 개발 환경과 상황에 따라 유효성과 완성도를 평가할 수 있는 추가 정보가 필요합니다.
@Retention(RetentionPolicy.RUNTIME) | ||
@PreAuthorize("hasAnyRole('ROLE_ADMIN')") | ||
public @interface AdminRequired { | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 코드 패치는 com.bside.bside_311.config.security
패키지에 AdminRequired
라는 커스텀 어노테이션을 추가하는 것으로 보입니다. 이 어노테이션은 메소드나 타입에 적용되며, 해당 요소를 실행하기 전에 사용자가 'ROLE_ADMIN' 역할을 가지고 있는지 확인하는 PreAuthorize
어노테이션을 사용합니다.
이 코드 patch의 주요 기능인 AdminRequired
어노테이션은 현재 시큐리티 관련 설정이 필요한지에 대한 검사를 수행합니다. 이를 통해 관리자 권한이 필요한 요청이나 작업에 대한 보안을 강화할 수 있습니다.
아쉽게도, 코드의 완전한 컨텍스트를 알지 못하므로 문제점이나 개선을 제안하는 것은 제한적입니다. 그러나 일반적으로 아래와 같은 사항에 유의하여 코드를 개선할 수 있습니다:
hasAnyRole('ROLE_ADMIN')
의 하드 코딩된 역할 이름은 보안 구성에서 매직 스트링을 사용하는 것보다는 구성 파일 등 외부 리소스에서 관리하는 것이 좋습니다.- 어노테이션 이름(
@AdminRequired
)이 보다 명확하고 의미롭게 지어져야 합니다. 어노테이션을 적용한 코드에서 해당 어노테이션이 하는 역할을 쉽게 이해할 수 있도록 해야 합니다. - 이 어노테이션은 현재
PreAuthorize
를 사용하고 있지만, 그 밖의 다른 시큐리티 관련 설정과의 호환성을 고려하여 선택한 것인지 확인해야 합니다.
더 자세한 리뷰를 위해서는 코드 패치를 사용하는 컨텍스트와 프로젝트의 전반적인 문맥에 대한 정보가 더 필요합니다.
@Retention(RetentionPolicy.RUNTIME) | ||
@PreAuthorize("hasAnyRole('ROLE_USER', 'ROLE_ADMIN')") | ||
public @interface UserRequired { | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 코드 패치는 com.bside.bside_311.config.security
패키지에 UserRequired
라는 커스텀 애너테이션을 정의하는 것으로 보입니다. 해당 애너테이션은 메소드 또는 타입에 대해 @PreAuthorize("hasAnyRole('ROLE_USER', 'ROLE_ADMIN')")
를 사용하여 엑세스 제한 조건을 설정합니다.
버그 위험이라기보다는 개선 제안을 드릴 수 있습니다:
hasAnyRole
메소드 대신hasAnyAuthority
메소드를 사용하는 것이 좋습니다.hasAnyRole
은 문자열 형태로 롤 이름만 받아들이고,hasAnyAuthority
는 다양한 유형의 인증 권한(ex: ROLE_USER)을 받아들일 수 있기 때문입니다.UserRequired
애너테이션의 설명 주석(comment)을 추가하여 해당 애너테이션이 어떤 역할을 하는지 명확하게 표현하는 것이 좋습니다.
이외에도 구체적인 코드 및 라이브러리 버전 정보 등이 없어서 더 자세한 리뷰가 어렵습니다.
return alcoholService.getAlcoholDetail(alcoholNo); | ||
} | ||
|
||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 코드는 자바(Spring Framework)로 작성된 컨트롤러 클래스입니다. 해당 컨트롤러는 "/alcohols" 경로를 통해 술 관련 API를 제공합니다.
코드 리뷰 및 개선 제안:
@RestController
어노테이션을 사용하여 RESTful API 컨트롤러임을 명시하였습니다.AlcoholService
클래스의 의존성을 생성자 주입(@RequiredArgsConstructor
)을 통해 주입 받고 있습니다. 이는 좋은 방법입니다.- HTTP 메서드에 대한 각 API 메서드에
@Operation
,@GetMapping
,@PostMapping
,@PatchMapping
,@DeleteMapping
등의 어노테이션이 적용되어 있습니다. 이는 Swagger 문서 생성을 위한 어노테이션인 것으로 파악됩니다. GetAlcoholTypesResponseDto
를 반환하는getAlcoholTypes()
메서드,AddAlcoholResponseDto
를 반환하는addAlcohol()
메서드 등은 요청을 처리하고 응답을 반환하는 방법이 적합해 보입니다.editAlcohol()
메서드와deleteAlcohol()
메서드는void
타입을 반환하고 있으므로 성공 여부 등의 추가 정보를 클라이언트에게 전달하지 않습니다. 클라이언트가 추가적인 정보를 필요로 할 경우, 적절한 응답 형태를 정의하여 반환하는 것이 좋습니다.getAlcohol()
메서드는 페이징, 정렬 및 검색 기능을 제공하는데, 요청 파라미터로 받은 값을 이용해alcoholService
에서 쿼리를 수행하는 방식입니다. 코드에서 명시하지 않았지만, 적절한 입력 유효성 검사와 예외 처리를 추가하는 것이 좋습니다.getAlcoholDetail()
메서드는 단일 술 정보를 조회하여 반환하는 것으로 보입니다. 입력값의 유효성 검사와 해당 술이 존재하지 않을 경우에 대한 예외 처리를 추가하는 것이 바람직합니다.
안정성 관련 문제나 버그 위험은 이 코드에서 확인할 수 없었습니다. 그러나 코드 리뷰는 코드 품질과 가독성을 향상시키는 데 도움이 될 수 있습니다.
Long myUserNo = AuthUtil.getUserNoFromAuthentication(); | ||
attachService.deleteAttach(attachNo, myUserNo); | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 코드 패치에는 다음과 같은 사항을 주의해야 합니다:
AttachController
클래스가 정의되어 있습니다.userAttachPicture
메서드는 사진을 첨부하는 데 사용됩니다.@PostMapping
어노테이션으로 HTTP POST 요청을 처리합니다.- 경로는 "/attach/resources/{attachType}/{resourceNo}"입니다.
- 소비하는 미디어 유형은
MediaType.MULTIPART_FORM_DATA_VALUE
로 설정됩니다. UserRequired
어노테이션에 따라 사용자 인증이 필요합니다.UploadAttachResponseDto
를 반환합니다.
userDeletePicture
메서드는 사진을 삭제하는 데 사용됩니다.@DeleteMapping
어노테이션으로 HTTP DELETE 요청을 처리합니다.- 경로는 "/attach/{attachNo}"입니다.
UserRequired
어노테이션에 따라 사용자 인증이 필요합니다.
개선 제안:
- 예외 처리: 메서드 내에서 발생할 수 있는 예외를 적절히 처리해야 합니다. 예외 처리로부터 복구하거나 적절한 오류 응답을 반환해야 합니다.
- 로깅: 로그 메시지를 더 상세하게 기록하는 것이 도움이 될 수 있습니다. 현재는 몇 가지 로그 문구만 포함되어 있는데, 실패한 경우와 성공한 경우를 구분하고 더 정확한 정보를 기록하는 것이 좋습니다.
- 주석:
FIXME
주석으로 표시된 부분은 자원에 대한 접근 권한을 제한하는 조치로 남겨두었는데, 이 주석에 대한 설명을 추가하여 더 명확하게 나타낼 수 있습니다.
코드 리뷰 결과에는 개선 사항과 주의 사항이 포함되어 있으며, 이를 참고하여 코드의 안전성과 가독성을 높일 수 있습니다.
postService.likeCancelPost(userNo, postNo); | ||
} | ||
|
||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
위의 코드 패치는 PostController
라는 클래스로 게시글에 관련된 HTTP 요청을 처리하는 컨트롤러입니다. 주요 기능은 다음과 같습니다:
addPost
: 게시글을 등록하는 API입니다.editPost
: 게시글을 수정하는 API입니다.deletePost
: 게시글을 삭제하는 API입니다.getPosts
: 게시글 목록을 조회하는 API입니다.getPostDetail
: 게시글의 상세 정보를 조회하는 API입니다.addComment
: 게시글에 댓글을 등록하는 API입니다.getPostComments
: 게시글의 댓글을 조회하는 API입니다.editComment
: 게시글의 댓글을 수정하는 API입니다.deleteComment
: 게시글의 댓글을 삭제하는 API입니다.addQuote
: 포스트를 인용하는 인용글을 등록하는 API입니다.deleteQuote
: 인용글을 삭제하는 API입니다.getQuotesByPost
: 특정 포스트에 대한 인용글을 조회하는 API입니다.likePost
: 게시글을 좋아요하는 API입니다.likeCancelPost
: 게시글의 좋아요를 취소하는 API입니다.
코드 리뷰를 진행하겠습니다:
@Validated
어노테이션은 삭제해도 무방합니다. 사용하려는 경우에는 해당 클래스 패스에 의존성을 추가해야 합니다.@PathVariable
어노테이션에 이름을 명시하는 것은 권장되지 않습니다. 따라서@PathVariable("postNo")
를@PathVariable Long postNo
로 변경할 수 있습니다.@ResponseStatus(HttpStatus.CREATED)
는addComment
메서드에서만 사용되고 있으며,getPostComments
메서드에서는 잘못 사용되었습니다. 이 부분을 수정해야 합니다.Post.of()
와 같은 정적 팩토리 메서드가 있는 클래스는 확인되지 않았기 때문에 해당 코드의 구현 세부 정보는 알 수 없습니다. 코드 리뷰 상세 내용은 모델 학습 데이터까지만 기반으로 작성되었기 때문에 이 점을 참고하세요.
위의 사항을 고려하여 코드를 개선할 수 있습니다.
userService.unfollowUser(myUserNo, userNo); | ||
} | ||
|
||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 코드 패치는 UserController 클래스의 새로운 엔드포인트를 추가하는 것으로 보입니다. 몇 가지 개선 사항과 버그 위험 요소가 있을 수 있습니다:
-
signup()
및signupAdmin()
메서드에 대한 입력 유효성 검사(@Valid
)가 필요합니다. 따라서 적절한 예외 처리를 추가해야 합니다. -
login()
메서드에서 사용자 로그인을 처리할 때 예외 처리가 필요합니다. 잘못된 자격 증명으로 인한 실패나 기타 문제를 처리할 수 있도록 해야 합니다. -
비밀번호 변경을 처리하는
changePassword()
메서드에서 예외 처리를 고려해야 합니다. 적절한 예외 메시지와 함께 실패하는 경우에 대한 처리 방법을 결정해야 합니다. -
getMyInfo()
및getUserInfo()
메서드에 대한 예외 처리가 필요합니다. 해당 사용자를 찾을 수 없는 경우 등에 대한 처리 방식을 결정해야 합니다. -
사용자 정보 업데이트에 대한
updateUser()
메서드에서 사용자 번호를 가져오는 방법과 관련하여 현재의AuthUtil.getUserNoFromAuthentication()
메서드를 확인해야 할 수도 있습니다. -
followUser()
및unfollowUser()
메서드에서 팔로우/언팔로우 작업을 처리할 때 예외 상황에 대한 처리가 필요합니다. 팔로우할 사용자를 찾을 수 없거나 이미 팔로우한 사용자인 경우 등을 고려해야 합니다. -
모든 엔드포인트에서 적절한 HTTP 응답 코드를 반환하는지 확인해야 합니다. 성공, 실패 및 오류에 따라 적절한 HTTP 상태 코드(
@ResponseStatus
)와 함께 응답해야 합니다. -
마지막으로, 코드에서 사용되는 로깅(
log.info()
)은 유용하지만, 상황에 맞게 로깅 레벨과 메시지를 조정하면 좋습니다.
이러한 개선 사항과 예외 처리를 고려하면 코드의 안정성과 신뢰성을 향상시킬 수 있습니다.
} | ||
|
||
|
||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 코드 패치는 User
엔티티에 대한 내용입니다.
이 코드의 주요 기능과 구성 요소는 다음과 같습니다:
User
클래스는BaseEntity
클래스를 확장하고 있으며,Entity
어노테이션이 지정되어 있습니다.User
클래스는 다양한 필드가 정의되어 있으며, 이들은 데이터베이스 열과 매핑됩니다.Role
열거형 타입을 사용하여 사용자의 역할을 저장합니다.UserLike
,UserFollow
,PostLike
와 관련된 다양한 관계를 정의하기 위해@OneToMany
어노테이션을 사용하며, 각각의 리스트는 해당 관계의 목록을 나타냅니다.of
메서드를 사용하여User
객체를 생성할 수 있습니다.addFollowing
,addFollowed
,addPostLike
메서드는 양방향 관계를 유지하기 위해 사용되며, 관련된 객체들을 추가하고 설정하는 역할을 합니다.
이 코드의 버그 또는 개선 제안 사항은 직접적으로 확인되지 않습니다. 코드 리뷰 시에는 주로 코드 설계, 가독성, 성능 및 보안 관련 사항에 대해 검토됩니다. 코드의 특정 요구사항 또는 시스템 환경에 따라서 추가적인 개선 사항이 나올 수 있습니다.
} | ||
|
||
|
||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 코드 패치는 "local" 프로파일에 대한 Initializer
클래스입니다. 여기에서 몇 가지 초기화 작업이 수행됩니다.
개선 제안:
init()
메서드 내의 코드 블록을 리팩토링하여 저장 및 생성 작업을 분리하는 것이 좋습니다. 예를 들어,alcoholTypeRepository.save()
호출은 별도의 메서드로 추출할 수 있습니다.init2()
메서드는 현재 주석 처리되어 있으며 사용되지 않습니다. 필요하지 않은 코드를 삭제하는 것이 좋습니다.- 예외 처리를 고려해야 합니다.
JsonProcessingException
과 관련된 예외 처리를 추가하는 것이 좋습니다. - 코드에서 사용된 Magic Number를 상수로 정의하는 것이 좋습니다. 올바른 이름으로 상수를 사용하여 가독성을 향상시킬 수 있습니다.
- 자원 해제를 위해
SecurityContextHolder.getContext().setAuthentication(null)
를 호출하는 대신,try-finally
또는try-with-resources
구문을 사용하여 자원을 명시적으로 해제하는 것이 안전합니다.
버그 위험:
init()
메서드에서alcoholController.addAlcohol()
호출 시alcoholTypeNo
인수로 색인i % 4 + 1
을 전달하고 있습니다. 이 연산 결과가 알코올 유형의 존재 여부와 관련되지 않도록 주의해야 합니다. 색인이 0 또는 음수일 경우 예외가 발생할 수 있으므로 유효성 검사가 필요합니다.postController.addPost()
호출 시alcoholNo
인수는i + 1
로 설정되고 있습니다. 이러한 상황에서는 반복문 변수i
가 사용된 위치에 따라 알코올 식별자가 올바르지 않을 수 있으므로 주의해야 합니다.
위의 점들을 고려하여 코드를 개선하고 버그 위험을 최소화할 수 있습니다.
PR에 리뷰도 하고 제대로 하고 싶었는데, 못했네요.
추후 코드 보강하시죠!