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

지도 기능 #455

Merged
merged 35 commits into from
Sep 25, 2023
Merged

지도 기능 #455

merged 35 commits into from
Sep 25, 2023

Conversation

green-kong
Copy link
Collaborator

#️⃣ 연관된 이슈

resolved #451

📝 작업 내용

기존의 카페에 좌표를 추가하는 api를 뚫었습니다.
음 근데, insert문을 다 만들어 버려서, 쓸일이 없을 것 같긴하네요.. 하핳

위에거가 중요한게 아니라,
지도 범위 내에 포함되어있는 카페의 정보들을 반환하는 기능을 만들었습니다.

쿼리 스트링으로 latitude, longitude, latitudeDelta, longitudeDelta 를 받습니다
lat, lng 는 기준 좌표구요.
latDelta, lngDelta는 각각 지도 내 최대 lat(lng) - 기준 lat(lng) 입니다.

델타값들을 미터 단위로 환산하고, 더 작은값을 구합니다(radius)
기준 좌표로부터 radius만큼 원을 만들고(ST_Buffer), 그 안에 포함되어있는 카페들을 반환합니다(ST_Contains)

cafe_coordinates table의 coordinate 쪽에 공간인덱스 걸어뒀구요.
인덱스 걸고 안걸고 속도 차이는 10배정도 나는 듯 하네요.

image
👆 인덱스 X

👇 인덱스 O
image

자세한 내용은 주말 중에 포스팅 하도록 할게요.

아 그리고 그 뭐야.
Production에 넣을 좌표값들은 다 만들어 두었습니다.

💬 리뷰 요구사항

@green-kong green-kong added 카테고리:기능🛠️ 만들어줘잉 BE 개발은 백이징 우선순위:🟡보통 급하진 않지만, 필요한 작업입니다. labels Sep 16, 2023
@green-kong green-kong self-assigned this Sep 16, 2023
@green-kong green-kong closed this Sep 16, 2023
@green-kong green-kong reopened this Sep 16, 2023
Copy link
Collaborator

@nuyh99 nuyh99 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생하셨습니다 폴로!!
저도 간접적으로 공간 인덱스에 대해서 약간 맛볼 수 있었네요ㅋㅋㅋㅋ

코멘트로 제 생각들 간단히 남겨봤습니다. 저는 기존의 카페 엔티티에 추가하는 방식으로 할 것 같은데 따로 분리한 이유가 제일 궁금하네요!

아 그리고 Point 정보를 엔티티로 분리했다면, 추가적으로 어드민 서비스의 제거 메서드에서도 해당 테이블에서 제거하는 기능을 추가해야 할 것 같아요!

@@ -2,7 +2,7 @@ spring.datasource.url=jdbc:mysql://localhost:20000/yozm-cafe?useSSL=false&allowP
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect
spring.jpa.database-platform=org.hibernate.spatial.dialect.mysql.MySQL56InnoDBSpatialDialect
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

테스트 환경으로 적용하려면 application-test에도 적용해야 합니다!

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

spring.jpa.database-platform이 옵션 자체가 없어도 잘 동작하네요! 해당 옵션은 제거 하도록 하겠습니다!

@@ -0,0 +1,10 @@
CREATE TABLE cafe_coordinates
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

현재 자동 생성해버린 available_times를 제외한 나머지 테이블들은 단수형 네이밍을 쓰고 있어서 단수형이 어떨까 싶네요!

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

통일성을 위해서 그게 더 좋을듯 하네요!

@@ -19,6 +19,7 @@ repositories {
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation group: 'org.hibernate', name: 'hibernate-spatial', version: '6.2.5.Final'
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아래의 DB 쪽으로 옮기면 더 좋을 것 같다는 생각입니다!

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

역시 세심하네요 연어!

@@ -12,7 +12,7 @@ public class Images {

private static final int REPRESENTATIVE_INDEX = 0;

@ElementCollection(fetch = FetchType.EAGER)
@ElementCollection(fetch = FetchType.LAZY)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Very Goooooood
디폴트는 LAZY라서 옵션을 빼버려도 좋을 것 같네요

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

감사합니다!

public class PointGenerator {

private static final GeometryFactory GEOMETRY_FACTORY = new GeometryFactory();
private static final int SRID = 4326;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이 부분은 주석을 달아줘도 좋을 것 같군요...!
아무리 클린 코드여도 이 정보는 주석이 있으면 더 알기 쉬울 것 같은 느낌??

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

SRID 에 대한 정보를 말씀 하시는거겠죠?
저도 처음 접해봤고, 보편적으로 생소한 내용이 아니다 보니 이 정도는 주석을 달아두는 것도 나쁘지 않겠네요!


private Point coordinate;

@OneToOne(fetch = FetchType.LAZY)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@OneToOne 관계에서의 지연 로딩 옵션이 안 먹힐 때가 있는 걸로 아는데 이때는 되는 건가요??

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

연어 의견에 덧붙이자면 @OnetoOne은 양방향일때만 안먹는 거로 아는데 단방향으로 LAZY 처리 해야될 것 같네요

Copy link
Collaborator Author

@green-kong green-kong Sep 20, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저는 @OneToOne처음 써봐서, 이번에 지도기능 구현하면서 구글링 하다가 연어가 얘기한 내용을 접했는데요.
조금 더 덧붙이자면, 양방향 관계일때, 연관관계의 주인이 아닌 경우 LAZY가 안먹는 다고 하네요!

Cafe <-> CafeCoordinates(필드에 Cafe 갖고있음)
이 경우에 Cafe쪽에서는 LAZY 를 걸어둬도 안먹는 경우가 있다하네요.
nullable을 통해 해결할 수 있다 정도의 내용만 기억나지 더 자세한 해결방법에 대해선 기억이 나질 않네요ㅠ

현재 코드는 단방향 매핑관계라 LAZY 잘 먹습니당 ㅎㅎ

Comment on lines 26 to 30
@RequestParam("latitude") final double latitude,
@RequestParam("longitude") final double longitude,
@RequestParam("latitudeDelta") final double latitudeDelta,
@RequestParam("longitudeDelta") final double longitudeDelta) {
final List<CafeLocationResponse> cafesFromLocations = locationService.findCafesFromLocations(
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

암시적 @ModelAttribute 기반의 DTO를 써도 좋을 것 같네요!

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

dto 환영

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

반영하겠습니다!

import jakarta.persistence.OneToOne;

@Entity(name = "cafe_coordinates")
public class CafeCoordinate {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

하나의 엔티티로 만든 이유가 궁금합니다!
카페의 위치 같은 경우는 비즈니스적으로 분리된다고 생각하셔서 만드신 걸까요??

제 생각으로는 카페의 전화번호나 주소 등의 추가 정보와 Coordinate는 동일한 변경 주기를 가지고 있는 것 같아요.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저도 연어 의견에 동의합니다!

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아 이 부분.. 저도 많이 고민했었는데요.

연어의 말대로 비즈니스적으로 분리가 된다고 생각했습니다.
현재의 비즈니스에서는 단순히 지도검색용으로 사용되는 데이터기에 카페의 메인데이터와는 분리를 하고싶었습니다.

다른 부분은 모르겠지만, 카페의 주소와는 동일한 변경 주기를 갖고있다는 말에는 백프로 동의합니다.
주소가 바뀌면 좌표도 당연히 바뀌게 되니까요.
하지만 가게의 이전이라는게 그렇게 많이 일어나는 일이 아니다보니,(폐업이면 몰라도..)
이 부분 만큼은 비즈니스적으로 데이터를 분리하는 게 낫지 않을까 라는 생각을 했습니다.

만약 이 부분이 다른 비즈니스로직에도 사용되어야 하는 경우에는
Location table로 주소와 좌표를 분리하는게 낫지 않을까.. 라는 생각을 했었습니다

double metersLatitude = latitudeDelta * METER_PER_DEGREE;
double metersLongitude = Math.cos(radianLatitude) * longitudeDelta * METER_PER_DEGREE;

return Math.min(metersLatitude, metersLongitude);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

위도 차이(미터), 경도 차이(미터) 중 작은 것을 리턴하는 메서드인가요?
어떤 의미인지 비즈니스 설명을 조금만 해주실 수 있나요ㅠㅠ?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오우.. 제가 설명이 부족했나 봅니다 ㅠㅠ
연어의 말대로 (지도 내의 최대 위도 - 지도 중심의 위도) 와 (지도내의 최대 경도 - 지도 중심의 경도)를 각각 미터로 환산합니다.
그 중 작은값을 반지름으로 갖는 원을 만들어 원 내에 있는 카페의 정보만 반환하도록 하였습니다.
image
이 그림을 보시면 조금이나마 더 이해에 도움이 되실까요?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

그림에서 가장 오른쪽이 최대 위도,
가장 위쪽이 최대 경도 입니다.
회색선이 겹치는 지점이 지도의 중앙이구요.

혹시나 설명이 부족하다면 말씀해주세요

@@ -0,0 +1,13 @@
package com.project.yozmcafe.domain.cafe.coordinate.dto;

public interface CafePinDto {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Projection으로 매핑을 해주는 것이군요!

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

신기하네요 ...

Copy link
Collaborator

@hum02 hum02 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생했어요 폴로!
공간 검색 생각할 것도 많고 기술적으로도 어려운 기능이네요...
잘 구현해주셨다고 느낍니다

ON co.cafe_id = c.id
WHERE ST_CONTAINS(ST_Buffer(ST_GeomFromText(:point, 4326), :radius), co.coordinate);
""")
List<CafePinDto> findCafePinsFromCoordinate(@Param("point") final String point,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

엄청난 쿼리네요..
반환값인 CafePinDto는 인터페이스 프로젝션이군요!
전 이렇게 해본적이 없어서... 사용했을 때 느낀 장점이 있나요?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

음 우선 필요한 값만 가져 올 수 있다는게 가장 큰 장점이었어요!
또한 hinernate가 관계 매핑을 고려하지 않아도 돼서 처리속도도 빠르구요.

최근에 봤던 포스팅 중에 리포지토리에서 반환하는 값을 모두 dto로 변경했더니 서비스 속도가 빨라졌다는 글을 본적이 있습니다.
정말 단순 조회작업(조회 이후 조회된 값을 바로 응답) 하는 경우라면 이런식으로 dto를 리턴하는 것도 좋을것 같다는 생각이에요!

@RequestParam("latitude") final double latitude,
@RequestParam("longitude") final double longitude,
@RequestParam("latitudeDelta") final double latitudeDelta,
@RequestParam("longitudeDelta") final double longitudeDelta) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이 파라미터가 위도,경도 차이를 나타내어 이걸로 탐색 범위를 정하는 듯해요!
그런데 api에서 이런 파라미터로 범위를 정해주는 게 더 편한가요? 그냥 범위 반지름을 주면 될 것 같은데... 지도 범위에서 잘리는 경우도 있기 때문인가요?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저도 비슷한 의견인데, 결국 반지름을 알기 위한 latitudeDelta, longitudeDelta 인데 처음부터 반지름, 지름을 받아서 처리하면 안되나요 ?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

대면으로 답변 드렸기에 따로 코멘트 남기지 않을게요~

return new CafeLocationResponse(
cafePinDto.getId(),
cafePinDto.getName(),
cafePinDto.getName(),
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

헉 address대신 name이 들어간 것 같아요!

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

사랑해요 도치

final String cafeId4 = saveCafe("도치카페", "서울역");
final String cafeId5 = saveCafe("연어카페", "부산");
final String cafeId6 = saveCafe("고니카페", "강동");
final String cafeId7 = saveCafe("아인카페", "아르헨티나");
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아인은 아르헨티나 사람

final double latitudeDelta,
final double longitudeDelta) {
final String point = PointGenerator.generateStringPoint(latitude, longitude);
final double radius = RadiusCalculator.calculate(latitude, latitudeDelta, longitudeDelta);
Copy link
Collaborator

@hum02 hum02 Sep 18, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PointGenerator나 RadiusCalculator가 도메인이라기 보다는 util클래스 같은 느낌이 들었어요
그래서 보니 CafeCoordinate 도메인에서 이 작업을 해줄 수 있지 않을까요? (필수는 아닙니다)
generateStringPoint()메서드의 작업도 Point가 상속받은 Geometry의 toText()로 해줄 수 있는 것 같더라고요!

Copy link
Collaborator Author

@green-kong green-kong Sep 20, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PointGenerator나 RadiusCalculator가 도메인이라기 보다는 util클래스 같은 느낌이 들었어요
그래서 보니 CafeCoordinate 도메인에서 이 작업을 해줄 수 있지 않을까요?

private static final GeometryFactory GEOMETRY_FACTORY = new GeometryFactory();

Point를 생성할 때 저 GeometryFactory가 사용되는데요.
매번 인스턴스를 생성하기가 싫어서 PointFactory에 static으로 넣어놨습니다.

또한 여기서 받는 위도와 경도는 카페의 위도와 경도가 아닌 지도 중심점의 위도와 경도입니다.
그렇기 때문에 저 위도와 경도를 이용해서 CafeCoordinate를 만드는 것 자체가, 저 도메인 객체의 역할에 부합하지 않다고 생각해요.
그래서 그저 좌표의 정보만 있는 Point를 사용했습니다.
radius를 계산하는 로직 또한 카페의 좌표와는 맥락이 일치하지 않는다고 생각해요.

전반적으로 제 설명이 부족했던 것 같아요 ㅠ 죄송합니다 ㅠㅠㅠ

generateStringPoint()메서드의 작업도 Point가 상속받은 Geometry의 toText()로 해줄 수 있는 것 같더라고요!

감사합니다 감사합니다 감사합니다. PointGenerator에서 포인트를 파싱하는 내용은 삭제해도 되겠네요!
아앗.. 이게 안되네요...
MySql에서의 포인트 함수는 파라미터를 POINT(위도, 경도) 요렇게 받는데요.
Point에서 toText를 하게 되면 POINT (경도, 위도) 로 생성해주네요...
Point 타입은 위도 경도만을 위한 데이터가 아니라 그렇습니다. 필드 변수 도 x, y 로 선언 되어있는데요.
이게 SRID 값에 따라 x, y 가 의미하는 값이 달라져서 그렇습니다.
그래서 point.toText() 반환 값이 정확하게는 POINT (x y)로 나오는 듯 하네요.

이렇게 해놓고 보니,
결국 generateStringPoint() 가 뭔가 DB에 의존적인 메서드가 되버린 느낌인데요.
나중에 네이티브 쿼리를 쿼리DSL로 변경하면서, 수정하는 게 좋을것 같습니다..

Copy link
Collaborator

@donghae-kim donghae-kim left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생하셨어요 폴로~

이미 연어 도치가 의견을 잘 내주어서 그거에 좀 더 달아봤습니다!

다만 Calculator쪽이 조~금 설명이 더 있으면 좋을 것 같아요 !

import jakarta.persistence.OneToOne;

@Entity(name = "cafe_coordinates")
public class CafeCoordinate {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저도 연어 의견에 동의합니다!


private Point coordinate;

@OneToOne(fetch = FetchType.LAZY)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

연어 의견에 덧붙이자면 @OnetoOne은 양방향일때만 안먹는 거로 아는데 단방향으로 LAZY 처리 해야될 것 같네요

@RequestParam("latitude") final double latitude,
@RequestParam("longitude") final double longitude,
@RequestParam("latitudeDelta") final double latitudeDelta,
@RequestParam("longitudeDelta") final double longitudeDelta) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저도 비슷한 의견인데, 결국 반지름을 알기 위한 latitudeDelta, longitudeDelta 인데 처음부터 반지름, 지름을 받아서 처리하면 안되나요 ?

package com.project.yozmcafe.domain.cafe.coordinate;

public class RadiusCalculator {
private static final int METER_PER_DEGREE = 111_000;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이거는 경도위도를 미터로 변환하기 위한 상수인 것 같은데 혹시 왜 111인가요 ? (단순궁금증 수학적인 문제인지 ..?)

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1도 당 거리가 약 111KM 라고 합니다! 저도 처음 알았어요 ㅋㅋ

double radianLatitude = Math.toRadians(latitude);

double metersLatitude = latitudeDelta * METER_PER_DEGREE;
double metersLongitude = Math.cos(radianLatitude) * longitudeDelta * METER_PER_DEGREE;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

두 지점의 위도 차이와 경도 차이(longitudeDifference)를 계산 -> 위도 차이를 미터 단위로 변환하기 위해 latitudeDifference에 대해 METER_PER_DEGREE 곱함 -> 경도 차이를 미터 단위로 변환하기 위해 longitudeDifference에 대해 * cos(평균 위도)를 곱한다.

어렵네요

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

위도는 1도 당 거리가 111KM로 동일합니다.

그러나 경도의 경우는
영국의 그리니치 천문대를 중심으로 동경180도 서경 180도 이렇게 표현하니까 결국 360등분하여
하나의 조각을 1도로 사용하죠.

그런데, 한 조각의 거리는 가장 중앙 부분(지구에서 적도해당 )에서 가장 넓고 아래, 위로 갈수록 좁아 지는데요
즉, 같은 경도 사이의 거리는 위도가 커짐(0~90도)에 따라서 점점 좁아지죠.
그렇기 때문에 중심 경도로부터 지도내 최대경도까지의 거리를 계산하기위해서는 위도의 각도에 코사인을 곱하는 계산이 들어가야 한다고 하네요.

사실 저도 이해못했습니다. 그렇다길래 아하 그렇구나 하고 했습니다...

Comment on lines 26 to 30
@RequestParam("latitude") final double latitude,
@RequestParam("longitude") final double longitude,
@RequestParam("latitudeDelta") final double latitudeDelta,
@RequestParam("longitudeDelta") final double longitudeDelta) {
final List<CafeLocationResponse> cafesFromLocations = locationService.findCafesFromLocations(
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

dto 환영

@green-kong
Copy link
Collaborator Author

리뷰 내용 모두 반영하였습니다.

서비스 로직 변경 사항

기존에는 기준점과 델타값들을 통해 원을 그리고 원 내부에 포함되는 카페들만 반환했었는데요.
image

이렇게 되면, 반환되는 카페데이터가 화면에 표시된 지도를 모두 커버하지 못합니다.
사용자는 아무래도 지도 전체에 대한 결과를 바랄 것 같아 로직을 변경하게되었습니다.

기준점과 델타값을 이용하는 것은 동일합니다.
다만 이값들을 통해 화면에 보이는 지도의 네 꼭지점들의 좌표를 구합니다.
그리고 이 값들을 통해 POLYGON WKT 를 생성합니다.

첫번째 꼭지점이 마지막에 다시한번 들어가야 폴리곤이 정상적으로 생성됩니다.

POLYGON_STRING_FORMAT 에 보면 소괄호(, ) 가 두개씩 들어가는데요.
이는 오타가 아니라 이게 문법입니다;;
POLYGON WKT는 두개의 인자를 받는데요. 첫번째는 외부의 폴리곤 좌표들, 두번째는 내부의 폴리곤 좌표들입니다.
🍩중앙에 구멍이 뚫린 도넛 형태를 생각하시면 이해가 되실겁니다.

@green-kong
Copy link
Collaborator Author

아 로직 변경하면서 쿼리도 조금 변경됐는데요.
실행 계획 확인결과 인덱스는 잘탑니다~

image

Copy link
Collaborator

@hum02 hum02 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

좋아요~~

@@ -0,0 +1,4 @@
package com.project.yozmcafe.controller.dto.cafe;

public record CafeLocationRequest(double latitude, double longitude, double latitudeDelta, double longitudeDelta) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

파라미터 dto 굿~~

final String firstVertex = String.join(STRING_GEOMETRY_DELIMITER, minLatitude, maxLongitude);
final String secondVertex = String.join(STRING_GEOMETRY_DELIMITER, maxLatitude, maxLongitude);
final String thirdVertex = String.join(STRING_GEOMETRY_DELIMITER, maxLatitude, minLongitude);
final String fourthVertex = String.join(STRING_GEOMETRY_DELIMITER, minLatitude, minLongitude);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

원 대신 새로 생긴 사각형 좌표들이군요! 좋아용

@@ -0,0 +1,17 @@
package com.project.yozmcafe.domain.cafe.coordinate;

public class RadiusCalculator {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

정책이 원이 아닌 사각형 내 카페탐색으로 바뀌어서 이 RadiusCalculator클래스와 관련 테스트는 삭제되어도 될 것 같아요! 남겨둔 이유가 있나요?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오 지우는거 깜빡했네요! 감사합니다!

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

바로 반영했습니다~ 굿굿

@@ -2,7 +2,6 @@ spring.datasource.url=jdbc:mysql://localhost:20000/yozm-cafe?useSSL=false&allowP
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

꼼꼼하시군요! 감사합니다

Copy link
Collaborator

@donghae-kim donghae-kim left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생하셨어요 폴로!

ON co.cafe_id = c.id
WHERE ST_CONTAINS(ST_GeomFromText(:area, 4326), co.coordinate);
""")
List<CafePinDto> findCafePinsFromCoordinate(@Param("area") final String area);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

string으로 범위를 주면 그거에 맞춰서 조회 하나보네요 ㄷㄷ 신기방기

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

정확하게는 Polygon wktST_GeomFromText() 의 인자로 넘기면 텍스트를 Polygon데이터로 변환해 줍니다.
그리고 변환된 polygon을 ST_cotains의 첫번째 인자로 넘겨줍니다~


@Embeddable
public class Images {

private static final int REPRESENTATIVE_INDEX = 0;

@ElementCollection(fetch = FetchType.LAZY)
@ElementCollection
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

@@ -0,0 +1,13 @@
package com.project.yozmcafe.domain.cafe.coordinate.dto;

public interface CafePinDto {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

신기하네요 ...

Copy link
Collaborator

@nuyh99 nuyh99 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

원에서 직사각형이 됐군요 고생하셨습니다!
간단한 코멘트만 남겼습니다!!

import jakarta.persistence.Id;
import jakarta.persistence.OneToOne;

@Entity(name = "cafe_coordinate")
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

name 옵션 없애도 될 것 같습니다!

@OneToOne(fetch = FetchType.LAZY)
private Cafe cafe;

public CafeCoordinate() {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

접근제어자 protected로 바꿔도 좋을 것 같아용

@@ -25,6 +25,7 @@ dependencies {
runtimeOnly 'com.mysql:mysql-connector-j'
testImplementation "org.testcontainers:junit-jupiter:1.19.0"
testImplementation 'org.testcontainers:mysql'
implementation group: 'org.hibernate', name: 'hibernate-spatial', version: '6.2.5.Final'
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

    implementation 'org.hibernate:hibernate-spatial:6.2.5.Final'

다른 것들과 마찬가지로 이 문법을 사용하면 좋을 것 같아요!

@green-kong green-kong merged commit c2d288b into dev Sep 25, 2023
1 check passed
@green-kong green-kong deleted the feat/451-map branch September 25, 2023 06:03
@green-kong green-kong restored the feat/451-map branch September 25, 2023 12:12
@green-kong green-kong deleted the feat/451-map branch September 25, 2023 12:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
BE 개발은 백이징 우선순위:🟡보통 급하진 않지만, 필요한 작업입니다. 카테고리:기능🛠️ 만들어줘잉
Projects
Status: Done
Development

Successfully merging this pull request may close these issues.

4 participants