Skip to content
Open
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
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.checkit.common.entity;

import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter
@RequiredArgsConstructor
public enum CategoryType {
WAKE("기상"),
SEATED("공부"),
COTE("코테"),
LANG("언어"),
CERT("자격증"),
ETC("기타");

private final String displayName;
}
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ CREATE TABLE social_account (

CREATE TABLE user_item (
product_item_id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
user_id2 UUID,
user_id UUID,
product_id BIGINT NOT NULL,
quantity INTEGER NOT NULL DEFAULT 1,
CONSTRAINT pk_user_item PRIMARY KEY (product_item_id)
Expand All @@ -137,7 +137,7 @@ CREATE TABLE badge_user (
badge_id BIGINT NOT NULL,
name VARCHAR(20) NOT NULL,
earned_at TIMESTAMP NOT NULL DEFAULT now(),
is_equipped VARCHAR(255) NOT NULL DEFAULT false,
is_equipped BOOLEAN NOT NULL DEFAULT false,
CONSTRAINT pk_badge_user PRIMARY KEY (badge_user_id)
);

Expand Down
83 changes: 82 additions & 1 deletion docker-compose.yml
Original file line number Diff line number Diff line change
@@ -1,14 +1,89 @@
version: '3.8'

services:
eureka-service:
build:
context: .
dockerfile: eureka-service/Dockerfile
container_name: eureka-service
ports:
- "8761:8761"
networks:
- checkmate-network

user-service:
build:
context: .
dockerfile: user-service/Dockerfile
container_name: user-service
ports:
- "8081:8081"
environment:
- SPRING_DATASOURCE_URL=jdbc:postgresql://sample-postgres:5432/${DB_NAME}
- SPRING_DATASOURCE_USERNAME=${DB_USERNAME}
- SPRING_DATASOURCE_PASSWORD=${DB_PASSWORD}
- SPRING_REDIS_HOST=redis
- JWT_SECRET=${JWT_SECRET}
- JWT_ACCESS_EXPIRATION=${JWT_ACCESS_EXPIRATION}
- JWT_REFRESH_EXPIRATION=${JWT_REFRESH_EXPIRATION}
- EUREKA_CLIENT_SERVICE_URL_DEFAULTZONE=http://eureka-service:8761/eureka/
depends_on:
- postgres
- redis
- eureka-service
networks:
- checkmate-network

gateway-service:
build:
context: .
dockerfile: gateway-service/Dockerfile
container_name: gateway-service
ports:
- "8080:8080"
environment:
- EUREKA_CLIENT_SERVICE_URL_DEFAULTZONE=http://eureka-service:8761/eureka/
- JWT_SECRET=${JWT_SECRET}
- JWT_ACCESS_EXPIRATION=${JWT_ACCESS_EXPIRATION}
- JWT_REFRESH_EXPIRATION=${JWT_REFRESH_EXPIRATION}
depends_on:
- eureka-service
networks:
- checkmate-network

store-service:
build:
context: .
dockerfile: store-service/Dockerfile
container_name: store-service
ports:
- "8084:8084"
environment:
- EUREKA_CLIENT_SERVICE_URL_DEFAULTZONE=http://eureka-service:8761/eureka/
- SPRING_DATASOURCE_URL=jdbc:postgresql://sample-postgres:5432/${DB_NAME}
- SPRING_DATASOURCE_USERNAME=${DB_USERNAME}
- SPRING_DATASOURCE_PASSWORD=${DB_PASSWORD}
- SPRING_REDIS_HOST=redis
- JWT_SECRET=${JWT_SECRET}
- JWT_ACCESS_EXPIRATION=${JWT_ACCESS_EXPIRATION}
- JWT_REFRESH_EXPIRATION=${JWT_REFRESH_EXPIRATION}
depends_on:
- postgres
- redis
- eureka-service
networks:
- checkmate-network

redis:
image: redis:7-alpine
container_name: checkmate-redis
ports:
- "${REDIS_LOCAL_PORT}:${REDIS_PORT}"
volumes:
- redis_data:/data
restart: always
restart: always
networks:
- checkmate-network

postgres:
image: postgres:latest
Expand All @@ -21,6 +96,12 @@ services:
- POSTGRES_PASSWORD=${DB_PASSWORD}
volumes:
- ./postgres-data:/var/lib/postgresql
networks:
- checkmate-network

volumes:
redis_data:

networks:
checkmate-network:
driver: bridge
28 changes: 28 additions & 0 deletions eureka-service/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# 1. 빌드 스테이지
FROM eclipse-temurin:17-jdk AS build
WORKDIR /app

# 루트의 모든 파일을 복사
COPY . .

# 만약 루트에만 gradle 폴더가 있다면 서비스 안으로 복사
RUN cp -r /app/gradle /app/eureka-service/ 2>/dev/null || :

# 작업 디렉토리 이동
WORKDIR /app/eureka-service

# 권한 부여 및 빌드
RUN chmod +x ./gradlew
RUN ./gradlew clean bootJar -x test

# 2. 실행 스테이지
FROM eclipse-temurin:17-jre
WORKDIR /app

# 빌드된 jar 파일 복사
COPY --from=build /app/eureka-service/build/libs/*.jar app.jar

ENV TZ=Asia/Seoul
EXPOSE 8761

ENTRYPOINT ["java", "-jar", "app.jar"]
23 changes: 23 additions & 0 deletions gateway-service/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# 1. 빌드 스테이지
FROM eclipse-temurin:17-jdk AS build
WORKDIR /app

COPY . .

RUN cp -r /app/gradle /app/gateway-service/ 2>/dev/null || :

WORKDIR /app/gateway-service

RUN chmod +x ./gradlew
RUN ./gradlew clean bootJar -x test

# 2. 실행 스테이지
FROM eclipse-temurin:17-jre
WORKDIR /app

COPY --from=build /app/gateway-service/build/libs/*.jar app.jar

ENV TZ=Asia/Seoul
EXPOSE 8000

ENTRYPOINT ["java", "-jar", "app.jar"]
1 change: 0 additions & 1 deletion gateway-service/settings.gradle

This file was deleted.

14 changes: 13 additions & 1 deletion gateway-service/src/main/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,22 @@ spring:
- id: user-service
uri: lb://USER-SERVICE
predicates:
- Path=/users/**
- Path=/users/**, /badges/**
filters:
- name: JwtAuthenticationFilter

- id: store-service-internal
uri: lb://STORE-SERVICE
predicates:
- Path=/internal/**


- id: store-service-public
uri: lb://STORE-SERVICE
predicates:
- Path=/points/**, /products/**
filters:
- name: JwtAuthenticationFilter

- id: community-service
uri: lb://COMMUNITY-SERVICE
Expand Down
29 changes: 29 additions & 0 deletions store-service/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# 1. 빌드 스테이지
FROM eclipse-temurin:17-jdk AS build
WORKDIR /app

# 루트의 모든 파일을 복사 (gradle 폴더가 포함되도록)
COPY . .

# [핵심] 루트에 있는 gradle 폴더를 store-service 안으로 복사
RUN cp -r /app/gradle /app/store-service/ 2>/dev/null || :

# 작업 디렉토리 이동
WORKDIR /app/store-service

# 권한 부여 및 빌드
RUN chmod +x ./gradlew
RUN ./gradlew clean bootJar -x test

# 2. 실행 스테이지
FROM eclipse-temurin:17-jre
WORKDIR /app

# 빌드된 jar 파일 복사
COPY --from=build /app/store-service/build/libs/*.jar app.jar

ENV TZ=Asia/Seoul
# docker-compose 설정에 맞춘 포트 (8084)
EXPOSE 8084

ENTRYPOINT ["java", "-jar", "app.jar"]
7 changes: 7 additions & 0 deletions store-service/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,13 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'org.postgresql:postgresql'

compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'

implementation 'io.jsonwebtoken:jjwt-api:0.12.3'
implementation 'io.jsonwebtoken:jjwt-impl:0.12.3'
implementation 'io.jsonwebtoken:jjwt-jackson:0.12.3'

testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.security:spring-security-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
Expand Down
1 change: 0 additions & 1 deletion store-service/settings.gradle

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

@EnableJpaAuditing
@SpringBootApplication
public class StoreApplication {

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package com.checkit.storeservice.config;

import org.apache.hc.client5.http.config.RequestConfig;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder;
import org.apache.hc.core5.util.Timeout;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

@Configuration
public class RestTemplateConfig {

@Bean
@LoadBalanced
public RestTemplate restTemplate() {
var connManager = PoolingHttpClientConnectionManagerBuilder.create().build();
connManager.setMaxTotal(200);
connManager.setDefaultMaxPerRoute(50);

var requestConfig = RequestConfig.custom()
.setConnectTimeout(Timeout.ofMilliseconds(500))
.setResponseTimeout(Timeout.ofMilliseconds(3000))
.setConnectionRequestTimeout(Timeout.ofMilliseconds(1000))
.build();

CloseableHttpClient httpClient = HttpClients.custom()
.setConnectionManager(connManager)
.setDefaultRequestConfig(requestConfig)
.evictExpiredConnections()
.build();

var factory = new HttpComponentsClientHttpRequestFactory(httpClient);

return new RestTemplate(factory);
}

@Bean(name = "externalRestTemplate")
public RestTemplate externalRestTemplate() {
var connManager = PoolingHttpClientConnectionManagerBuilder.create().build();
connManager.setMaxTotal(200);
connManager.setDefaultMaxPerRoute(50);

var requestConfig = RequestConfig.custom()
.setConnectTimeout(Timeout.ofMilliseconds(500))
.setResponseTimeout(Timeout.ofMilliseconds(3000))
.setConnectionRequestTimeout(Timeout.ofMilliseconds(1000))
.build();

CloseableHttpClient httpClient = HttpClients.custom()
.setConnectionManager(connManager)
.setDefaultRequestConfig(requestConfig)
.evictExpiredConnections()
.build();

var factory = new HttpComponentsClientHttpRequestFactory(httpClient);


return new RestTemplate(factory);
}
}
Loading