별도리 Dev Docs
연동 가이드

관측지

관측지 목록 조회, 검색, 즐겨찾기 연동 가이드

엔드포인트 요약

메서드경로설명인증 필요
GET/observationsites관측지 목록 (페이지네이션)
GET/observationsites/{id}관측지 상세 조회
GET/observationsites/name?keyword=관측지 이름 검색
POST/me/saved-sites/toggle즐겨찾기 토글
GET/me/saved-sites저장된 관측지 목록
DELETE/me/saved-sites/{savedSiteId}즐겨찾기 삭제

관측지 목록 조회

GET /observationsites?page={페이지}&size={개수}

기본값: size=20, name 기준 오름차순 정렬.

응답

{
  "content": [
    {
      "id": 1,
      "name": "별마로 천문대",
      "latitude": 37.1978,
      "longitude": 128.4865,
      "averageScore": 4.3
    },
    {
      "id": 2,
      "name": "소백산 천문대",
      "latitude": 36.9397,
      "longitude": 128.4858,
      "averageScore": null
    }
  ],
  "totalElements": 42,
  "totalPages": 3,
  "number": 0,
  "size": 20
}
필드타입설명
idLong관측지 ID
nameString관측지 이름
latitudeDouble위도
longitudeDouble경도
averageScoreDouble?평균 평점 (리뷰 없으면 null)

averageScore는 해당 관측지에 등록된 후기(ReviewPost)의 평균 점수(소수점 1자리)입니다. 리뷰가 없는 관측지는 null로 반환됩니다.


관측지 상세 조회

GET /observationsites/{id}

응답

{
  "success": true,
  "message": "OK",
  "data": {
    "id": 1,
    "name": "별마로 천문대",
    "latitude": 37.1978,
    "longitude": 128.4865,
    "reviewCount": 12,
    "totalLikes": 34,
    "averageScore": 4.3
  }
}
필드타입설명
reviewCountLong후기 게시글 수
totalLikesLong관련 게시글 총 좋아요 수
averageScoreDouble평균 평점 (리뷰 없으면 0.0)

관측지 이름 검색

GET /observationsites/name?keyword={검색어}
  • 2자 이상: FULLTEXT 검색
  • 1자: LIKE fallback

응답

[
  {
    "id": 1,
    "name": "별마로 천문대",
    "latitude": 37.1978,
    "longitude": 128.4865,
    "averageScore": 4.3
  }
]

즐겨찾기 토글

공식 관측지 또는 임의 좌표를 즐겨찾기에 추가/해제합니다.

POST /me/saved-sites/toggle
Authorization: Bearer {accessToken}

공식 관측지 즐겨찾기

{
  "siteId": 1
}

임의 장소 즐겨찾기

{
  "name": "내가 찾은 명당",
  "latitude": 37.1234,
  "longitude": 127.5678
}

응답

{
  "isSaved": true,
  "savedSiteId": 42
}
필드타입설명
isSavedBoolean최종 즐겨찾기 상태 (true: 추가, false: 해제)
savedSiteIdLong?즐겨찾기 항목 ID (추가된 경우에만 반환)

저장된 관측지 목록

GET /me/saved-sites
Authorization: Bearer {accessToken}

응답

[
  {
    "savedSiteId": 42,
    "siteId": 1,
    "name": "별마로 천문대",
    "latitude": 37.1978,
    "longitude": 128.4865,
    "isCustom": false
  },
  {
    "savedSiteId": 43,
    "siteId": null,
    "name": "내가 찾은 명당",
    "latitude": 37.1234,
    "longitude": 127.5678,
    "isCustom": true
  }
]
필드타입설명
savedSiteIdLong즐겨찾기 항목 ID
siteIdLong?공식 관측지 ID (isCustom=true이면 null)
isCustomBoolean임의 저장 여부

API 직접 테스트

모든 관측지 조회

GET
/observationsites

Authorization

bearerAuth
AuthorizationBearer <token>

In: header

Query Parameters

pageable*

Response Body

*/*

curl -X GET "https://byeoldori-server-hbxnfn4woa-du.a.run.app/observationsites?page=0&size=1&sort=string"
{
  "totalElements": 0,
  "totalPages": 0,
  "first": true,
  "last": true,
  "size": 0,
  "content": [
    {
      "id": 0,
      "name": "string",
      "latitude": 0.1,
      "longitude": 0.1,
      "averageScore": 0.1
    }
  ],
  "number": 0,
  "sort": {
    "empty": true,
    "sorted": true,
    "unsorted": true
  },
  "numberOfElements": 0,
  "pageable": {
    "offset": 0,
    "sort": {
      "empty": true,
      "sorted": true,
      "unsorted": true
    },
    "paged": true,
    "pageNumber": 0,
    "pageSize": 0,
    "unpaged": true
  },
  "empty": true
}

관측지 검색

GET
/observationsites/name

Authorization

bearerAuth
AuthorizationBearer <token>

In: header

Query Parameters

keyword*string

Response Body

*/*

curl -X GET "https://byeoldori-server-hbxnfn4woa-du.a.run.app/observationsites/name?keyword=string"
[
  {
    "id": 0,
    "name": "string",
    "latitude": 0.1,
    "longitude": 0.1,
    "averageScore": 0.1
  }
]

관측지 단건 조회(ID)

GET
/observationsites/{id}

Authorization

bearerAuth
AuthorizationBearer <token>

In: header

Path Parameters

id*integer
Formatint64

Response Body

*/*

curl -X GET "https://byeoldori-server-hbxnfn4woa-du.a.run.app/observationsites/0"
{
  "success": true,
  "message": "string",
  "data": {
    "id": 0,
    "name": "string",
    "latitude": 0.1,
    "longitude": 0.1,
    "reviewCount": 0,
    "totalLikes": 0,
    "averageScore": 0.1
  }
}

관측지 등록

POST
/observationsites

Authorization

bearerAuth
AuthorizationBearer <token>

In: header

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

*/*

curl -X POST "https://byeoldori-server-hbxnfn4woa-du.a.run.app/observationsites" \  -H "Content-Type: application/json" \  -d '{    "name": "별마로 천문대",    "latitude": 37.1978774787,    "longitude": 128.4865953418  }'
{
  "success": true,
  "message": "string",
  "data": {
    "id": 0,
    "name": "string",
    "latitude": 0.1,
    "longitude": 0.1,
    "averageScore": 0.1
  }
}

관측지 수정 (ID)

PUT
/observationsites/{id}

Authorization

bearerAuth
AuthorizationBearer <token>

In: header

Path Parameters

id*integer
Formatint64

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

*/*

curl -X PUT "https://byeoldori-server-hbxnfn4woa-du.a.run.app/observationsites/0" \  -H "Content-Type: application/json" \  -d '{    "name": "별마로 천문대",    "latitude": 37.1978774787,    "longitude": 128.4865953418  }'
{
  "success": true,
  "message": "string",
  "data": {
    "id": 0,
    "name": "string",
    "latitude": 0.1,
    "longitude": 0.1,
    "averageScore": 0.1
  }
}

관측지 삭제 (ID)

DELETE
/observationsites/{id}

Authorization

bearerAuth
AuthorizationBearer <token>

In: header

Path Parameters

id*integer
Formatint64

Response Body

*/*

curl -X DELETE "https://byeoldori-server-hbxnfn4woa-du.a.run.app/observationsites/0"
{
  "success": true,
  "message": "string",
  "data": {}
}

저장된 관측지 조회

GET
/me/saved-sites

Authorization

bearerAuth
AuthorizationBearer <token>

In: header

Response Body

*/*

curl -X GET "https://byeoldori-server-hbxnfn4woa-du.a.run.app/me/saved-sites"
[
  {
    "savedSiteId": 0,
    "siteId": 0,
    "name": "string",
    "latitude": 0.1,
    "longitude": 0.1,
    "isCustom": true
  }
]

즐겨찾기 토글

POST
/me/saved-sites/toggle

Authorization

bearerAuth
AuthorizationBearer <token>

In: header

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

*/*

curl -X POST "https://byeoldori-server-hbxnfn4woa-du.a.run.app/me/saved-sites/toggle" \  -H "Content-Type: application/json" \  -d '{}'
{
  "success": true,
  "message": "string",
  "data": {
    "isSaved": true,
    "savedSiteId": 0
  }
}

저장된 관측지 상세 조회

GET
/me/saved-sites/{savedSiteId}

Authorization

bearerAuth
AuthorizationBearer <token>

In: header

Path Parameters

savedSiteId*integer
Formatint64

Response Body

*/*

curl -X GET "https://byeoldori-server-hbxnfn4woa-du.a.run.app/me/saved-sites/0"
{
  "savedSiteId": 0,
  "siteId": 0,
  "name": "string",
  "latitude": 0.1,
  "longitude": 0.1,
  "isCustom": true
}

관측지 즐겨찾기 삭제

DELETE
/me/saved-sites/{savedSiteId}

Authorization

bearerAuth
AuthorizationBearer <token>

In: header

Path Parameters

savedSiteId*integer
Formatint64

Response Body

*/*

curl -X DELETE "https://byeoldori-server-hbxnfn4woa-du.a.run.app/me/saved-sites/0"
{
  "success": true,
  "message": "string",
  "data": {}
}

On this page