Skip to content
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

feat: [UserService] 유저 아이디로 유저정보를 조회하는 gRPC 서버 코드를 추가합니다. #140

Merged
merged 16 commits into from
Jan 31, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
125 changes: 65 additions & 60 deletions .github/workflows/dockerhub-push.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,72 +12,77 @@ jobs:
runs-on: ubuntu-latest

steps:
- name: Checkout Repository
uses: actions/checkout@v2
- name: Checkout Repository
uses: actions/checkout@v2

- name: Set Environment Variables
run: |
BRANCH_NAME=$(echo $GITHUB_REF | awk -F'/' '{print $3}')
echo "BRANCH_NAME=$BRANCH_NAME" >> $GITHUB_ENV

- name: Cache Gradle dependencies
uses: actions/cache@v2
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
gradle-
- name: Set Environment Variables
run: |
BRANCH_NAME=$(echo $GITHUB_REF | awk -F'/' '{print $3}')
echo "BRANCH_NAME=$BRANCH_NAME" >> $GITHUB_ENV

- name: Set up JDK 17
uses: actions/setup-java@v2
with:
java-version: '17'
distribution: 'temurin'
- name: Cache Gradle dependencies
uses: actions/cache@v2
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
gradle-

- name: Grant execute permission for gradlew
run: chmod +x src/${{ env.BRANCH_NAME }}-service/gradlew
- name: Set up JDK 17
uses: actions/setup-java@v2
with:
java-version: '17'
distribution: 'temurin'

- name: Build with Gradle
env:
USER_DB_URI: ${{ secrets.USER_DB_URI }}
USER_DB_USERNAME: ${{ secrets.USER_DB_USERNAME }}
USER_DB_PASSWORD: ${{ secrets.USER_DB_PASSWORD }}
- name: Grant execute permission for gradlew
run: chmod +x src/${{ env.BRANCH_NAME }}-service/gradlew

SOCIAL_DB_USERNAME: ${{ secrets.SOCIAL_DB_USERNAME }}
SOCIAL_DB_PASSWORD: ${{ secrets.SOCIAL_DB_PASSWORD }}
SOCIAL_DB_URI: ${{ secrets.SOCIAL_DB_URI }}

run: |
cd src/${{ env.BRANCH_NAME }}-service
./gradlew clean build -x test
- name: Build with Gradle
env:
USER_DB_URI: ${{ secrets.USER_DB_URI }}
USER_DB_USERNAME: ${{ secrets.USER_DB_USERNAME }}
USER_DB_PASSWORD: ${{ secrets.USER_DB_PASSWORD }}

- name: Build and Push Docker Image
env:
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
BRANCH_NAME: ${{ env.BRANCH_NAME }}
SOCIAL_DB_USERNAME: ${{ secrets.SOCIAL_DB_USERNAME }}
SOCIAL_DB_PASSWORD: ${{ secrets.SOCIAL_DB_PASSWORD }}
SOCIAL_DB_URI: ${{ secrets.SOCIAL_DB_URI }}

USER_DB_URI: ${{ secrets.USER_DB_URI }}
USER_DB_USERNAME: ${{ secrets.USER_DB_USERNAME }}
USER_DB_PASSWORD: ${{ secrets.USER_DB_PASSWORD }}

SOCIAL_DB_USERNAME: ${{ secrets.SOCIAL_DB_USERNAME }}
SOCIAL_DB_PASSWORD: ${{ secrets.SOCIAL_DB_PASSWORD }}
SOCIAL_DB_URI: ${{ secrets.SOCIAL_DB_URI }}
PASSPORT_KEY: ${{ secrets.PASSPORT_KEY }}
PASSPORT_ALGORITHM: ${{ secrets.PASSPORT_ALGORITHM }}

run: |
if [ -n "$BRANCH_NAME" ]; then
DOCKERFILE_DIR="src/$BRANCH_NAME-service"
else
echo "Failed to extract branch name from GITHUB_REF."
exit 1
fi
run: |
cd src/${{ env.BRANCH_NAME }}-service
./gradlew clean build -x test

- name: Build and Push Docker Image
env:
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
BRANCH_NAME: ${{ env.BRANCH_NAME }}

cd $DOCKERFILE_DIR
docker run --privileged --rm tonistiigi/binfmt --install all
docker buildx create --use
docker login -u $DOCKER_USERNAME -p $DOCKER_PASSWORD
docker buildx build --platform=linux/amd64,linux/arm64 -t $DOCKER_USERNAME/$BRANCH_NAME-service:latest . --push

USER_DB_URI: ${{ secrets.USER_DB_URI }}
USER_DB_USERNAME: ${{ secrets.USER_DB_USERNAME }}
USER_DB_PASSWORD: ${{ secrets.USER_DB_PASSWORD }}

SOCIAL_DB_USERNAME: ${{ secrets.SOCIAL_DB_USERNAME }}
SOCIAL_DB_PASSWORD: ${{ secrets.SOCIAL_DB_PASSWORD }}
SOCIAL_DB_URI: ${{ secrets.SOCIAL_DB_URI }}

PASSPORT_KEY: ${{ secrets.PASSPORT_KEY }}
PASSPORT_ALGORITHM: ${{ secrets.PASSPORT_ALGORITHM }}

run: |
if [ -n "$BRANCH_NAME" ]; then
DOCKERFILE_DIR="src/$BRANCH_NAME-service"
else
echo "Failed to extract branch name from GITHUB_REF."
exit 1
fi

cd $DOCKERFILE_DIR
docker run --privileged --rm tonistiigi/binfmt --install all
docker buildx create --use
docker login -u $DOCKER_USERNAME -p $DOCKER_PASSWORD
docker buildx build --platform=linux/amd64,linux/arm64 -t $DOCKER_USERNAME/$BRANCH_NAME-service:latest . --push
14 changes: 14 additions & 0 deletions src/common-module/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@ buildscript {
plugins {
id 'java'
id 'com.google.protobuf' version "${protobufPluginVersion}"

id("org.springframework.boot") version "3.2.1"
id("io.spring.dependency-management") version "1.1.4"
}

group 'org.palette'
Expand All @@ -21,6 +24,13 @@ repositories {
dependencies {
implementation "io.grpc:grpc-protobuf:${grpcVersion}"
implementation "io.grpc:grpc-stub:${grpcVersion}"

implementation 'com.fasterxml.jackson.core:jackson-databind'
implementation "org.springframework.boot:spring-boot-starter-web"

compileOnly("org.projectlombok:lombok")
annotationProcessor("org.projectlombok:lombok")

compileOnly 'jakarta.annotation:jakarta.annotation-api:1.3.5'
}

Expand Down Expand Up @@ -48,3 +58,7 @@ test {
clean {
delete 'src/generated'
}

bootJar {
enabled = false
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package org.palette.config;

import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.RequiredArgsConstructor;
import org.palette.passport.HMACEncoder;
import org.palette.passport.PassportExtractor;
import org.palette.passport.PassportGenerator;
import org.palette.passport.PassportValidator;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@RequiredArgsConstructor
public class CommonModuleConfig {

private final ObjectMapper objectMapper;

@Value("${passport.algorithm}")
String HMacAlgorithm;

@Value("${passport.key}")
String passportSecretKey;

@Bean
public HMACEncoder hmacEncoder() {
return new HMACEncoder(HMacAlgorithm, passportSecretKey);
}

@Bean
public PassportGenerator passportGenerator() {
return new PassportGenerator(objectMapper, hmacEncoder());
}

@Bean
public PassportValidator passportValidator() {
return new PassportValidator(objectMapper, hmacEncoder());
}

@Bean
public PassportExtractor passportExtractor() {
return new PassportExtractor(objectMapper, passportValidator());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package org.palette.exception;

public class BaseException extends RuntimeException {

private final ExceptionType exceptionType;

public BaseException(ExceptionType exceptionType) {
super(exceptionType.getMessage());
this.exceptionType = exceptionType;
}

public ExceptionType getExceptionType() {
return exceptionType;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package org.palette.exception;

import lombok.AccessLevel;
import lombok.Builder;

@Builder(access = AccessLevel.PROTECTED)
public record ExceptionResponse(
String code,
String message,
String description
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
package org.palette.exception;

import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;

@Getter
@RequiredArgsConstructor
public enum ExceptionType {

// 400
COMMON_400_000001(
"COMMON_400_000001",
"INCORRECT_PARAMETER",
"요청 파라미터가 올바르지 않습니다.",
HttpStatus.BAD_REQUEST
),

COMMON_400_000002(
"COMMON_400_000002",
"BROKEN_TOKEN",
"요청 토큰이 올바르지 않습니다.",
HttpStatus.BAD_REQUEST
),

COMMON_400_000003(
"COMMON_400_000003",
"BROKEN_ATTEMPT",
"인증번호 입력 횟수를 초과했습니다.",
HttpStatus.BAD_REQUEST
),

COMMON_400_000004(
"COMMON_400_000002",
"BROKEN_PAYLOAD",
"인증번호가 올바르지 않습니다.",
HttpStatus.BAD_REQUEST
),

// 401
COMMON_401_000001(
"COMMON_401_000001",
"MISSED COMMONENTICATION",
"해당 요청은 인증이 필요합니다.",
HttpStatus.UNAUTHORIZED
),

// 403
COMMON_403_000001(
"COMMON_403_000001",
"NOT ALLOWED PERMISSION",
"해당 요청에 대한 권한이 없습니다.",
HttpStatus.FORBIDDEN
),

COMMON_403_000002(
"COMMON_403_000002",
"EXPIRED_PAYLOAD",
"요청한 인증번호가 만료되었습니다.",
HttpStatus.FORBIDDEN
),

COMMON_403_000003(
"COMMON_403_000003",
"EXPIRED_PAYLOAD",
"토큰이 만료되었습니다. 다시 로그인해주세요",
HttpStatus.FORBIDDEN
),

// 404
COMMON_404_000001(
"COMMON_404_000001",
"NOT FOUNDED",
"해당 리소스가 존재하지 않습니다.",
HttpStatus.NOT_FOUND
),

// 405
COMMON_405_000001(
"COMMON_403_000005",
"NOT ALLOWED METHOD",
"올바르지 않은 요청 메서드입니다.",
HttpStatus.METHOD_NOT_ALLOWED
),

// 409
COMMON_409_000001(
"COMMON_409_000001",
"DUPLICATED",
"중복된 리소스가 있습니다.",
HttpStatus.CONFLICT
),

// 500
COMMON_500_000001(
"COMMON_500_000001",
"INTERNAL SERVER ERROR",
"서버 간 통신 중 예기치 못한 오류가 발생했습니다.",
HttpStatus.INTERNAL_SERVER_ERROR
),

COMMON_500_000002(
"COMMON_500_000002",
"INTERNAL SERVER ERROR",
"Passport를 처리하는 중 예기치 못한 오류가 발생했습니다.",
HttpStatus.INTERNAL_SERVER_ERROR
),

;

public String getCode() {
return code;
}

public String getMessage() {
return message;
}

public String getDescription() {
return description;
}

public HttpStatus getHttpStatus() {
return httpStatus;
}

private final String code;
private final String message;
private final String description;
private final HttpStatus httpStatus;
}
Loading
Loading