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
6 changes: 4 additions & 2 deletions src/main/java/com/wayble/server/ServerApplication.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.wayble.server;

import com.wayble.server.direction.external.tmap.TMapProperties;
import com.wayble.server.common.client.tmap.TMapProperties;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.data.elasticsearch.ReactiveElasticsearchRepositoriesAutoConfiguration;
Expand All @@ -15,7 +15,9 @@
)
@EnableJpaAuditing
@EnableScheduling
@EnableElasticsearchRepositories(basePackages = {"com.wayble.server.explore.repository", "com.wayble.server.logging.repository"})
@EnableElasticsearchRepositories(basePackages = {
"com.wayble.server.explore.repository", "com.wayble.server.direction.repository", "com.wayble.server.logging.repository"
})
@EnableConfigurationProperties(TMapProperties.class)
@EntityScan(basePackages = "com.wayble.server")
public class ServerApplication {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.wayble.server.direction.external.tmap;
package com.wayble.server.common.client.tmap;

import com.wayble.server.direction.external.tmap.dto.request.TMapRequest;
import com.wayble.server.direction.external.tmap.dto.response.TMapResponse;
import com.wayble.server.common.client.tmap.dto.request.TMapRequest;
import com.wayble.server.common.client.tmap.dto.response.TMapResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.wayble.server.direction.external.tmap;
package com.wayble.server.common.client.tmap;

import org.springframework.boot.context.properties.ConfigurationProperties;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.wayble.server.direction.external.tmap.dto.request;
package com.wayble.server.common.client.tmap.dto.request;

import lombok.Builder;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.wayble.server.direction.external.tmap.dto.response;
package com.wayble.server.common.client.tmap.dto.response;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Builder;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.wayble.server.direction.external.tmap.dto.response;
package com.wayble.server.common.client.tmap.dto.response;

import java.util.List;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.wayble.server.direction.external.tmap.mapper;
package com.wayble.server.common.client.tmap.mapper;

import com.wayble.server.direction.external.tmap.dto.response.TMapParsingResponse;
import com.wayble.server.direction.external.tmap.dto.response.TMapResponse;
import com.wayble.server.common.client.tmap.dto.response.TMapResponse;
import com.wayble.server.common.client.tmap.dto.response.TMapParsingResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.wayble.server.common.config;

import com.wayble.server.direction.external.tmap.TMapProperties;
import com.wayble.server.common.client.tmap.TMapProperties;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,29 +1,33 @@
package com.wayble.server.direction.controller;

import com.wayble.server.common.response.CommonResponse;
import com.wayble.server.direction.controller.swagger.DirectionSwagger;
import com.wayble.server.direction.dto.request.PlaceSaveRequest;
import com.wayble.server.direction.dto.response.DirectionSearchResponse;
import com.wayble.server.direction.service.DirectionService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequiredArgsConstructor
@RequestMapping("/directions")
public class DirectionController {
@RequestMapping("/api/v1/directions")
public class DirectionController implements DirectionSwagger {

private final DirectionService directionService;

// 참고용 컨트롤러(지우셔도 돼요)
@GetMapping("/hello")
public CommonResponse<String> hello() {
return CommonResponse.success("hello");
@Override
@PostMapping("/place")
public CommonResponse<String> savePlace(@RequestBody @Valid PlaceSaveRequest request) {
directionService.savePlaceAndIndexDocument(request.requests());
return CommonResponse.success("Place Save successful");
}

// 예외 사용 참고용 컨트롤러(지우셔도 돼요)
@GetMapping("/ex")
public CommonResponse<String> exception() {
directionService.makeException();
return CommonResponse.success("예외 발생!");
@Override
@GetMapping("/auto-complete")
public CommonResponse<List<DirectionSearchResponse>> getDirectionKeywords(@RequestParam String keyword) {
return CommonResponse.success(directionService.searchDirection(keyword));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
import com.wayble.server.common.response.CommonResponse;
import com.wayble.server.direction.controller.swagger.WalkingSwagger;
import com.wayble.server.direction.dto.response.WayblePathResponse;
import com.wayble.server.direction.external.tmap.dto.request.TMapRequest;
import com.wayble.server.direction.external.tmap.dto.response.TMapParsingResponse;
import com.wayble.server.common.client.tmap.dto.request.TMapRequest;
import com.wayble.server.common.client.tmap.dto.response.TMapParsingResponse;
import com.wayble.server.direction.service.WalkingService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package com.wayble.server.direction.controller.swagger;

import com.wayble.server.common.response.CommonResponse;
import com.wayble.server.direction.dto.request.PlaceSaveRequest;
import com.wayble.server.direction.dto.response.DirectionSearchResponse;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;

@Tag(name = "[길찾기 - 검색]", description = "길찾기 검색 등 API")
public interface DirectionSwagger {
@Operation(
summary = "길찾기에서 검색한 장소 저장 및 place -> directionDocument 변환 API",
description = "네이버 검색 API 호출 후, 검색한 장소를 저장 및 변환 + 색인 과정을 진행합니다."
)
@ApiResponses(value = {
@ApiResponse(
responseCode = "200",
description = "장소 저장 및 변환이 성공적으로 실행되었습니다."
)
})
CommonResponse<String> savePlace(
@RequestBody @Valid PlaceSaveRequest request
);

@Operation(
summary = "길찾기 검색 연관어 자동완성 API",
description = "길찾기 장소 검색 시, 연관어 자동완성을 진행합니다."
)
@ApiResponses(value = {
@ApiResponse(
responseCode = "200",
description = "길찾기 검색 연관어 자동완성이 성공적으로 실행되었습니다."
)
})
CommonResponse<List<DirectionSearchResponse>> getDirectionKeywords(
@RequestParam String keyword
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@

import com.wayble.server.common.response.CommonResponse;
import com.wayble.server.direction.dto.response.WayblePathResponse;
import com.wayble.server.direction.external.tmap.dto.response.TMapParsingResponse;
import com.wayble.server.common.client.tmap.dto.response.TMapParsingResponse;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.web.bind.annotation.RequestParam;

@Tag(name = "[도보]", description = "도보 길찾기 관련 API")
@Tag(name = "[길찾기 - 도보]", description = "도보 길찾기 관련 API")
public interface WalkingSwagger {
@Operation(
summary = "도보 최적 경로 길찾기 API",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.wayble.server.direction.dto.request;

import lombok.Builder;

@Builder
public record DirectionSearchRequest(
String name,
Double latitude,
Double longitude
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.wayble.server.direction.dto.request;

import com.wayble.server.common.entity.Address;
import lombok.Builder;

import java.util.List;

@Builder
public record PlaceSaveRequest(
List<PlaceDetailRequest> requests
) {

@Builder
public record PlaceDetailRequest(
String name,
Address address
) {}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.wayble.server.direction.dto.response;

import com.wayble.server.direction.entity.DirectionDocument;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Builder;

@Builder
@Schema(description = "지도 연관어 자동완성 API")
public record DirectionSearchResponse(
@Schema(description = "장소의 고유 ID", example = "1")
Long placeId,

@Schema(description = "장소의 이름", example = "아임히어")
String name,

@Schema(description = "주소", example = "서울시 용산구 청파동")
String address,

@Schema(description = "위도", example = "37.84512")
Double latitude,

@Schema(description = "경도", example = "127.87451")
Double longitude
) {
public static DirectionSearchResponse from(DirectionDocument directionDocument) {
return DirectionSearchResponse.builder()
.placeId(directionDocument.getId())
.name(directionDocument.getName())
.address(directionDocument.getEsAddress().getStreetAddress())
.latitude(directionDocument.getEsAddress().getLocation().getLat())
.longitude(directionDocument.getEsAddress().getLocation().getLon())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package com.wayble.server.direction.entity;

import com.wayble.server.explore.entity.EsAddress;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.*;

@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Document(indexName = "direction", createIndex = true)
@Setting(settingPath = "/elasticsearch/settings/direction_settings.json")
@Mapping(mappingPath = "/elasticsearch/settings/direction_mappings.json")
public class DirectionDocument {

@Id
@Field(type = FieldType.Long)
private Long id;

@Field(
type = FieldType.Text,
analyzer = "korean_edge_ngram_analyzer",
searchAnalyzer = "korean_search_analyzer"
)
private String name;

@Field(type = FieldType.Object)
private EsAddress esAddress;

@Builder
private DirectionDocument(Long id, String name, EsAddress esAddress) {
this.id = id;
this.name = name;
this.esAddress = esAddress;
}

public static DirectionDocument from(Place place) {
return DirectionDocument.builder()
.id(place.getId())
.name(place.getName())
.esAddress(EsAddress.from(place.getAddress()))
.build();
}
}
38 changes: 38 additions & 0 deletions src/main/java/com/wayble/server/direction/entity/Place.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.wayble.server.direction.entity;

import com.wayble.server.common.entity.Address;
import com.wayble.server.common.entity.BaseEntity;
import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Place extends BaseEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(name = "name")
private String name;

@Embedded
private Address address;

@Builder
public Place(String name, Address address) {
this.name = name;
this.address = address;
}

public static Place of(String name, Address address) {
return Place.builder()
.name(name)
.address(address)
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,10 @@
@RequiredArgsConstructor
public enum DirectionErrorCase implements ErrorCase {

PATH_NOT_FOUND(400, 4001, "해당하는 경로를 찾을 수 없습니다."),
ES_INDEXING_FAILED(500, 4002, "ElasticSearch 인덱싱에 실패했습니다."),
HISTORY_NOT_FOUND(400, 4004, "검색 기록이 없습니다."),
PATH_NOT_FOUND(400, 4001, "해당하는 경로를 찾을 수 없습니다.");
;

private final Integer httpStatusCode;
private final Integer errorCode;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.wayble.server.direction.repository;

import com.wayble.server.direction.dto.request.DirectionSearchRequest;
import com.wayble.server.direction.dto.response.DirectionSearchResponse;

import java.util.List;

public interface DirectionElasticSearchCustomRepository {
List<DirectionSearchResponse> searchDirection(DirectionSearchRequest request);
}
Loading