Skip to content
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
2 changes: 2 additions & 0 deletions .github/workflows/cd.yml
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,8 @@ jobs:

export FCM_KEY_PATH=/app/firebase/${{ secrets.FCM_FILE_NAME }}

export KAKAO_MAP_API_KEY='${{ secrets.KAKAO_MAP_API_KEY }}'

# Spring Boot 앱만 pull
docker compose -f docker-compose.yml pull spring-boot-app

Expand Down
1 change: 1 addition & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ services:
COOLSMS_API_KEY: ${COOLSMS_API_KEY}
COOLSMS_API_SECRET: ${COOLSMS_API_SECRET}
COOLSMS_SENDER: ${COOLSMS_SENDER}
KAKAO_MAP_API_KEY: ${KAKAO_MAP_API_KEY}
volumes:
- /home/ec2-user/app/firebase:/app/firebase:ro
depends_on:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,9 @@ public record RecommendationResDTO(
List<String> interests,
PersonalityDTO personality,
List<String> photoUrls,
String introduction
String introduction,
BadgeInfoDTO badge,
String location
) {
@Builder
public record LanguageDTO(
Expand All @@ -36,4 +38,11 @@ public record PersonalityDTO(
RelationType relationType
) {
}

@Builder
public record BadgeInfoDTO(
String level,
int score
) {
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.meetkey.server.domain.match.service;

import com.meetkey.server.domain.badge.enums.BadgeLevel;
import com.meetkey.server.domain.chat.repository.ChatRoomMemberRepository;
import com.meetkey.server.domain.match.dto.*;
import com.meetkey.server.domain.match.entity.RecommendationQueue;
Expand Down Expand Up @@ -43,6 +44,7 @@ public class MatchServiceImpl implements MatchService {
private final PreferenceRepository preferenceRepository;
private final RecommendationQueueRepository recommendationQueueRepository;
private final ChatRoomMemberRepository chatRoomMemberRepository;
private final com.meetkey.server.domain.badge.respository.PointHistoryRepository pointHistoryRepository;

@Transactional
@Override
Expand Down Expand Up @@ -324,6 +326,11 @@ private RecommendationResDTO convertToDTO(Member member) {
private RecommendationResDTO convertToDTO(Member member, Preference pref, double distance) {
int age = member.getBirthday() != null ? LocalDate.now().getYear() - member.getBirthday().getYear() + 1 : 0;

int totalScore = pointHistoryRepository.calculateTotalScore(member);
String badgeLevel = BadgeLevel.fromScore(totalScore).name();

String location = member.getLocation();

RecommendationResDTO.PersonalityDTO personalityDTO = null;
if (pref != null) {
personalityDTO = RecommendationResDTO.PersonalityDTO.builder()
Expand Down Expand Up @@ -359,6 +366,11 @@ private RecommendationResDTO convertToDTO(Member member, Preference pref, double
.personality(personalityDTO)
.photoUrls(Collections.emptyList()) // 플레이스홀더
.introduction(member.getBio())
.badge(RecommendationResDTO.BadgeInfoDTO.builder()
.level(badgeLevel)
.score(totalScore)
.build())
.location(location)
.build();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package com.meetkey.server.domain.member.service;

import com.meetkey.server.global.security.oauth.dto.KakaoMapDto;
import com.meetkey.server.global.security.oauth.kakao.KakaoMapClient;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

@Slf4j
@Service
@RequiredArgsConstructor
public class GeocodingService {

private final KakaoMapClient kakaoMapClient;

@Value("${kakao.map-api-key}")
private String kakaoMapApiKey;

public String getAddress(Double latitude, Double longitude) {
if (latitude == null || longitude == null) {
return null;
}

try {
String authorization = "KakaoAK " + kakaoMapApiKey;

KakaoMapDto response = kakaoMapClient.getRegionCode(authorization, longitude, latitude);

if (response != null && response.getDocuments() != null && !response.getDocuments().isEmpty()) {
KakaoMapDto.Document doc = response.getDocuments().stream()
.filter(d -> "H".equals(d.getRegionType()))
.findFirst()
.orElse(response.getDocuments().get(0));

String city = doc.getRegion1depthName();
String district = doc.getRegion2depthName();

return "대한민국, " + city;
}
} catch (Exception e) {
log.error("Geocoding failed for lat: {}, lon: {}", latitude, longitude, e);
}
return null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ public class ProfileService {
private final MemberLocationRepository memberLocationRepository;
private final EvaluationRepository evaluationRepository;
private final BadgeService badgeService;
private final GeocodingService geocodingService;

public ProfileUpdateResponse updateProfile(Long memberId, ProfileUpdateRequest request) {
Member member = getMember(memberId);
Expand All @@ -54,6 +55,11 @@ public ProfileUpdateResponse updateProfile(Long memberId, ProfileUpdateRequest r
} else {
memberLocation.update(request.latitude(), request.longitude());
}

String address = geocodingService.getAddress(request.latitude(), request.longitude());
if (address != null) {
member.updateProfileInfo(address, request.bio(), request.first(), request.target(), request.level());
}
}

badgeService.checkProfileCompletion(memberId);
Expand All @@ -73,6 +79,11 @@ public void updateLocation(Long memberId, LocationUpdateRequest request) {
} else {
memberLocation.update(request.latitude(), request.longitude());
}

String address = geocodingService.getAddress(request.latitude(), request.longitude());
if (address != null) {
member.updateProfileInfo(address, member.getBio(), member.getFirstLanguage(), member.getTargetLanguage(), member.getTargetLanguageLevel());
}
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package com.meetkey.server.global.security.oauth.dto;

import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.List;

@Getter
@NoArgsConstructor
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public class KakaoMapDto {
private Meta meta;
private List<Document> documents;

@Getter
@NoArgsConstructor
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public static class Meta {
private int totalCount;
}

@Getter
@NoArgsConstructor
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public static class Document {
private String regionType;
private String addressName;
@com.fasterxml.jackson.annotation.JsonProperty("region_1depth_name")
private String region1depthName; // 시/도
@com.fasterxml.jackson.annotation.JsonProperty("region_2depth_name")
private String region2depthName; // 시/군/구
@com.fasterxml.jackson.annotation.JsonProperty("region_3depth_name")
private String region3depthName; // 읍/면/동
@com.fasterxml.jackson.annotation.JsonProperty("region_4depth_name")
private String region4depthName;
private String code;
private double x;
private double y;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.meetkey.server.global.security.oauth.kakao;

import com.meetkey.server.global.config.FeignConfig;
import com.meetkey.server.global.config.OauthConfig;
import com.meetkey.server.global.security.oauth.dto.KakaoMapDto;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestParam;

@FeignClient(
name = "KakaoMapClient",
url = "https://dapi.kakao.com",
configuration = {OauthConfig.class, FeignConfig.class}
)
public interface KakaoMapClient {
@GetMapping("/v2/local/geo/coord2regioncode.json")
KakaoMapDto getRegionCode(
@RequestHeader("Authorization") String authorization,
@RequestParam("x") Double longitude,
@RequestParam("y") Double latitude
);
}
1 change: 1 addition & 0 deletions src/main/resources/application-local.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ admin:

kakao:
app-key: ${KAKAO_APP_KEY:}
map-api-key: ${KAKAO_MAP_API_KEY:}

apple:
app-key: ${APPLE_APP_KEY:}
Expand Down
1 change: 1 addition & 0 deletions src/main/resources/application-prod.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ admin:

kakao:
app-key: ${KAKAO_APP_KEY:}
map-api-key: ${KAKAO_MAP_API_KEY:}

apple:
app-key: ${APPLE_APP_KEY:}
1 change: 1 addition & 0 deletions src/main/resources/application-test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ admin:

kakao:
app-key: ${KAKAO_APP_KEY:}
map-api-key: ${KAKAO_MAP_API_KEY:}

apple:
app-key: ${APPLE_APP_KEY:}
Expand Down