Skip to content

Commit 613c3f0

Browse files
authored
Merge pull request #160 from YAPP-Github/develop
[Feat] 2차 프로덕션 선행 배포
2 parents 31145cf + c304461 commit 613c3f0

File tree

109 files changed

+2076
-1205
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

109 files changed

+2076
-1205
lines changed

.github/workflows/deploy-dev.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -202,8 +202,8 @@ jobs:
202202
if: steps.get_version.outputs.HAS_VERSION == 'true'
203203
id: get-latest-task-def
204204
run: |
205-
TASK_DEF_ARN=$(aws ecs describe-services --cluster "${{ env.ECS_CLUSTER }}" --services "${{ env.ECS_SERVICE }}" --query "services[0].taskDefinition" --output text)
206-
aws ecs describe-task-definition --task-definition "$TASK_DEF_ARN" --query "taskDefinition" --output json > task-definition.json
205+
TASK_DEF_ARN=$(aws ecs describe-task-definition --task-definition "${{ env.CONTAINER_NAME }}" --query "taskDefinition.taskDefinitionArn" --output text)
206+
aws ecs describe-task-definition --task-definition "$TASK_DEF_ARN" --query "taskDefinition" --output json > task-definition.json
207207
208208
- name: Fill in the new image ID in the Amazon ECS task definition
209209
if: steps.get_version.outputs.HAS_VERSION == 'true'

.github/workflows/deploy-prod.yml

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,15 @@ jobs:
218218
if: steps.get_version.outputs.HAS_VERSION == 'true'
219219
id: get-latest-task-def
220220
run: |
221-
TASK_DEF_ARN=$(aws ecs describe-services --cluster "${{ env.ECS_CLUSTER }}" --services "${{ env.ECS_SERVICE }}" --region "${{ env.AWS_REGION }}" --query "services[0].taskDefinition" --output text)
221+
if [[ -n "${{ github.event.inputs.rollback_version }}" ]]; then
222+
echo "롤백 모드: 현재 서비스에서 실행 중인 안정적인 Task Definition을 사용합니다."
223+
TASK_DEF_ARN=$(aws ecs describe-services --cluster "${{ env.ECS_CLUSTER }}" --services "${{ env.ECS_SERVICE }}" --region "${{ env.AWS_REGION }}" --query "services[0].taskDefinition" --output text)
224+
else
225+
echo "일반 배포 모드: 가장 최신 버전의 Task Definition을 사용합니다."
226+
TASK_DEF_ARN=$(aws ecs describe-task-definition --task-definition "${{ env.CONTAINER_NAME }}" --query "taskDefinition.taskDefinitionArn" --output text)
227+
fi
228+
229+
echo "사용할 Task Definition ARN: $TASK_DEF_ARN"
222230
aws ecs describe-task-definition --task-definition "$TASK_DEF_ARN" --region "${{ env.AWS_REGION }}" --query "taskDefinition" --output json > task-definition.json
223231
224232
- name: Fill in the new image ID in the Amazon ECS task definition

Dockerfile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
11
FROM eclipse-temurin:21
2+
3+
ADD https://dtdg.co/latest-java-tracer /dd-java-agent.jar
4+
25
ARG JAR_FILE=build/libs/eatda-0.0.1-SNAPSHOT.jar
36
COPY ${JAR_FILE} api.jar

build.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,9 @@ dependencies {
9090
implementation 'io.awspring.cloud:spring-cloud-aws-starter-parameter-store:3.2.1'
9191
implementation 'io.awspring.cloud:spring-cloud-aws-starter-s3:3.2.1'
9292
implementation 'software.amazon.awssdk:s3:2.31.77'
93+
94+
//log
95+
implementation 'net.logstash.logback:logstash-logback-encoder:8.0'
9396
}
9497

9598
bootJar {

src/main/java/eatda/client/map/MapClient.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public MapClient(RestClient.Builder restClient, KakaoProperties properties) {
2121
this.kakaoProperties = properties;
2222
}
2323

24-
public List<StoreSearchResult> searchShops(String query) {
24+
public List<MapClientStoreSearchResult> searchStores(String query) {
2525
return restClient.get()
2626
.uri("https://dapi.kakao.com/v2/local/search/keyword.json", builder -> builder
2727
.queryParam("query", query)
@@ -35,7 +35,7 @@ public List<StoreSearchResult> searchShops(String query) {
3535
.build())
3636
.header("Authorization", "KakaoAK " + kakaoProperties.getApiKey())
3737
.retrieve()
38-
.body(StoreSearchResults.class)
38+
.body(MapClientStoreSearchResults.class)
3939
.results();
4040
}
4141
}

src/main/java/eatda/client/map/StoreSearchResult.java renamed to src/main/java/eatda/client/map/MapClientStoreSearchResult.java

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,13 @@
22

33
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
44
import com.fasterxml.jackson.annotation.JsonProperty;
5-
import eatda.domain.store.Store;
5+
import eatda.domain.store.District;
66
import eatda.domain.store.StoreCategory;
7+
import eatda.domain.store.StoreSearchResult;
78
import java.util.Map;
89

910
@JsonIgnoreProperties(ignoreUnknown = true)
10-
public record StoreSearchResult(
11+
public record MapClientStoreSearchResult(
1112
@JsonProperty("id") String kakaoId,
1213
@JsonProperty("category_group_code") String categoryGroupCode,
1314
@JsonProperty("category_name") String categoryName,
@@ -28,6 +29,7 @@ public record StoreSearchResult(
2829
"음식점 > 카페", StoreCategory.CAFE,
2930
"음식점 > 간식 > 제과,베이커리", StoreCategory.CAFE
3031
);
32+
private static final District DEFAULT_DISTRICT = District.ETC;
3133

3234
public boolean isFoodStore() {
3335
return "FD6".equals(categoryGroupCode);
@@ -53,17 +55,29 @@ public StoreCategory getStoreCategory() {
5355
.orElse(StoreCategory.OTHER);
5456
}
5557

56-
public Store toStore() {
57-
return Store.builder()
58-
.kakaoId(kakaoId)
59-
.category(getStoreCategory())
60-
.phoneNumber(phoneNumber)
61-
.name(name)
62-
.placeUrl(placeUrl)
63-
.roadAddress(roadAddress)
64-
.lotNumberAddress(lotNumberAddress)
65-
.latitude(latitude)
66-
.longitude(longitude)
67-
.build();
58+
public District getDistrict() {
59+
if (lotNumberAddress == null || lotNumberAddress.isBlank()) {
60+
return DEFAULT_DISTRICT;
61+
}
62+
String[] addressParts = lotNumberAddress.split(" ");
63+
if (addressParts.length < 2) {
64+
return DEFAULT_DISTRICT;
65+
}
66+
return District.fromName(addressParts[1]);
67+
}
68+
69+
public StoreSearchResult toDomain() {
70+
return new StoreSearchResult(
71+
kakaoId,
72+
getStoreCategory(),
73+
phoneNumber,
74+
name,
75+
placeUrl,
76+
lotNumberAddress,
77+
roadAddress,
78+
getDistrict(),
79+
latitude,
80+
longitude
81+
);
6882
}
6983
}

src/main/java/eatda/client/map/StoreSearchResults.java renamed to src/main/java/eatda/client/map/MapClientStoreSearchResults.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,5 @@
55
import java.util.List;
66

77
@JsonIgnoreProperties(ignoreUnknown = true)
8-
public record StoreSearchResults(@JsonProperty("documents") List<StoreSearchResult> results) {
8+
public record MapClientStoreSearchResults(@JsonProperty("documents") List<MapClientStoreSearchResult> results) {
99
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package eatda.config;
2+
3+
import jakarta.servlet.http.HttpServletRequest;
4+
import jakarta.servlet.http.HttpServletResponse;
5+
import java.util.UUID;
6+
import org.slf4j.Logger;
7+
import org.slf4j.LoggerFactory;
8+
import org.slf4j.MDC;
9+
import org.springframework.stereotype.Component;
10+
import org.springframework.web.servlet.HandlerInterceptor;
11+
12+
@Component
13+
public class LoggingInterceptor implements HandlerInterceptor {
14+
15+
private static final Logger log = LoggerFactory.getLogger(LoggingInterceptor.class);
16+
private static final String START_TIME = "startTime";
17+
private static final String REQUEST_ID = "requestId";
18+
19+
@Override
20+
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
21+
request.setAttribute(START_TIME, System.currentTimeMillis());
22+
String requestId = UUID.randomUUID().toString().substring(0, 8);
23+
MDC.put(REQUEST_ID, requestId);
24+
25+
log.info("[Request] {} {}", request.getMethod(), request.getRequestURI());
26+
return true;
27+
}
28+
29+
@Override
30+
public void afterCompletion(
31+
HttpServletRequest request,
32+
HttpServletResponse response,
33+
Object handler,
34+
Exception ex
35+
) {
36+
Long startTime = (Long) request.getAttribute(START_TIME);
37+
if (startTime == null) {
38+
log.warn("[Response] {} {} (duration unknown - preHandle not called)",
39+
request.getMethod(), request.getRequestURI());
40+
MDC.clear();
41+
return;
42+
}
43+
44+
long duration = System.currentTimeMillis() - startTime;
45+
log.info("[Response] {} {} ({}ms)", request.getMethod(), request.getRequestURI(), duration);
46+
MDC.clear();
47+
}
48+
}

src/main/java/eatda/config/WebConfig.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,24 @@
66
import lombok.RequiredArgsConstructor;
77
import org.springframework.context.annotation.Configuration;
88
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
9+
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
910
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
1011

1112
@Configuration
1213
@RequiredArgsConstructor
1314
public class WebConfig implements WebMvcConfigurer {
1415

1516
private final JwtManager jwtManager;
17+
private final LoggingInterceptor loggingInterceptor;
1618

1719
@Override
1820
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
1921
argumentResolvers.add(new AuthMemberArgumentResolver(jwtManager));
2022
}
23+
24+
@Override
25+
public void addInterceptors(InterceptorRegistry registry) {
26+
registry.addInterceptor(loggingInterceptor)
27+
.addPathPatterns("/**");
28+
}
2129
}

src/main/java/eatda/controller/article/ArticleController.java

Lines changed: 0 additions & 24 deletions
This file was deleted.

0 commit comments

Comments
 (0)